객체 만들기 (Object Instantiation)
앞 글에서 객체를 만드는 틀인 class(클래스)만드는 법을 배웠다.
이제 만들어 놓은 클래스 MainCharacter를 이용해서 객체(오브젝트)를 만들어 본다.
클래스로 객체를 만들었을 때 클래스의 '인스턴스(instance)'를 만들었다고 부른다.
즉, 객체를 만드는 것은 '클래스를 이용하여 instantiating(예시 : 예를 보여줌)'한 것이다.
한마디로 객체는 클래스의 인스턴스(instance)이다.
그러므로 객체와 인스턴스를 같은 뜻으로 사용할 수 있다.
ObjectExample 스크립트를 새로 만들고 MainCharacter클래스를 이용해서 객체(인스턴스)를 만들어 보자.
먼저 15~23번 줄에 MainCharacter 클래스를 간단하게 필드와 메서드 각각 1개씩만 작성한다.
7번줄
Tom 이라는 객체를 만들었다.
객체 만드는 방법은 다음과 같다.
클래스명 객체명 = new 클래스명( )
MainCharacter Tom은 변수를 정의한 것이다.
즉, MainCharacter 타입의 Tom이라는 변수이다.
객체를 생성하면 클래스명이 타입명이 되고 객체명은 변수명이 된다.
결국 객체도 데이터를 저장할 수 있는 변수의 한 종류이다.
클래스로 객체를 생성할 때는 new 키워드를 사용한다.
9번줄
객체가 만들어지면 클래스에 정의된 모든 필드와 매서드에 접근할 수 있고 여러 번 다시 사용할 수 있다.
이것이 객체 지향 언어의 특징이자 장점이다.
각 필드와 매서드에 접근할 때는 객체명 다음에 점(.)을 찍어서 구분한다.
Tom.name = "Tom Cat" 의 뜻은 객체Tom의 name필드에 문자열 Tom Cat을 저장하라는 뜻이다.
이렇게 보면 필드도 변수와 같은 역할을 한다는 것을 알 수 있다.
결국 필드도 변수의 한 종류이다.
11번줄
Tom객체에서 클래스의 메서드에 접근하는 것도 필드와 같은 방법으로 한다.
유니티로 실행하면 콘솔창에 다음과 같이 보여준다.
생성자(Constructor)
*constructor : 건설자, 제작자
생성자는 객체를 만들 때 반드시 초기화 하고 싶은 필드나 호출하고 싶은 메서드가 있는 경우에 사용하는 메서드 이다.
즉, 객체 생성용 특별 메서드라고 할 수 있다.
예를 들어 객체를 만들 때 '이름' , '나이' , '능력' 필드의 초기값을 반드시 넣어서 객체를 만들어야 하는 경우 생성자를 이용한다.
앞 글의 메서드 예제에서 인수를 전달하여 메서드를 호출했다.
SquareNumber(2)
인수를 전달할 수 있었던 이유는 메서드가 미리 만들어져 있었고, 또 인수를 받아서 저장할 수 있는 매개변수가 정의되어 있었기 때문이다.
int SquareNumber( int number ) { }
그런데 클래스로 객체를 만들 때 초기값을 전달하기 위한 인수는 사용할 수 없다.
예를 들어 이름이 Tom Cat , 나이가 28인 객체 Tom을 만들어야 한다면 다음과 같은 코드가 되어야 한다.
MainCharacter Tom = new MainCharacter("Tom Cat", 28)
그런데 Tom Cat , 28 두 인수를 받기 위한 매개변수가 정의된 메서드를 만들지 않았기 때문에 위와 같은 객체를 만들 수는 없다.
#기본 생성자 (Default Constructor)
위에서 Tom이라는 객체를 만들 때 new MainCharacter( )를 사용했다.
new 키워드와 함께 클래스명과 괄호를 사용했는데 이것은 메서드를 나타내는 모양이다.
즉, MainCharacter( )는 객체를 만들 때 호출하는 메서드이며 특별히 생성자라고 부른다.
MainCharacter( ) 처럼 매개변수가 없는 생성자를 기본 생성자라고 하며 클래스가 만들어지면 자동으로 만들어진다.
그래서 객체를 생성할 때 MainCharacter( ) 메서드를 호출해서 객체를 만들 수 있었던 것이다.
#생성자 만들기
그러면 필드나 메서드를 반드시 넣어서 객체를 생성하도록 하려면 생성자 메서드를 어떻게 정의해야 하는지 알아본다.
예를 들어 이름 필드, 나이 필드를 입력해서 객체를 만들 수 있도록 매개변수가 있는 생성자를 만들면 다음과 같다.
ConstructorExample.cs 파일을 만든 후 MainCharacter 클래스를 간단히 새로 작성했다.
17~21번줄
MainCharacter 클래스의 객체를 만들 때 name과 age 필드 2개를 인수로 반드시 넣어야 하는 생성자 메서드를 만들었다.
생성자 메서드명은 클래스명을 사용하고 매개변수명은 필드명 앞에 밑줄( _ )을 넣는다.
매개변수명은 필드명과 혼동하지 않기 위해 간단히 필드명 앞에 밑줄을 넣어 구분했지만 다른 형태로 만들어도 된다.
주의: 생성자 메서드는 일반 메서드와 다르게 반환타입이 없다.
7번줄
Start()메서드가 실행되면 새 객체를 만들기 위해 MainCharacter( )메서드를 호출한다.
이 메서드가 호출되면 인수가 2개 있으므로 클래스 안에 정의된 생성자 메서드 중에서 일치하는 생성자 메서드에게 인수 값을 전달한다.
인수를 전달받은 생성자 메서드는 매개변수에 저장한 후 각각 name필드와 age필드에 입력하여 Tom이라는 객체를 만들게 된다.
이렇게 만들어진 객체 Tom은 name 필드 값은 Tom Cat , age는 28의 값을 가지게 된다.
생성자는 필요에 따라 여러 개 정의할 수 있다.
필드와 메서드 중에서 필요한 것만 매개변수로 정의하여 여러 종류의 생성자 메서드를 만들 수 있다.
그런데 만약 생성자가 만들어져 있는 상태에서 매개변수가 없는, 즉 초기화 하지 않은 객체도 만들수 있게 하려면 아래와 같이 기본 생성자를 정의해야 한다. 왜냐하면 다른 생성자가 만들어져 있으면 기본생성자가 자동으로 만들어지지 않기 때문이다.
18~21번줄
기본생성자를 만들었다.
8번줄
이제 기본 생성자를 사용해서 Merry라는 객체를 만들 수 있다.
끝.
Wraven...
'취미로 하는 게임코딩_gameCodingAsHobby > 유니티unity로 게임 만들기' 카테고리의 다른 글
유니티17_C#_10_상속 (0) | 2021.02.20 |
---|---|
유니티16_C#_09_캡슐화 (0) | 2021.02.18 |
유니티14_C#_07_클래스와 메서드 (0) | 2021.02.16 |
유니티13_게임 제작 과정_03_미사일 발사 (0) | 2021.02.15 |
유니티12_게임 제작 과정_02_Ship Control (0) | 2021.02.10 |