안드로이드 개발자의 창고
[13일차 kotlin] init과 생성자(constructor) 본문
출처 : 안드로이드 앱스쿨 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이 출력된다.
- t3의 v1처럼 멤버 변수를 지정하여 값을 저장할 수 있다.
✔️ 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 |