Constructor 와 Init 블럭

순순·2024년 3월 6일

코틀린

목록 보기
1/8

처음 접했을 때 매개변수랑 되게 헷갈렸던 개념. 개념정리하는 김에 적어두었다.


1. 생성자(constructor)

클래스를 통해 객체를 생성하면 무조건 호출되는 요소


특징)

  • 무조건 동작해야하는 코드가 있을 경우, 생성자에 만들어준다.
  • 생성자는 매개변수의 형태(개수나 타입)를 다르게하여 여러 개 만들 수 있음. ⇒ 오버로딩
  • 그러나 자동으로 호출되는 생성자의 수는 무조건 1개이다.

종류)

  • 기본 생성자 : 클래스 선언 부분에서 정의되는 생성자
  • 보조 생성자 : 클래스 내에 별도로 정의된 생성자
// 생성자
    constructor(){
        println("TestClass2의 매개 변수가 없는 생성자")
    }

    // 매개변수의 개수나 타입을 다르게 하면 여러개의 생성자를 제공할 수 있다.
    constructor(a1:Int, a2:Int){
        println("TestClass2의 매개 변수가 있는 생성자")
        println("a1 : $a1")
        println("a2 : $a2")
    }

2. init 코드 블럭

= 객체를 생성할 때 자동으로 동작하는 부분.
= 프로퍼티 초기화를 위해 많이 씀.
= 생성자보다 먼저 동작함!


특징)

  1. java 코드로 변환될 때, 모든 생성자의 가장 윗부분에 코드가 삽입된다. (가장 우선 됨)
  2. 생성자를 여러 개 만들어 제공할 경우, 중복되는 코드가 있을 때 init 코드 블럭에 작성해준다.
init{
        println("TestClass1의 init 코드 블럭")
        println("객체가 생성될 때 자동으로 동작하는 부분입니다")
        println("Java 코드로 변환될 때 모든 생성자의 상단에 삽입되는 코드입니다.")
    }

3. this

객체가 가지고 있는 멤버를 지칭하기 위해 사용한다.


특징)

  1. 메서드나 생성자의 매개변수 이름과 멤버 변수의 이름이 같을 때 사용한다.
  2. 같은 클래스 내의 다른 생성자를 호출하고자 할 때 사용한다.
class TestClass4{
    // 멤버변수 a1, a2
    var memberA1 = 0
    var memberA2 = 0

    constructor(memberA1:Int, memberA2:Int){
        // 여기서 사용하는 memberA1과 memberA2는 매개변수를 지칭한다.
        println("memberA1 : $memberA1")
        println("memberA2 : $memberA2")
        // 생성자나 메서드의 매개변수 이름과 멤버 변수의 이름이 같은 경우
        // 매개변수가 출력된다.
        // 맴버변수를 사용하고자 한다면 this를 사용한다.
        // this는 객체 자기 자신을 가리키는 키워드이다.
        this.memberA1 = memberA1
        this.memberA2 = memberA2
    }

4. 생성자에서 다른 생성자를 호출하는 법

constructor(매개변수) : 호출할 다른 생성자(매개변수)

constructor():this(1000, 2000){
        println("매개변수가 없는 생성자 호출")
    }

5. 주 생성자

하나의 클래스에서 생성자가 여러 개 있을 경우 주 생성자를 지정할 수 있다.


특징)

  • 주생성자가 아닌 다른 생성자들은 모두 주 생성자를 무조건 호출해야 한다.

  • 주생성자를 호출하지 않으면 오류남 (강제성 부여로 실수 제어)




사실 헷갈렸던 이유가,, 코드 호출 될 때 '가장 먼저 호출'되는 친구들이라고 해서,, 그 개념에만 꽂혀서 혼동했던 건데 알고보니 전혀 다른 특징을 가지고 있었다.

주 생성자는 클래스의 속성을 정의, 매개변수를 받는 친구고

init블록은 java로 코드로 변환 시 모든 코드의 상단에 추가되는 코드다. 그래서 프로퍼티 초기화 하기 좋다는 것. 그리고 모든 생성자가 상단에 동일한 코드를 가지고 있을 때도 init블럭을 사용하면 간단히 중복 제거가 된다. 참 편리한 친구가 아닐 수 없다.

profile
플러터와 안드로이드를 공부합니다

0개의 댓글