객체 지향 언어 (Object Oriented Programming language : OOP )
C#(씨샵)은 객체 지향 언어다.
즉, 프로그램을 짤 때 객체(Object ;오브젝트)를 만들고 사용하는 방향으로 코딩하겠다는 뜻이다.
그럼 객체는 무엇인가?
객체는 추상적인 개념이다.
쉽게 말하면 '생각으로 떠올려서 만들 수 있는 모든 것'이다.
머리 속 생각으로는 무엇이든 상상할 수 있듯이, 형태가 있는 사물(책, 구름)이든, 형태가 없는 개념(사랑, 행복)이든 무엇이든 객체가 될 수 있다.
그래서 객체를 만드는 이런 과정을 Abstraction( 추상적 개념 또는 추상화)라고 한다.
이 abstraction이라는 개념이 객체지향 언어의 출발점이자 원칙이다.
예를 들어 지금 롤플레잉 게임을 만들고 있다고 하자.
주인공이 필요할 것이다.
주인공을 머리 속에 떠올려 보자.
그리고 상상으로 이미지를 만들어 보자.
주인공의 특성(속성)을 설명하려면 어떤 것들이 있는가?
이름
나이
성별
능력
무기
등
주인공의 행동(행위)은 어떤 것들이 있는가?
걷다
먹다
말하다
발휘하다
사용하다
등
지금까지 '주인공'을 추상화 했다.
그 결과 주인공의 속성과 행동을 뽑아내어 정리할 수 있다.
Class (클래스)
위와 같이 어떤 개념을 추상화하여 속성과 행동을 그룹핑(모음)한 것을 Class(클래스)라고 한다.
즉, 주인공이라는 Class를 만든 것이다.
이것을 코딩에서는 '클래스 정의(definition)'라고 한다.
이렇게 만든 주인공 클래스로 남,녀 주인공 캐릭터를 하나씩 만들었다고 하자.
이렇게 만든 '톰' , '메리'가 바로 객체(Object)이다.
즉, 객체는 클래스를 이용하여 만든 새로운 창조물이다.
그러므로 클래스는 객체를 만들 수 있는 설계도라고 할 수 있다.
이전의 코틀린 언어에서는 클래스와 객체를 빵 만드는 틀과 빵으로 비유했었다.
클래스를 이용하여 객체를 만들면 어떤 점이 좋을까?
- 코드의 중복을 줄이고 객체를 간편하게 만들 수 있다.
- 만든 객체는 다시 사용할 수 있다.
- 객체를 수정하기 쉽다.
멤버(Member)
클래스의 속성과 행동을 코딩에서는 필드와 메서드라고 한다.
속성==필드(Field)
행동==메서드(Method)
필드와 메서드를 클래스의 멤버라고 부른다.
클래스 정의
위에서 만든 주인공 클래스를 코드로 작성하면 다음과 같다.
VSCode(비주얼 스튜디오 코드) 편집기를 실행하고 연습할 폴더를 만든다.
File메뉴에 있는 Add Folder to Workspace (작업공간에 폴더 추가)를 클릭한다.
새폴더를 클릭한 후 폴더명을 unity example (유니티 예제)이라고 바꾸고 Add버튼을 클릭한다.
unity example이라는 작업공간이 생긴다.
새 스크립트를 만들기 위해 unity example 줄에서 마우스 오른쪽 버튼을 클릭한 후 New File을 클릭한다.
파일명을 ClassExample.cs 라고 입력한 후 엔터키를 치면 코드를 작성할 준비가 되었다.
먼저 아래와 같은 코드를 작성한다.
1번줄은 유니티 엔진을 사용한다는 뜻이고
3번줄은 ClassExample 이라는 클래스는 public (공개하여 접근 가능)으로 설정한다는 뜻이다.
콜론(:) MonoBehaviour은 MonoBehaviour 라는 클래스를 상속받는다는 뜻이다.
MonoBehaviour은 클래스 이름인데 유니티의 기본 클래스이다.
유니티 사용에 기본이 되는 멤버(필드와 메서드)가 정의되어 있다.
유니티에서 스크립트를 만들면 MonoBehaviour 클래스를 자동으로 상속받는다.
상속에 대한 개념은 이후 글 (상속 inheritance)에서 설명하기로 한다.
이제 앞에서 추상화한 주인공을 클래스로 코딩하면 다음과 같다.
8번줄
클래스를 정의할 때는 class 다음에 클래스명을 적는다.
여기서는 클래스 이름을 MainCharacter (메인 캐릭터; 주인공)이라고 적었다.
그리고 9번과 26번 중괄호 안에 멤버를 정의한다.
10번~12번줄
필드 3개를 정의했다.
이름, 나이, 능력
필드는 변수를 선언하는 방법으로 정의한다.
만약 각 필드의 초기값을 넣고 싶으면 다음과 같이 입력한다.
public string name = "Hero";
public int age = 30;
public string ability = "Force";
위와 같이 클래스에서 초기화 했을 경우는 객체가 생성된 후 해당 필드 값을 입력하지 않으면 이 값으로 초기화된다.
14번~17번줄
첫번째 Method(메서드)로 Eat( )을 정의했다.
public void Eat( )
메서드를 정의하는 형태는 다음과 같다.
접근제한자 반환타입 메서드명(매개변수)
{
// 여기에 실행 코드 작성
}
public은 접근 제한자라고 하며 '공개하여 접근 가능하다'는 것을 선언한 것이다.
void는 실행코드에서 결과로 나온 '값을 반환(되돌려 줌)하지 않는다'는 뜻이다.
*void : 빈 공간
void이므로 메서드명 Eat 뒤에 괄호( )도 비어있다.
18, 22번줄에도 메서드를 정의했다.
Method(메서드)
메서드는 함수라고도 부른다.
메서드(함수)는 어떤 기능(행동)을 실행할 수 있는 코드의 모음이다.
MethodExample 클래스에 SquareNumber( ) 메서드를 만들었다고 하자.
이 메서드의 반환 타입은 int(정수)이고 메서드 이름은 SquareNumber(제곱 수)이다.
괄호 안의 number(수)는 매개변수(parameter)라고 한다. 타입은 int이다.
매개변수는 밖에서 입력값을 받거나 안이나 밖으로 전달할 때 사용하는 변수이다.
이 메서드를 실행하면 7번줄에서 number(여기서는 매개변수)를 서로 곱한다.
return (반환문)은 메서드 실행을 완료한 후에 결과값이 있으면 되돌려 주고 실행을 종료한다는 선언이다.
반환값이 없는 void 타입의 메서드는 return을 생략할 수 있다.
예를 들어 number가 2라면 2*2의 결과값이 4를 SquareNumber 메서드가 반환 받아서 매개변수에 저장한다.
이제 유니티를 시작하면 제일 먼저 실행하는 메서드인 Start( )메서드에서 SquareNumber메서드에 어떤 값을 전달하여 그 결과(result)를 얻어 본다.
8번줄:
결과를 받아서 저장할 result라는 int타입의 변수를 만든다.
SquareNumber메서드에 2를 전달한다.
(그러면 SquareNumber메서드는 전달받은 수를 매개변수로 받아서 실행 코드로 결과를 만들고 다시 매개변수로 되돌려(return) 주고 그 값은 변수result에 저장될 것이다.)
9번줄:
Debug.Log( )메서드를 사용하여 result에 저장된 값을 출력 한다.
Debug.Log( )메서드는 전달받은 변수 값을 유니티의 콘솔(Console)창에 출력하는 기능을 가진 메서드이다.
앞에서 정수를 제곱하는 메서드는 만들었으므로 그 메서드에 2를 전달하여 계산하게 한다.
이 처럼 다른 메서드를 실행시키는 것을 코딩에서는 '호출(call)' 이라고 부른다.
메서드를 호출할 때는 메서드명을 적고 괄호 안에 전달할 값을 넣으면 된다.
이 전달할 값을 '인수(argument)'라고 부른다.
위 코드에서 인수는 2이다.
매개변수가 여러 개인 메서드
위 코드에서 Start( ) 메서드는 반환값도 없고(void) 매개변수도 없는 메서드이다.
메서드에서 매개변수가 없으면 괄호는 비워둔다.
매개변수는 필요에 따라 여러 개 만들 수 있다.
각 매개변수는 콤마( , )로 구분한다.
19번 줄에 만든 메서드는 AddTwoNumbers (두 수를 더하다) 라는 메서드이다.
두 수가 필요하므로 매개변수도 2개 필요하다.
실행 코드는 두 매개변수를 더하여 값을 반환한다.
AddTwoNumbers 메서드는 반환값을 받아서 resultAdd변수에 저장한다.
지금까지 MainCharacter라는 클래스를 정의하고 클래스를 구성하는 필드(Field)와 메서드(Method)를 만들었다.
다음 글에서 이렇게 만든 클래스를 바탕으로 실제로 활용할 객체(오브젝트)를 만드는 과정을 알아본다.
끝.
Wraven...
'취미로 하는 게임코딩_gameCodingAsHobby > 유니티unity로 게임 만들기' 카테고리의 다른 글
유니티16_C#_09_캡슐화 (0) | 2021.02.18 |
---|---|
유니티15_C#_08_객체 (0) | 2021.02.17 |
유니티13_게임 제작 과정_03_미사일 발사 (0) | 2021.02.15 |
유니티12_게임 제작 과정_02_Ship Control (0) | 2021.02.10 |
유니티11_게임 제작 과정01_플레이어 만들기 (0) | 2021.02.06 |