nueijeel
[Kotlin 이론] 0512 클래스와 생성자 본문
2023.05.12
1. 클래스
fun main(){
val t1 = TestClass1()
val t2 = TestClass2()
//t1 변수에 담긴 TestClass1의 객체 ID 출력
println("t1: $t1")
//TestClass2 객체의 멤버 변수 출력
println("t2.a1: ${t2.a1}")
println("t2.a2: ${t2.a2}")
//t2 객체의 멤버 메서드 호출
t2.inputNum(10, 20)
}
//내용이 없는 클래스 정의
class TestClass1
//멤버를 가지는 클래스 정의
class TestClass2{
//멤버 변수
var a1 = 0
var a2 = 0
//멤버 메서드
fun inputNum(num1:Int, num2 : Int){
a1 = num1
println("a1 : $a1")
a2 = num2
println("a2 : $a2")
}
}
클래스는 TestClass1처럼 body가 없을 수도 있고, TestClass2처럼 body가 있을 수도 있다.
body 내에 정의된 멤버 변수와 메서드들은 해당 클래스의 객체를 생성해 접근 가능하다.
inputNum() 메서드는 매개변수로 받는 값들을 멤버 변수 a1,a2에 각각 넣고 출력한다. 따라서 함수 호출 전에 a1, a2는 0값을 가지지만 함수 호출 이후에는 매개변수로 전달한 10, 20로 값이 바뀐다.
2. 생성자
fun main(){
val t1 = TestClass1()
println("t1: $t1")
}
class TestClass1{
init{
println("TestClass1의 init 코드 블럭입니다.")
}
}
코틀린에서는 클래스 내부에 객체가 생성되면 작동하는 init{} 코드 블럭을 제공한다. 매개변수를 정의할 수는 없기 때문에 생성자는 아니지만, 객체 생성과 동시에 동작할 내용을 코드블럭에 작성할 수 있다.
실행해보면 main 함수에서 객체가 생성됨과 동시에 init 블럭 내 출력문이 실행되고, 그 이후에 t1 변수의 값을 출력한다.
fun main(){
val t1 = TestClass2() //매개변수가 없는 생성자로 객체 생성
println("t1.a1: ${t1.a1}")
println("t1.a2: %{t1.a2}")
val t2 = TestClass2(10, 20) //매개변수가 있는 생성자로 객체 생성
println("t2.a1: ${t2.a1}")
println("t2.a2: ${t2.a2}")
}
class TestClass2{
var a1 = 0
var a2 = 0
init{
println("init 코드 블럭")
}
constructor(){
println("매개 변수가 없는 생성자")
}
constructor(a1:Int, a2:Int){
this.a1 = a1
this.a2 = a2
println("매개 변수가 있는 생성자")
}
}
클래스 내부에 init 블럭과 매개변수가 없는 생성자, 매개변수가 있는 생성자를 구현했다.
코틀린에서는 constructor 키워드를 사용해 생성자를 선언한다.
main 함수에서 객체를 두 번 생성했기 때문에 init 블럭 내부 코드는 총 두 번 수행되고, 매개변수가 있는 생성자를 통해 멤버 변수 값을 초기화 할 수 있다.
만약 클래스 내에서 생성자의 역할이 매개변수로 들어오는 값을 멤버 변수에 할당하기만 한다면 다음과 같이 클래스 선언과 동시에 생성자를 지정할 수 있다.
fun main(){
val t2 = TestClass2(10, 20)
}
class TestClass2 (var a1:Int, var a2:Int)
이렇게 클래스 이름 옆에 매개변수의 형태로 작성하는 생성자를 주 생성자라고 한다.
코틀린 클래스는 하나의 주 생성자와 다수의 부 생성자를 가질 수 있다. 부 생성자 선언 시에는 주 생성자를 반드시 호출해야 한다.
fun main(){
val t1 = TestClass4(1) //주 생성자
val t2 = TestClass4(1, 2) //부 생성자 1
val t3 = TestClass4(1, 2, 3) //부 생성자 2
t1.printVariable()
t2.printVariable()
t3.printVariable()
}
class TestClass4(var a1:Int){
var a2:Int = 0
var a3:Int = 0
constructor(a1:Int, a2:Int) : this(a1){
this.a2 = a2
}
constructor(a1:Int, a2:Int, a3:Int) : this(a1){
this.a2 = a2
this.a3 = a3
}
fun printVariable(){
println("a1: $a1")
println("a2: $a2")
println("a3: $a3")
}
}
주 생성자를 호출해서 생성한 객체는 a1 변수만 초기화 시킨다. 나머지 객체들은 입력한 매개변수에 따라서 각각 다른 부 생성자를 통해 생성된다.
'Kotlin' 카테고리의 다른 글
[Kotlin 이론] 0516 Any, 추상 클래스와 인터페이스 (0) | 2023.05.24 |
---|---|
[Kotlin 이론] 0515 지연 초기화와 오버라이딩 (0) | 2023.05.22 |
[Kotlin 이론] 0515 상속과 접근 제한자 (0) | 2023.05.22 |
[Kotlin 이론] 0511 변수와 함수, 반복문 (0) | 2023.05.19 |
[kotlin 문법] 변수와 데이터 타입 (0) | 2023.02.28 |