C#과 유니티3-1

망고·2023년 11월 9일

C#과 유니티

목록 보기
4/10
post-thumbnail

[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 값이 콘솔에 출력된다.

캡슐화

캡슐화 :

  • 필요한 정보를 한 곳에 모은다.
  • 외부에 공개할 것과 공개하지 않을 것을 구분한다.

접근제한자 :

  • 캡슐화에서 정보를 은닉하는 방법 중 하나이다.
  • 주로 멤버 앞에 붙어 수식하는 형태이다.

접근제한자 종류 :

  • public : 접근할 수 있는 모든 외부에 공개한다.
  • internal : 같은 assembly에서 접근 가능하도록한다. (유니티에서는 public과 동일한 개념이라고 생각해도 좋다.)
  • protected : 파생클래스에서만 접근 가능하도록한다.
  • private : 외부에 공개하지 않는다.

** assembly : 유니티에서는 한 프로젝트가 assembly라한다.

클래스의 멤버는 접근제한자를 선언하지 않을 경우 private로 자동 설정된다. 반면, 클래스는 접근제한자를 생략하면 internal로 자동 설정된다.

속성

속성 : 어떤 필드의 값에 접근하거나 수정하는 역할을 하는 멤버

속성의 기본 구조

/*
	접근_제한자 자료형 속성_이름{
	get (return 필드_이름;}
    set (필드_이름 = value;}
    }
*/

-> get, set ; 접근자(accessor)

  • get 접근자 : 해당 필드의 값에 접근하는 역할
  • set 접근자 : 해당 필드의 값을 수정하는 역할

스크립트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 메서드와 동일한 값이 출력된다.

0개의 댓글