Home 클래스와 생성자
Post
Cancel

클래스와 생성자

클래스

기본형태

  • class 클래스이름(변수)
    • class를 이용하여 객체(인스턴스)를 생성한다.
    • 객체들이 자주 사용하는 공통적인 기능은 클래스 내에 함수로 넣어준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person(var name: String, val birthYear: Int){
   
    fun introduce(){
        println("안녕하세요, ${birthYear}년생 ${name}입니다. ")
    }
}

fun main(args: Array<String>) {

   var a = Person("Smart", 2000)
   var b = Person("Note", 1997)
   
   println("안녕하세요, ${a.birthYear}년생 ${a.name}입니다.")
   b.introduce()
}

참고사항

중괄호 {}

  • 처음 kotlin 출력함수를 배웠을 때 println 안에 $a 이런 식으로 출력했는데, 여기서는 {}를 사용하였다. 이는 println이 문자로 오인하지 않도록 방지하는 역할을 한다.
  • 출력함수 내에서 바로 계산한 값을 출력하거나, 특수문자 출력 시에도 사용된다.
1
2
3
4
5
6
var a = 1
var b = 2
println("$a + $b = ${a+b}")

println("${'"'}Hello${'"'}")
println(""\Hello\"")

생성자

정의

  • 새로운 인스턴스를 만들귀 위해 호출하는 특수한 함수
  • 위의 var a = Person(“Smart”, 2000)와 같이 클래스의 인스턴스를 만들어 반환받을 수 있다.

기능

  • 인스턴스의 속성 초기화
  • 인스턴스 생성시 구문 수행 (위의 class Person으로는 이 기능을 수행할 수 없다.)
    • init을 활용하여 구문 수행 가능

init 함수

  • parameter나 반환형이 없는 특수한 함수로, 생성자를 통해 인스턴스가 만들어 질 때 호출되는 함수이다.

기본형태

  • init{ 수행하고자 하는 구문 }
1
2
3
4
5
6
7
8
9
10
class Person(var name: String, val birthYear: Int){

    init{
        println("${this.birthYear}년생 ${this.name}님이 생성되었습니다.")
    }
    
    fun introduce(){
        println("안녕하세요, ${birthYear}년생 ${name}입니다. ")
    }
}

참고사항

this

  • 인스턴스 자신의 속성이나 함수를 호출하기 위해 클래스 내부에서 사용되는 키워드

생성자 종류

  • 기본 생성자 + 보조 생성자
    • 기본 생성자: 클래스를 만들 때 기본으로 선언
    • 보조 생성자: 필요에 따라 추가적으로 선언, 인스턴스 생성시 편의 제공하거나 추가적인 구문을 수행하는 기능 (상속과 유사)

보조 생성자 형태

  • constructor(속성): this(속성초기화){}
    • 반드시 기본 생성자를 통해 속성을 초기화해야 한다.
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
class Person(var name: String, val birthYear: Int){
    init{
        println("${this.birthYear}년생 ${this.name}님이 생성되었습니다.")
    }

    constructor(name: String): this(name, 1999){ 
        //this(기본 생성자가 필요로 하는 parameter 초기화)
        println("보조 생성자가 사용되었습니다. ")
    }

    fun introduce(){
        println("안녕하세요, ${birthYear}년생 ${name}입니다. ")
    }


fun main(args: Array<String>) {

   var a = Person("Smart", 2000)
   var b = Person("Note", 1997)

   println("안녕하세요, ${a.birthYear}년생 ${a.name}입니다.")
   b.introduce()
   
   var d = Person("Developer")
   var e = Person("Engineer")
   d.introduce()
    
}

위 코드와 같이 1999년생인 사람을 아주 많이 생성할 때 기본 생성자를 이용해서 항상 모든 속성을 수동으로 초기화하는 것은 비효율적이다. 이 때 constructor, 즉 보조 생성자를 이용하여 효율적으로 코드를 작성할 수 있다.