본문 바로가기
메타버스기반게임콘텐츠기획/스터디(C#이 보이는 그림책)

* 4장, 클래스 (4-4) 생성자 / 속성 / 인덱서 / Main()

by Queenut 2021. 11. 28.

 * 생성자(constructor)

 : 객체의 생성과 함께 자동으로 호출되는 것. 클래스와 같은 이름의 특수한 메소드.

 

 - 디폴트 생성자: 생성자를 작성하지 않아 자동으로 준비되는, 인수 없는 생성자.

 - 복사 생성자: 같은 클래스의 객체를 인수로 받아 대응하는 필드에 값을 대입하는 생성자. 받은 객체를 복사함.

 

 

 - 인수가 없는 생성자

class A
{
       public int a, b, c;

       Public A()
       {
              a = 0;
              b = 0;
              c = 0;
       }
}

class TestA
{
       A a = new A();
}

A(클래스 이름) A(생성자 이름)가 같다.

    전체가 생성자.

new A() 는 객체를 생성함과 동시에 생성자 호출과 같음.

 

 

 - 인수가 있는 생성자

class B
{
       public int s, t;

       public B(int a, int b)
       {
             s = a;
             t = b;
       }
}

class TestB
{
       B b = new B(3, 4);
}

new B(3, 4) : 객체 생성이자 생성자 호출

3, 4 : 생성자에 전달하는 인수

 

C#이 보이는 그림책 p115

생성자의 인수를 각각 title과 price로 바꿔봤는데 그러니까 "C 그림책" 이랑 "14000"이 안나오더라?

한 클래스 안에는 같은 이름의 변수를 쓸 수 없는걸까?

 

 

 

C#이 보이는 그림책 p117

book1의 값을 인수로 받은 Book을 복제했기 때문에 book2에 저자를 쓰지 않아도 값이 나타났다.

 

 

 

 * 속성

 : 객체 안에 있는 필드의 갑을 취득 또는 설정하는 메소드.

 필드 값을 반환하는 get 과 필드에 값을 대입하는 set 으로 구성된다.

 

 - set을 명시하지 않으면 읽기 전용 (set=손 이면, 손이 없으니 읽을 수만 있고)

 - get을 명시하지 않으면 쓰기 전용 (get=눈 이면, 눈이 없으니 쓸 수만 있고)

(맞는 비유인가...?)

 

public int prop
{
       get
       {
             return a
       }
       set
       {
             a = value;
       }
}

int prop : 속성

a : 필드명

value : 속성에 설정된 값은 value라는 변수에 들어간다.

 

C#이 보이는 그림책 p119

예시가 뭔가 이상한 것 같은데... aroma.itteki를 0.05라고 했으니까 밑에 콘솔창에 쓴 aroma.itteki가 0.05라고 뜨는 건 당연한 거 아닌가? 왜 굳이 한 바퀴 더 돌게 된거지???

내가 우동사리인거냐, 얘가 이상한거냐. 내용을 수정해서 이해해보고 싶어도 뭘 건드려야 할지 모르겠다.

아니 잠깐, get-set을 지워도 출력되는 내용은 똑같은데????

 

 - 값을 가져오거나 설정하기만 하는 속성이라면 다음처럼 써도 된다.

class Aroma
{
       public double itteki { get; set; }
}

값을 저장하는 필드는 C#에서 자동으로 생성한다.

 

 

 

 * 인덱서 (indexer)

 : 객체 안의 배열에 액세스해 클래스를 배열처럼 취급하게 만드는 구조. get-set 으로 구성된다.

public int this [int i]
{
       get
       {
             return a[i];
       }
       set
       {
             a[i] = value;
       }
}

int : 배열 요소의 형

int i : 배열의 첨자와 형

a : 배열명

 

p121. 다행히 얜 get-set지워도 실행되진 않더라.

 

 

 * Main()

 : 프로그램을 실행하면 제일 먼저 호출되는 메소드.

 static을 붙여 한 프로그램에 한 개만 작성하기로 약속되었다.

 

static int Main()
{
       Console.WriteLine("C# 그림책");
       return 0
}

int : 반환값의 형이 들어가는 자리. 그동안 void가 쓰였지만 int로 쓴다면 프로그램이 종료할 때 지정한 값을 반환할 수 있다. 반환값은 시스템에 전달되어 배치 파일 등에 이용할 수 있다.

(일반적으로 정상 종료한 프로그램은 0을 반환)

 

 

- Main() 의 인수로 string 클래스의 배열을 지정할 수 있다.

  이때 명령 프롬프트에서 입력되는 정보(명령행 인수)는 문자열의 배열로서 Main() 에 전달된다.

>Test apple orange lemon

Test : 실행 파일명

apple orange lemon : 명령행 인수

(실행 파일은 Visual Studio의 경우, 프로젝트 이름으로 된 폴더 아래, bin\Debug 혹은 bin\Release 어딘가에 있다.)

 

 

^^.... p123. 나중에 수정하겠음...(정답 틀림)

내가 진짜, 명령 프롬프트가 뭐하는 앤지도 모르지만 일단 켜서 >Test 이하 입력해보기까지 했건만... 

 

 

 

 

p124~125 예제 프로그램

...?

 

 - null

 : C언어랑 달이 C#은 null이 false나 0의 의미를 갖고 있지 않다.

  참조형에선 null이 저장되어있다면 목적지가 없다는 말이다.

  C#의 if 는 논리값만 평가할 수 있다. 때문에 C언어처럼 if(a)나 if(!a) 말고 if(a != null) ~~ 처럼 써야한다.