[C#과 유니티, 실전 게임으로 제대로 시작하기]섹션3-1. 스터디
객체지향은 객체들로 구조가 구성되어있다.
객체 : Object
객체를 만드는 설계도 : Class
객체지향의 4가지 특성 : 추상화, 캡슐화, 상속, 다형성
추상화 : 현실 세계의 사물, 개념의 속성과 행위를 추출하여 모델링하는 과정
// class 클래스_이름{}
클래스의 멤버는 필드(변수)와 메서드로 구성되어있다.
// 자료형 변수;
// 접근_제한자 반환_타입 메서드_이름(매개변수){ }
ex>
//클래스의 멤버
//사람의 속성 : 이름, 키, 나이 ->필드(변수)
//사람의 행위 : 먹다. 걷다. 자다. ->메서드
class Human{
string name; //필드
float height;
int age;
public void Eat(){ //public : 접근 제한자/ void : 반환 타입/ Eat : 메서드 이름
Debug.Log("eat!");
}
public void Walk(){
Debug.Log("Walk!");
}
public void Sleep(){
Debug.Log("Sleep!");
}
}
메서드
ex1> 반으로 나누어 반환해주는 메서드 : Half
float Half(float num){
float result = num/2;
return result;
}
void Start(){
float value = Half(10);
Debug.Log(value);
}
-> 10을 반으로 나눈 5값이 콘솔에 출력된다.
ex2> 반환값이 없는 메서드 : PrintNumber
void PrintNumber(int num){ //void형을 사용했기에 return사용x
Debug.Log(num);
}
void Start(){
PrintNumber(10);
}
->10의 값이 콘솔에 출력된다.
ex3> 매개변수가 없는 메서드 : GetTen
int GetTen(){
return 10;
}
void Start(){
Debug.Log(GetTen());
}
->10의 값이 콘솔에 출력된다.
ex4> 매개변수가 여러 개인 매서드 : Add
int Add(int a, int b){
return a+b;
}
void Start(){
Debug.Log(Add(1,3));
}
-> 4의 값이 콘솔에 출력된다.
ex5> 반환값과 매개변수가 없는 매서드 : PrintHello
void PrintHello(){
Debug.Log("Hello");
}
void Start(){
PrintHello();
}
-> Hello 값이 콘솔에 출력된다.
인스턴스화 : 클래스를 이용해 객체를 생성한다.
= 객체를 생성한 것이다.
= 객체가 저장되기 위한 메모리공간을 할당했다.
인스턴스화 하는 방법
// new 클래스_이름();
스크립트1>
class Human{
public string name; //public을 붙이면 속성을 외부에 공개하겠다는 의미를 가진다.
public float height;
public int age;
public void Eat(){
Debug.Log("eat!");
}
public void Walk(){
Debug.Log("Walk!");
}
public void Sleep(){
Debug.Log("Sleep!");
}
}
스크립트2>
void Start(){
Human john = new Human(); //john이라는 객체는 Human class를 이용하여 만들어졌기 때문에 Human class의 필드와 메서드를 가지고 있다.
// 스크립트1에서 public을 사용하여 외부에 공개하였기 때문에 다른 스크립트에서도 필드와 메서드에 접급할 수 있다.
john.name = "john"
john.age = "24"
john.height = "165"
john.Eat(); //"Eat!"이라는 값이 콘솔에 출력된다.
생성자 : 객체를 인스턴스화할 때 호출되는 메서드
생성자의 기본 구조
// 접근_제한자 클래스_이름(매개변수){}
-> 반환타입이 없으니 주의해야한다.
-> 객체를 초기화시키는데 많이 사용된다.
-> 객체를 인스턴스화될 때 호출되는 메서드이다.
-> 기본생성자는 따로 명시하지 않아도 생성된다.
-> 기본생성자가 아닌 객체를 초기화하는 등의 동작을 하는 생성자를 만들기 위해선 클래스에서 명시를 해줘야한다.
스크립트1>
class Human{
public string name;
public float height;
public int age;
public Human(){} // 다른 스크립트에서 매개변수없이 메서드를 사용할 수 있도록 한다.
public Human(string _name, float _height, int _age){ //기본 생성자 생성
name = _name; //Human class의 name 값을 생성자에서 선언한 _name값으로 초기화 해준다.
height = _height;
age = _age;
}
public void Eat(){
Debug.Log("eat!");
}
public void Walk(){
Debug.Log("Walk!");
}
public void Sleep(){
Debug.Log("Sleep!");
}
}
스크립트2>
void Start(){
Human Jane = new Human ("Jane", 165, 24);
Debug.Log("Jane.name");
Debug.Log("Jane.height");
Debug.Log("Jane.age");
}
-> Jane
165
24 값이 콘솔에 출력된다.
캡슐화 :
접근제한자 :
접근제한자 종류 :
** assembly : 유니티에서는 한 프로젝트가 assembly라한다.
클래스의 멤버는 접근제한자를 선언하지 않을 경우 private로 자동 설정된다. 반면, 클래스는 접근제한자를 생략하면 internal로 자동 설정된다.
속성 : 어떤 필드의 값에 접근하거나 수정하는 역할을 하는 멤버
속성의 기본 구조
/*
접근_제한자 자료형 속성_이름{
get (return 필드_이름;}
set (필드_이름 = value;}
}
*/
-> get, set ; 접근자(accessor)
스크립트1>
class Human{
private string name;
public float height;
public int age;
public string Name{ //Name은 속성으로 3행 name 필드의 값에 접근하거나 값을 수정하는 역할을 한다.
get{
Debug.Log("이름에 접근했다!");
return name;} //Name속성에 접근했을 때 실행되는 코드이다.
set{
Debug.Log("이름을 수정했다!");
name = value;} // Name에 설정한 값을 value라는 변수에 들어간다.
}
}
스크립트2>
void Start(){
Human chulsoo = new Human();
chulsoo.Name = "bbobbi"; // Name을 수정했기 때문에 set{}값을 출력한다.
Debug.Log(chulsoo.Name); // Name에 접근했기 때문에 get{}값을 출력한다.
}
-> 이름을 수정했다!
이름에 접근했다!
bbobbi 값이 콘솔에 출력된다.
스크립트1>
class Human{
private string name;
public float height;
public int age;
/* public string Name{
get{
Debug.Log("이름에 접근했다!");
return name;}
set{
Debug.Log("이름을 수정했다!");
name = value;}
} */
public string GetName(){
Debug.Log("이름에 접근했다!");
return name;
}
public string SetName(string value){
Debug.Log("이름을 수정했다!");
name = value;
}
}
스크립트2>
void Start(){
Human chulsoo = new Human();
/* chulsoo.Name = "bbobbi";
Debug.Log(chulsoo.Name); */
chulsoo.SetName("bbobbi");
Debug.Log(chulsoo.GetName());
}
앞의 get set 메서드와 동일한 값이 출력된다.