[Kotlin] 새차원의 코틀린 강좌(6)

새차원의 코틀린 강좌 - Classes


클래스
  • 클래스는 class 키워드로 선언

    • 클래스 이름
    • 클래스 헤더 (형식 매개변수, 기본 생성자 등 + 접근 지정자)
    • 클래스 바디 { }
1
2
3
class Invoice(data: Int) {

}


  • 헤더와 바디는 옵션이고, 바디가 없으면 { } 도 생략 가능
1
class Empty



기본 생성자
  • 클래스별로 1개만 가질 수 있음
  • 클래스 헤더의 일부
  • 클래스 이름 뒤에 작성
1
2
3
class Person constructor(firstName: String) {

}


  • annotation이나 접근지정자가 없을 때는, 기본생성자의 constructor 키워드 생략 가능
1
2
3
class Person(firstName: String) {

}


  • 기본생성자는 코드를 가질 수 없음

    • 초기화는 초기화 블록(init) 안에서 작성해야함
    • 초기화 블록은 init 키워드로 작성
  • 기본생성자의 파라미터는 init 블록 안에서 사용 가능함

1
2
3
4
5
class Customer(name: String) {    
init {
logger.info("Customer initialized with value ${name}")
}
}

  • 기본 생성자의 파라미터는 프로퍼티 초기화 선언에도 사용 가능
1
2
3
class Customer(name: String) {
val customerKey = name.toUpperCase()
}


  • 프로퍼티 선언 및 초기화는 기본생성자에서 간결한 구문으로 사용 가능
1
2
3
class Person(val firstName: String, val lastName: String) {

}


  • 프로퍼티란?
1
2
3
4
5
6
7
8
9
10
11
12
class Customer(name: String) {
// 프로퍼티 (getter, setter 를 가짐)
var fullname: String = ""
get() {
println("call getter")
return field
}
set(value) {
println("call setter")
field = value
}
}
1
2
3
4
5
6
fun main(args: Array<String>) {
val obj = Customer("원딜레이")
println(obj.fullname)
obj.fullname = "홍홍홍"
println(obj.fullname)
}

# 출력값

call getter

원딜레이

call setter

call getter

홍홍홍


  • 기본생성자에 어노테이션 또는 접근지정자 등이 있는 경우 constructor 키워드가 필요함
1
2
3
class Person public @Inject constructor(name: String) {
...
}



보조생성자
  • 클래스별로 여러 개를 가질 수 있음
  • constructor 키워드로 바디에 선언 (기본생성자는 헤더에 선언)
1
2
3
4
5
class Person {
constructor(parent: Person) {
parent.children.add(this)
}
}


  • 클래스가 기본생성자를 가지고 있다면, 각각의 보조생성자들은 기본생성자를 직접 or 간접적으로 위임해주어야 함

  • this 키워드 이용

    • 직접적 : 기본생성자에 위임
    • 간접적 : 다른 보조생성자에 위임
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person(val name: String) {
init {
println("디폴트 생성자!!!")
}

constructor(name: String, parent: Person) : this(name) {
println("$name 의 남자친구는 ${parent.name}")
println("생성자1 실행")
}

constructor() : this("원지팡", Person("홍태준")) {
println("생성자2 실행")
}
}



생성된(generated) 기본생성자
  • 클래스에 기본생성자 or 보조생성자를 선언하지 않으면, 생성된 기본생성자가 만들어짐

  • generated primary constructor

    • 매개변수가 없음
    • 가시성이 public
  • 만약 생성된 기본생성자의 가시성이 public이 아니어야한다면, 다른 가시성을 가진 빈 기본생성자를 선언해야함

1
2
3
class DontCreateMe private constructor() {

}



인스턴스 생성
  • 코틀린은 new 키워드가 없음
  • 객체를 생성하려면 생성자를 일반 함수처럼 호출하면 됨
1
2
3
val invoice = Invoice()

val customer = Customer("원딜레이")



클래스 멤버
  • 클래스는 아래의 것들을 포함할 수 있음

    • Constructors and initializer blocks
    • Functions
    • Properties
    • Nested and Inner Classes
    • Object Declarations -> 자바와 많이 다름!


출처 : 새차원의 코틀린 강좌 https://www.inflearn.com/course/%EC%BD%94%ED%8B%80%EB%A6%B0-%EA%B0%95%EC%A2%8C-%EC%83%88%EC%B0%A8%EC%9B%90/

Share