4. 코틀린 객체지향 프로그래밍

4.1 클래스와 생성자

  • 클래스 선언만 하는 것도 가능
1
class User
  • 클래스 생성에 new 키워드 사용하지 않음
  • 주 생성자
    • 클래스 선언부에 선언
    • constructor 생략 가능
    • init 키워드를 통해 로직 수행 가능
    • 유일하게 매개변수에 val, var 키워드를 사용할 수 있음 ~= 그러면 자동적으로 멤버변수가됨
    • 객체 생성의 메인 로직을 담당하는 편
  • 보조 생성자
    • 본문에 constructor로 선언
    • 주 생성자가 있다면 무조건 호출해 주어야 함
    1
    2
    3
    4
    
    class User(name: String) {
      constructor(name: String, count: Int): this(name) {
      }
    }
    

4.2 클래스를 재사용하는 상속

상속과 생성자
  • 상위 클래스의 생성자를 어떻게든 호출해야한다.
1
2
3
4
5
open class Super(name: String) {
}

class Sub(name: String): Super(name) {
}

오버라이딩

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
open class Super {
  open var someData = 10
  open fun someFun() {
    println("I am super class function: $someData")
  }
}

class Sub: Super() {
  override var someData =  20
  override fun someFun() {
    println("I am sub class function: $someData")
  }
}

fun main() {
  var obj = Sub()
  obj.someFun()
  // 출력
  // I am sub class function: 20
}

접급 제한자

  • 같은 모듈 = Gradle이나 Maven에서 프로젝트 단위 또는 같은 세트 단위

4.3 코틀린 클래스의 종류

데이터 클래스

  • VO(Value Object) 클래스를 편리하게 이용할 수 있게 해줌
  • var, val 키워드를 사용해 멤버변수로 만들어야 의미가 있음
1
data class DataClass(val Name: String, val email: String, val age: Int)
  • 일반 클래스는 equals() 함수 사용시 객체 자체를 비교하지만 데이터 클래스는 객체의 데이터를 비교함
  • 멤버 변수나 함수를 선언할수도 있으나 equals() 함수는 주 생성자에 선언한 멤버 변수의 데이터만 비교함
  • toString() 함수는 데이터의 객체를 출력함

오브젝트 클래스 = 익명 클래스

  • 타입을 지정하지 않으면 Any 타입이 되어 오류남
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
var obj = object {
  var data = 10
  fun some() {
    println("data: $data")
  }
}

fun main() {
  obj.data = 20 //오류
  obj.some()    // 오류
}
  • 아래와 같이 클래스 또는 인터페이스를 타입으로 지정해야 함
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
open class Super {
  open var data = 10
  open fun some() {
    println("I am super some() : $data")
  }
}

val obj = object: Super() {
  override var data = 20
  override var some() {
    printLn("I am object some() : $data")
  }
}

fun main() {
  obj.data = 30 // 성공
  obj.some()    // 성공
}

컴패니언 클래스

  • static 대체
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class MyClass {
  companion object {
    var data = 10
    fun some() {
      println(data)
    }
  }
}

fun main() {
  MyClass.data = 20
  MyClass.some()
}