반응형

C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 210

Part 1-4-5. 객체지향 : new, 다형성 (virtual, override, sealed), 문자열

new class Player { public int hp; public int attack; public void Move() { Console.Write("Player Move"); } } class Knight : Player { public new void Move() { Console.Write("Kight Move"); } } Knight knight = new Knight(); knight.Move(); // 출력 // Kight Move 부모 클래스로부터 상속 받은 함수와 이름은 동일하지만 이와 상관없는 완전히 다른 새로운 함수로서 재정의하고 싶다면 new키워드를 사용하면 된다. 상속 받은 함수와 동일한 이름이긴 하지만 새로운 함수를 만드는 것을 의미한다. Player의 Move()와 Kn..

★ Part 1-4-4. 객체지향 : 클래스 형변환 (is, as)

클래스 형식 변환 [부모 자식간 형식 변환] Knight knight = new Knight(); knight 스택 메모리는 new Knight()로 생성한 힙 메모리 객체의 주소를 담는다. // 부모 👉 Plyaer // 자식 👉 Knight, Maze class Player { public int hp; public int attack; } class Knight : Player { public void Move() { Console.Write("Kight Move"); } public void Attack() { Console.Write("Kight Attack"); } } class Mage : Player { public void Move() { Console.Write("Maze Move");..

Part 1-4-3. 객체지향 : 상속성, 은닉성

상속성 [코드의 재사용성] 부모 클래스 👉 Player 직업에 상관없이 플레이어라면 모두 가지고 잇는 공통된 속성과 기능을 부모클래스로 묶는다. 자식 클래스 👉 Mage, Aracher, Knight 이 클래스들은 Player를 상속받으므로 플레이어라면 모두 갖고 있는 공통 멤버들을 다시 필드에 명시해줄 필요가 없다. 이런 부분들은 Player 상속으로 해결하고 법사, 궁수, 전사들만의!!! 고유의 속성과 기능을 추가해주면 되는 식이다. 자식 클래스에서 멤버 필드에 직접 명시해주지 않더라도 상속만 하면 자동으로 부모의 멤버들도 가질 수 있다. [부모 생성자가 먼저 호출 된다.] 당연히 생성자도 함수이므로 부모 생성자를 자식 클래스에서 상속을 받고, 언제나 부모 생성자를 먼저 호출한다. 개발자가 명시하지 ..

Part 1-4-2. 객체지향 : 생성자, static

생성자 객체를 new로 생성함과 동시에 멤버 값들을 원하는대로 초기화하고 싶을 때 생성자를 사용한다. 클래스 이름과 같아야 함 접근 지정자 ⭕, 리턴타입, 매개변수 ❌ public Knight() { hp = 100; attack = 10; } public Knight(int hp) : this() { this.hp = hp; } 생성자 이름 옆에 : this() 👉 ‘디폴트 생성자 호출해줘’ 라는 의미 따라서 this.hp = hp를 실행하기 전에 Knight()를 호출하여 hp = 100와 attack = 10 를 먼저 실행하게 된다. 따라서 자연스럽게 Knight(int hp) 생성자에서 hp 값만 설정헀어도 attack은 10 으로 설정이 미리 된다. static [static이 아닌 일반 멤버들..

Part 1-4-1. 객체지향 : 객체 지향, 복사와 참조, 스택과 힙

객체 지향 [절차 지향 👉 전부 함수로 코드를 짠다.] 유지 보수가 힘들다. 프로그램 규모가 커지면 복잡해진다. 함수 호출 순서에 종속적이기 때문에 유지 보수가 힘들다. 호출 순서 타고타고 올라가 보며 코드를 읽어보아야 해서 불편하다. 함수를 계속 새로 만들고 만들고 해야해서 복잡하다. 같은 Fight 이라도 플레이어 vs 플레이어, 보스 vs 플레이어 등등 많은 버전이 있어야 하므로 오버로딩을 많이 해야 해서 복잡해진다. [객체 지향 👉 모든 것을 객체 위주로 생각한다.] 속성(멤버 변수)와 기능(멤버 함수)로 나뉜다. ‘플레이어’의 이름, 공격력, HP, 직업 같은 속성들과 Fight 같은 기능을 추상화 하여 Player라는 이름의 클래스로 묶는다. 이 클래스(붕어빵틀, 설계도)를 가지고 세상에 존재..

Part 1-3-1. TextRPG : 디버깅 기초, 직업, 플레이어/몬스터 생성, 전투

디버깅 프로그램 실행 및 디버깅시 중단점이 찍힌 코드 ‘줄’에서 멈추게 해준다. 멈춘 줄로부터 코드 한줄 한줄씩 실행해보는게 가능하다. 개발 단계에선 괜찮지만 현재 서비스 되고 있는 프로그램에선 브레이크 포인트를 사용하는 디버깅은 할 수 없다. → 자동차 출시 및 출고 후에는 실시간으로 자동차 내부를 살펴볼 수 없는 것과 비슷. 개발 단계는 디버그 모드로 실행하고 중단점은 이때만 사용 가능하다. 프로그램을 출시할 때는 Release 모드로 빌드를 해서 실행하게 된다. 이미 출시한 프로그램은 중단점을 사용하여 한 줄 한 줄 실행하면서 실시간으로 살펴볼 수는 없다. 중단점을 한번 더 클릭하여 없앨 수도 있지만 중단점 해제를 직접 여기서 선택하면 중단점이 노란색으로 바뀐다. 중단점으로서 역할을 더 이상 하지 ..

★ Part 1-2-2. 코드의 흐름 제어 : 함수, ref, out

함수 함수는 다양한 언어에서 크게 함수, 메서드, 프로시저로 불린다. 하지만 게임 개발자는 주로 함수라고 부른다. 함수는 class 내부에 생성해야 하며, 함수의 형식은 다음과 같다. // 함수(=Method,메서드) 한정자 반환형식 이름(매개변수목록) static void HelloWorld() { Console.Write.Line("Hello World"); } static void Main(string[] args) { HelloWorld(); } static은 나중에 class를 설명할 떄 설명할 예정이며, 이름은 함수의 이름을 작성하는 것과 같다. 매개 변수로 넘겨줄 정보가 없으면 아무것도 작성하지 않고, 또 반환 형식으로 함수를 사용 한 이후에 아무런 값을 돌려주지 않는다면 void 키워드를 ..

Part 1-2-1. 코드의 흐름 제어 : if와 else, switch, 상수와 열거형, while, for, break, continue

if와 else int hp = 100; bool isDead = (hp 0) { Console.WriteLive("Hello World"); count--; } for (int i = 0; i < 5; i++) { } while 문에서 사용했던 count를 i로 변경해서 0의 값을 주면 그것이 초기식이 되고, 5번 반복을 지정해야 하는 count--는 i가 0에서 5까지 반복하라는 i < 5로 대체될 수 있다. 마지막으로 값을 감소시키는 것이 아닌 증가시키는 연산자인 후위 연산자를 통해 for문을 while문 처럼 사용할 수 있다. for 문을 처음 사용할 때에는 많이 헷갈릴 수 있으므로, 자주 사용해서 익히는 것이 매우 중요하다. break, continue for 문을 사용하다보면 우리는 특정 상황..

Part 1-1-2. 데이터 : 형변환, 스트링 포맷, 산술 연산, 비교 연산, 논리 연산

캐스팅(=형변환) [바구니 크기가 다른 경우] int a = 1000; long l = a; // 가능 8 byte 바구니인 long 자료형에서 4 byte 바구니인 int 자료형을 넣는 것은 데이터가 손실 될 일이 없으므로 데이터를 옮기는 것이 가능하다. 즉. 큰 바구니에서 작은 바구니로 물건을 넣는 것은 문제가 없다. int a = 1000; short s1 = a // ❌ 에러 short s2 = (short)a; // 넣을래! 4 byte 바구니인 int 자료형 a에서 2 byte 바구니인 s1에 데이터를 담으려고 하니 에러가 발생한다. 왜냐하면 작은 바구니에 큰 물건을 넣으려고 하기 때문이다. 그래서 아래와 같이 강제적으로 형변환을 해주면 문제가 발생하지 않는다. 단, 데이터를 옮겨 담을 때 데..

Part 1-1-1. 데이터 : 데이터 형식, 변수, 정수 형식, 2진수, 10진수, 16진수, 정수 범위

데이터 형식 [주석] 주석 : //와 /* ~ */ 형식으로 사용한다. 프로그램 자체에는 어떠한 영향도 주지 않고 메모를 남기는 것 그렇다면 우리는 주석을 왜? 사용해야 할까? > 이는 메모를 남기거나, 다른 프로그래머와 소통, 혹은 먼 미래에 내가 다시금 볼 때 기억하기 위해 등 주석을 사용한다. [데이터의 대표적인 형태] int, float, string, bool이 대표적이다. 각각의 데이터들은 정수형(int = -1, 0, 1, 2, 3, 4 등), 실수형(float = 3.14), 문자형(string = "Rookiss"), 불리언(bool = true/false(참/거짓)) 으로 나타낸다. 예를 들어 체력, 마력, 스탯정보, 퀘스트 정보, 경험치, 자동 사냥 여부 등 여러 게임 요소들의 데이터..

반응형