Kotlin 기초 - 클래스 이해하기 1

객체 지향 언어를 배울 때 항상 초반에 나오는 내용이 바로 클래스이다. 너무나도 당연하겠지만 클래스를 알아야지 뭐든 만들 수 있을테니까.. 코틀린 역시 객체 지향 언어를 기반으로 하고 있기 때문에 클래스에 대한 이해는 필수이면서 가장 기본적인 내용이다. 어떤 학습 영역이든 항상 기초, 기본이 가장 중요한거니 코틀린의 클래스에 대해서도 확실히 알아두도록 하자.

클래스의 정의

기본적인 클래스를 정의하는 방법은 여타 언어와 비슷하다. 아래 코드를 보면 이게 자바 클래스인지 코틀린 클래스인지 분간하기 힘들다.

class Employee {  
/* .... */
}

하지만, 지금부터 자바와는 확연하게 다른 코틀린의 클래스를 만날 수 있다.

주 생성자와 프로퍼티

코틀린 클래스의 주 생성자(primary constructor)는 클래스 이름 바로 옆에 따라온다.

class Employee constructor (id: String, name: String)  { /* ... */ }  

생성자임을 나타내주는 constructor 키워드를 사용하는데 생성자에 애노테이션이나 private 같은 가시성 키워드가 없다면 다음과 같이 생략이 가능하다.

class Employee (id: String, name: String)  { /* ... */ }  

클래스의 프로퍼티는 init 키워드를 사용한 블럭 내에서 초기화가 가능하며, 생성자를 통해 얻은 파라미터들도 이 블럭 내에서 사용가능하다.

class Employee (id: String, name: String)  {  
   val id: String
   val name: String
   init {
      this.id = id
      this.name = name
   }
}

다음과 같이 init 블럭을 사용하지 않고 클래스의 프로퍼티 선언과 할당을 클래스 본문에서 수행하는 것도 가능하다.

class Employee (id: String, name: String)  {  
   val id: String = id
   val name: String = name
}

위와 같은 클래스의 경우 주 생성자에서 받은 파라미터 명과 클래스의 프로퍼티 명이 같다. 개발하다보면 자주 이런 클래스들을 선언하게 되는데, 코틀린에서는 이를 다음과 같이 축약하여 선언할 수 있다.

class Employee (val id: String, val name: String)  

클래스 선언을 위해 주저리..주저리.. 타이핑해야하는 자바와는 확연히 다르다. 깔~끔!!

파라미터 기본값 정의

다음 코드와 같이 생성자 파라미터에 기본값을 부여할 수 있다. 기본값이 있는 파라미터는 optional 한 파라미터가 되어 클래스 인스턴스 생성 시 값을 입력하지 않아도 된다.

class Employee(val id: String,  
               val name: String,
               val department: String = "Dev",
               val email: String = "")

위 클래스의 인스턴스는 다음과 같이 만들 수 있다.

// id="e0001", name="Steve", department="Dev", email=""
val emp1 = Employee("e0001", "Steve")  
// id="e0002", name="Bob", department="HR", email=""
val emp2 = Employee("e1002", "Bob", "HR")  
// 중간 파라미터를 생략한 경우, 해당 파라미터 뒤에 따라오는 파라미터들에게는 명시적으로 파라미터명을 써줘야 한다.
// id="e0003", name="Martin", department="Dev", email="martin@gcorp.com"
val emp3 = Employee("e1003", "Martin", email="martin@gcorp.com")  

모든 생성자 파라미터에 기본값을 지정하면 코틀린 컴파일러는 자동으로 파라미터가 없는 생성자를 만들어 준다. 이러한 코틀린의 기능은 Jackson 이나 JPA 같은 파라미터가 없는 생성자를 통해 객체를 생성해야만 사용 가능한 자바 라이브러리와의 통합을 쉽게 만들어준다.

부 생성자

코틀린도 두 개 이상의 생성자를 가질 수 있는데, 아래 코드와 같이 constructor 키워드를 사용한다. 생성자 헤더 옆으로 this 키워드를 붙여 다른 생성자를 호출할 수도 있다.

class Employee (val id: String, val name: String) {  
    var department: String? = null
    var email: String? = null

    constructor(id: String,
                name: String,
                department: String): this(id, name) {
        this.department = department
    }

    constructor(id: String,
                name: String,
                department: String,
                email: String): this(id, name, department) {
        this.email = email
    }
}

일단, 여기까지 코틀린 클래스를 정의하는 방법에 대해 정리해보았다. 다음 글에서는 코틀린 클래스의 상속과 가시성에 대한 내용을 정리하면 좋을 듯 하다.