본문 바로가기

프로그래밍 언어/코틀린_쌩초보를 위한 기초

쌩초보를 위한 기초_23_Constructor 생성자

객체 도우미: 생성자 constructor

 

앞에서 객체는 class(클래스)를 통해 만들 수 있다고 했다.

이때 기본적으로 호출되는 함수가 생성자(constructor ; 컨스트럭터)이다.

모든 클래스는 생성자가 반드시 있어야 한다.

사용자가 만들지 않으면 보이지는 않지만 기본값이 자동으로 생성된다.

 

생성자는 왜 필요한가?

앞 글의 예 처럼 클래스라는 틀을 만들 때 중괄호 안에 필요한 속성이나 함수를 만들 수 있다.

이럴 경우 객체를 만들면 클래스에 이미 선언되어 있는 속성을 가진 한정된 객체만 만들 수 있다.

하지만 객체를 더 다양하고 유연하게 (다양한 종류의 쿠키를) 만들고 싶다면 어떻게 할 것인가?

 

이것을 구현하기 위해 생성자(Constructor)라는 함수를 만들었다.

construct는 '건설하다, 구성하다'는 뜻이므로 클래스에서 객체를 구성하는데 도움을 주는 함수의 개념이다.

 

생성자는 기본(primary) 생성자와 보조(secondary) 생성자가 있다.

클래스는 한 개의 기본 생성자는 있어야 하며 추가하려면 하나 이상의 보조 생성자를 만들 수 있다.

 

기본 생성자 (primary constructor)

 

기본 생성자( 또는 주 생성자)는 클래스의 맴버 속성을 초기화하는 방법을 제공한다.

일단 지난 글에서 만들어 보았던 클래스를 간단히 복습한다.

앞 글에서 만든 Cookie 클래스에 속성을 2개로 줄여 간단하게 만들어 보았다.

 

이제 myCookie라는 객체를 만들고 클래스의 맴버 속성을 이용해서 "My Cookie: Blue Cookie"를 출력해 보자.

 

 

name과 color 멤버 속성은 기본 생성자(constructor)를 사용해서 표현할 수 있다.

 

생성자 만드는 방법은 클래스 이름 다음에 constructor와 괄호를 만들고 그 안에 속성을 매개변수로 넣는다.

그리고 초기화는 나중에 객체(인스턴스)를 만들 때 값을 넣을 수 있으므로 해도 되고 안해도 된다.

 

객체를 생성할 때 다른 초기 코드를 실행하게 할 수 있다.

이때 아래와 같이 기본 constructor를 클래스명(Cookie) 다음에 적은 경우에는 init { } 형태의 초기화 블록을 사용해서 구현해야 한다.

 

 

 

위 그림에서 보듯이 생성자의 매개변수(color)의 값(blue)을 넣어서 초기화할 수 있다.

이렇게 하면 객체를 생성할 때 매개변수(name)를 넣지 않은 값만 초기화 할 수 있다.

main함수에서 변수myCookie가 클래스Cookie를 호출하고 있다.

 

위 그림에서 클래스를 호출하여 작동하는 과정을 나타내면 다음과 같다.

 

  1. main함수의 myCookie변수가 클래스 Cookie를 호출한다. 이때 매개변수로 Cookie를 전달한다.
  2. 클래스Cookie가 호출되면 constructor(생성자)가 실행된다. 이때 name변수에 Cookie가 저장된다.
  3. 생성자는 init의 코드를 실행한다. 이런 과정을 거쳐 만들어진 객체(Cookie("Cookie"))를 Instance(인스턴스)라고 한다.

위와 같은 과정으로 main함수의 변수myCookie는 클래스Cookie의 매개변수에 값을 전달하거나 접근해서 값을 가져올 수 있다. 또한 println에서 보듯이 점 연산자( . )를 사용해서 클래스의 변수나 함수를 호출할 수 있다.

위 코드를 실행해서 확인해보자.

 

 

만약 생성자의 매개변수 중에서 첫번째 이후의 매개변수 값을 넣지 않았다면

객체 생성(myCookie)시에 매개변수 이름(color =)을 지정해서 값을 넣어주면 초기화 할 수 있다. 

 

기본 생성자의 키워드 constructor는 다음과 같이 생략할 수 있다.

 

코드가 심플하게 되었다.

단. 클래스 선언에 private, protected, internal 같은 Visibility Modifier(가시성 지정자) 또는 @ 같은 annotiation(애너테이션; 주석)이 있으면 생략할 수 없다.

 

 

보조 생성자(Secondary Constructor)

 

보조 생성자는 클래스의 몸체{ } 안에 함수처럼 선언하면 된다.

 

보조 생성자를 사용하려면 먼저 속성을 선언만 한다.

객체를 만들 때 초기화 하므로 여기서는 초기화를 하지 않는다.

 

보조 생성자를 만들고 속성을 매개변수에 넣는다.

 

선언한 속성과 매개변수에 넣은 속성을 서로 연결하는 코드를 작성한다.

this는 "자기 자신"을 나타내며 여기서는 class Cookie 자신을 나타낸다.

 

그러므로 this.name = name 의 뜻은 다음과 같다.

 

이 클래스의 name속성에 넣어라 (뭘?) 매개변수 name(값을)

 

위 코드에서 this.name의 name은 처음 선언한 변수(속성)인 name을 나타내고

= 다음에 있는 name은 constructor의 매개변수 name이므로 서로 다른 name이다.

 

이제 객체를 만들어서 초기화 해보자.

 

객체를 만들고 값(myCookie, blue)을 넣으면 constructor의 매개변수(name, color)로 연결되고

다시 클래스의 속성(this.name, this.color)를 거쳐 변수(속성) name, color에 값이 저장된다.

이제 객체 myCookie는 그곳에 저장된 값을 자유롭게 이용할 수 있다.

 

그 외 보조 생성자의 사용 방법에는 다음과 같은 것이 있다.

 

키워드 this를 사용하지 않고 표현하려면 _ (언더바)를 사용해서 매개변수 이름을 바꿔야 한다.

속성과 매개변수는 서로 다르므로 이름을 바꿔주는 것이다.

 

 

보조 생성자는 매개변수를 다르게 하여 여러 번 선언할 수 있다.

 

 

테스트 해 보기 위해 클래스 안에 bake() 함수를 만들자.

 

함수 bake()는 속성 값을 각각 화면에 출력하라는 내용이다.

 

 

이제 메인함수에서 객체를 2개 만들고 bake함수를 이용하여 속성값을 출력해 보자.

 

이상으로 생성자 constructor에 대해 간단히 알아보았다.

다음 글부터는 상속에 대한 개념에 대해 알아본다.