Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[13일차 kotlin] init과 생성자(constructor) 본문

Computer/Kotlin

[13일차 kotlin] init과 생성자(constructor)

Wise-99 2023. 5. 14. 04:39

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 init

  • Kotlin은 클래스에 init 코드 블록을 만들어 주면 객체 생성시 자동으로 동작하는 코드를 만들 수 있다.
  • 매개 변수를 정의할 수 없기 때문에 생성자는 아니다.

 

📖 예제 코드

fun main() {
    var t1 = TestClass1()
    println("t1 : $t1")
}

class TestClass1{
    init{
        println("TestClass1의 init 코드 블럭")
        println("객체가 생성되면 자동으로 동작하는 부분입니다")
    }
}

✔️ 코드 해석

  • init 코드 블록은 객체가 생성되면 자동으로 실행된다.
  • 따라서 init의 코드들이 먼저 실행되어 "TestClass1의 init 코드 블럭", "객체가 생성되면 자동으로 동작하는 부분입니다"라는 문장이 출력된다.
  • 그 후 객체의 ID 값이 출력된다.

 


 

📖 생성자란?

  • 클래스를 통해 객체를 생성할 때 자동으로 수행될 코드를 작성하는 곳이다.
  • 메서드와 비슷해 보이지만 반환 타입이 없어 메서드라고 부르지 않는다.
  • 생성자의 역할은 클래스가 가지고 있는 변수의 값을 초기화 하는데 주로 이용된다.
  • constructor를 이용하여 생성자를 정의할 수 있다.
  • 생성자는 매개변수의 개수나 자료형을 달리하여 여러 개를 만들어 사용할 수 있다.

 

  • 기본 생성자
    • 클래스를 정의할 때 클래스 이름 우측에 정의하는 생성자
    • 기본 생성자의 매개 변수는 멤버 변수로 자동 등록된다.

 

📖 예제 코드

fun main(){
    var t2 = TestClass2()
    var t3 = TestClass2(v1 = 100,200)
    println("t2.v1 : ${t2.v1}, t2.v2 : ${t2.v2}")
    println("t3.v1 : ${t3.v1}, v3.v2 : ${t3.v2}")
}


class TestClass2{
    var v1 = 0
    var v2 = 0
    
    init{
        println("init 코드 블록 입니다")
    }

    constructor(){
        println("매개 변수가 없는 생성자")
    }

    constructor(v1 : Int, v2 : Int){
        println("매개 변수가 두 개인 생성자")
        this.v1 = v1
        this.v2 = v2
    }
}

✔️ 코드 해석

  • t2에는 매개변수가 없는 생성자를 호출하여 생성한 객체를 생성한다.
    • 객체를 생성하였으므로 init 코드 블록이 실행된다.
    • 매개변수를 넣지 않았으므로 "매개 변수가 없는 생성자"라는 문장이 출력된다.
    • t2의 v1과 v2는 기본값인 0을 가지고 있다. 따라서 0, 0이 출력된다.
  • t3에는 매개 변수로 100과 200을 넣었으므로 매개 변수가 두개인 생성자를 호출하여 객체를 생성한다.
    • t3의 v1처럼 멤버 변수를 지정하여 값을 저장할 수 있다. 
      • 생성자의 매개 변수 타입이 같아 어느 매개 변수에 넣어야하는지 혼동되는 경우에 지정해주면 좋다.
    • 객체를 생성하였으므로 init 코드 블록이 실행된다.
    • 매개 변수를 두 개 전달하였으므로 "매개 변수가 두 개인 생성자"라는 문장이 출력된다.
    • t3의 v1에는 100, v2에는 200이 저장되어 있으므로 100, 200이 출력된다.

 

✔️ Colsole 결과

 


 

📖 생성자를 생략한 예제 코드

class TestClass3{
    var a1 = 0
    var a2 = 0

    constructor(a1:Int, a2:Int){
        this.a1 = a1
        this.a2 = a2
    }
}

class TestClass4 constructor(var a1:Int, var a2:Int)

class TestClass5(var a1:Int, var a2:Int)

✔️ 코드 해석

  • 해당 클래스들은 모두 같은 기능을 가지는 클래스들이다.
  • TestClass3처럼 생성자가 매개 변수로 들어오는 값을 멤버 변수에 담는 역할만 한다면 TestClass4처럼 한 줄로 표현 가능하다.
  • 또한 TestClass4에 있는 constructor 문구도 생략할 수 있으며 TestClass5처럼 표현할 수 있다.

 


 

📖 멤버가 있는 클래스의 예제 코드(주생성자, 부생성자)

fun main(){
    val t5 = TestClass6(1,1)
    t5.testMethod6() // 1, 1, 0

    var t6 = TestClass6()
    t6.testMethod6() // 100, 200, 0

    var t7 = TestClass6(1)
    t7.testMethod6() // 1, 200, 0
}

class TestClass6 (var a1:Int, var a2:Int){
    var a3 = 0

    init{
        println("init 블럭 코드 입니다.")
    }

    constructor() : this(100, 200)

    constructor(a1:Int) : this(a1, 200){
        println("매개 변수가 있는 생성자 호출")
    }

    fun testMethod6(){
        println("a1 : $a1")
        println("a2 : $a2")
        println("a3 : $a3")
    }
}

✔️ 코드 해석

  • init은 객체가 생성될 때마다 실행된다.
  • 클래스 선언부에 선언한 생성자를 주 생성자라고 한다.
  • 클래스 본문에 정의된 생성자를 보조 생성자라고 한다.
  • 보조 생성자로 객체를 생성할 때는 반드시 주 생성자가 실행되게 해야 한다.

 

  • t5는 매개 변수로 1, 1을 전달했기 때문에 a1과 a2에 각각 1이 저장된다.
  • t6은 매개 변수를 전달하지 않았기 때문에 매개 변수가 없는 생성자를 호출한다.
    • constructor()(부생성자)는 this()를 사용하여 클래스 이름 옆에 정의되어 있는 생성자(주생성자)를 호출한다.
    • 추가적인 생성자를 정의할 때는 클래스 이름 옆에 정의한 생성자를 반드시 호출해야 한다.
    • 따라서 매개 변수가 두 개인 생성자를 호출하여 100과 200을 전달한다.
  • t7은 한 개의 매개 변수를 전달한다.
    • constructor(a1:Int)는 this()를 사용하여 클래스 이름 옆에 정의되어 있는 생성자를 호출한다.
    • a1과 200을 전달하므로 a1에는 1, a2에는 200이 저장된다.

'Computer > Kotlin' 카테고리의 다른 글

[14일차 Kotlin] 패키지(Package)와 모듈(Module)  (0) 2023.05.16
[14일차 Kotlin] 상속  (0) 2023.05.16
[13일차 Kotlin] 객체지향 프로그래밍  (0) 2023.05.14
[12일차 Kotlin] 반복문(Loop)  (0) 2023.05.12
[12일차 Kotlin] When  (0) 2023.05.12