개발자 강경완

코틀린(Kotlin)의 클래스에 대해 알아보자! 본문

IT/Kotliin

코틀린(Kotlin)의 클래스에 대해 알아보자!

경완군 2017. 6. 24. 18:21

클래스

클래스

자바에서 클래스는 보통 생성자와 get, set 메소드, 그리고 추가적인 메소드를 추가해서 만듭니다.

 
class ChatData{
    private String nickname;
    private String message;
  public ChatData(String nickname, String message){
    this.nickname = nickname;
    this.message = message;
  }
  
  public String getMessage(){
    return this.message;
  }
  
  public String getNickName(){
    return this.nickname;
  }
}

하지만 코틀린은 이 모든 것을 다음 한 줄로 함축할 수 있습니다.

 
class ChatData(val nickname: String, val message: String)

일반적으로 자바에서는 데이터 필드 값의 보안자를 private로 두고 get, set 메소드를 통해 접근을 제한하게 됩니다. 코틀린에서는 get, set 메소드를 기본적으로 포함하고 있는데, 위 예제에서는 생성자가 변수를 val 로 받고 있으므로 nicknamemessage는 get 메소드만 가지고, set 메소드는 작동을 하지 않습니다.

 
fun main(args : Array<String>) {
  val data =  ChatData("user1234", "HelloWorld")
  println(data.message)
  //    data.nickName = "aaa" // 불가능
}
class ChatData(val nickName: String, val message: String)
>>> HelloWorld

nickName 값을 수정시키고 싶다면 val 대신 var 를 사용하면 됩니다.

 
fun main(args : Array<String>) {
    val data =  ChatData("user1234", "HelloWorld")
    data.nickName = "aaa"
    println(data.nickName)
}
class ChatData(var nickName: String, val message: String)
>>> aaa

만약 완전히 private 로 선언하고 get 메소드 조차 사용하고 싶지 않다면

 
class ChatData(nickName: String, message: String)

다음과 같이 작성하면 클래스 외부에서 접근이 불가능하게 됩니다.

자바에서는 초기화 코드를 생성자에다가 작성합니다. 하지만 위와 같은 코드들에는 생성자 내부에 코드를 작성할 수 없습니다. 이에 대한 문제는 코틀린에서 다음과 같이 해결합니다.

 
fun main(args : Array<String>) {
    val data =  ChatData("user1234", "Hello World");
}
class ChatData(nickName: String, message: String){
    init{
        println("$nickName said: $message")
    }
}
>>> "user1234 said: Hello World"

또한 생성자가 여러개가 필요할 경우도 있을 겁니다.

코틀린은 기본생성자보조생성자 개념이 있습니다.

 
class ChatData(nickName: String, message: String) {
    var age = 0
    constructor(nickName: String, message: String, age: Int) : this(nickName, message){
        this.age = age
    }
}

생성자가 여러개가 필요한 경우는 보조 생성자를 이용하면 됩니다.

보조생성자는 constructor 키워드가 필요하며, 반드시 this() 인 기본 생성자를 호출해야 합니다.

만약 기본 생성자가 아무 것도 받지 않는다면

 
class ChatData(){
    var age = 0
    constructor(nickName: String, message: String, age: Int) : this() {
        this.age = age
    }
    constructor(message: String, age: Int) : this() {
        this.age = age
    }
}

위와 같이 해결을 하거나

 
class ChatData{
    var age = 0
    var nickName = ""
    constructor(nickName: String, message: String, age: Int) {
        this.nickName = nickName
        this.age = age
    }
    constructor(nickName: String){
        this.nickName = nickName
    }
}

기본 생성자를 여러개로 만들면 됩니다.

위 두 예제의 차이점은 기본생성자가 비어있는 클래스는 ChatData() 로 값을 넘겨주지 않고 인스턴스를 생성을 할 수 있다는 점입니다.

인스턴스를 생성할 때는 다음 두 가지 방법으로 생성할 수 있습니다.

 
    ChatData("user1234", "Hello World", 10)
    ChatData(nickName = "user1234", message = "Hello World", age = 10)
    ChatData(message = "Hello World", age = 10, nickName = "user1234") // 순서는 상관 없음

짧게 작성하려고 했는데 생각보다 너무 길어졌네요.

프로퍼티에 대한 내용도 너무 길어서 나눠서 올리겠습니다.

다음에는 프로퍼티와 백킹필드, 백킹 프로퍼티에 대해 다루어 보겠습니다.

1 Comments
댓글쓰기 폼