// 에드센스

최근 코틀린을 처음으로 사용해보고 있다.

처음 언어를 배울때 일단 부딪혀가며 습득하자는 생각이라 주먹구구식으로 일단은 개발했던것 같다.

그 과정에서 정리가 필요한 부분들을 느꼈고 간단하게나마 적어보려한다.

 


1. 기본생성자

코틀린 클래스는 다음과 같이 생성한다.

class TestClass {
}

이 클래스는 생성자도 프로퍼티(얘도 상당히 중요한 개념인것 같다. 다음 글에서 정리해봐야겠다)도 없는 클래스다

여기에 기본생성자를 추가해보자면,

 

 

 

 

class TestClass(name: String, age: Int){
}

이런 모양이 된다. 이름과 나이를 초기화할 수 있는 기본생성자를 추가해보았다.

 

 

 

 

만약, 자바였다면 다음과 같았을 것이다.

class TestClass {    
        String name;
        int age;
    
        // 생성자
        public TestClass(String n1, int n2) {
                this.name = n1;
                this.age = n2;
        }
}

 

코틀린이 훨씬 간결하다.

 

 

 


2. init

바로 위의 코드처럼 자바에서는 생성자에서 바로 멤버변수들을 초기화 해줄 수 있다.

하지만 코틀린에서는 그러지 못하고 다음과 같은 방법을 사용할 수 있다.

class TestClass(name: String, age: Int){
    val name: String = "kim"
    var age: Int = 0
    init {
        this.age = age
    }
}

init은 기본생성자 호출이후 바로 다음에 호출되는 키워드이다.

 

 

 

하지만 우린 굳이 init 안쓰고 받아온 매개변수를 사용할 수 있다.

class TestClass(var name: String, val age: Int){
    fun introduce() {
        println("Hi! I'm $name and I'm $age years old")
    }
}

기본생성자의 매개변수 옆에 var과 val가 슬쩍 생긴것을 볼 수 있다.

얘네들을 붙혀주면 생성자의 매개변수를 클래스 내부에서 사용할 수 있다.

 

 

 

 


3. 보조생성자 constructor()

클래스 이름 옆에서만 생성자를 만들 수 있는걸까?

생성자를 여러개 만들고 싶을때는 어떻게 하면될까..

 

우리는 constructor 키워드를 사용할 수 있다.

class TestClass{
    var name = ""
    var age = 0
    constructor(name: String, age: Int){
        this.name = name
        this.age = age
    }
}

참고로 var name = ""에서 자동으로 String으로 타입추론이 되기에 :String이라고 명시해주지 않아도 된다.

 

 

하지만 이렇게 constructor로 생성자를 선언해주면 똑똑한 인텔리제이에서는 이러지 말라고 권유한다.

"Convert to primary constructor"를 누르면

 

 

이렇게 다시 정리가 된다.

 

 

아무튼 constructor 키워드로 생성자를 여러개 선언해 줄 수 있다.

class TestClass{
    var name = ""
    var age = 0
    
    constructor(name: String, age: Int){
        this.name = name
        this.age = age
    }

    constructor(age: Int){
        this.age = age
    }

    constructor(name: String){
        this.name = name
    }
}

 

 

하지만,

constructor 키워드를 사용할 때 한가지 주의할 것이 있다.

기본 생성자를 선언하고 constructor를 사용하면 다음과 같이 에러가 발생한다.

 

 

인텔리제이가 하라는 대로 this()를 추가해주면 에러는 사라진다.

왜 이럴까?

 

 

 

constructor로부터 생성된 생성자는 기본 생성자를 상속받아야 한다.

그렇기 때문에 기본 생성자를 상속받고 난 이후에는 에러가 사라진 것이다.

물론 기본 생성자를 상속 받는 것이니 constructor로 만든 생성자들은 반드시 기본 생성자가 갖고 있는 인자들을 갖고 있어야 한다.

 

 

 

이 경우에는 기본생성자에 name이 있지만 보조생성자에는 없다.

this()에 name을 넣어주도록 하자

 

 

 

에러 해결

 

 

 

기본생성자에는 존재하는 name이 보조생성자에는 없기에 에러가 발생한 모습이다.

 

 

 

생성자들의 호출 흐름을 보자면 다음과 같다.

https://jaejong.tistory.com/50

 

 

 

 

참고:

더보기

+ Recent posts