Koltin에서는 클래스를 인스턴스화 할때 자바와 같이 생성자(Constructor)를 사용하기도 하고, 축약된 방법으로 클래스를 선언할 수 있다. 이번에는 다양한 방식으로 클래스를 생성하고, 클래스의 프로퍼티를 초기화 하는 방법을 정리해 보고자 한다.
1. 기본적인 클래스 생성
클래스의 속성(property)를 가지고 있지 않는 경우, 위와 같이 간단하게 class 키워드와 Class이름을 지정하여 간단하게 선언할 수 있다. 이때 중괄호({})는 생략 가능하다.
class Person
2. 생성자(Constructor)를 이용한 프로퍼티 초기화
Kotlin에서는 Java와 유사하게 생성자(Constructor)를 통해 클래스 프로퍼티를 초기화 할 수 있다. Kotlin의 Constructor는 Primary Constructor
와 Secondary Constructor
로 구분할 수 있다. Primary Constructor는 클래스에서 하나만 정의할 수 있고, Secondary Constructor는 한개 이상 지정할 수 있다.
Kotlin에서 Primary와 Secondary Constructor를 구분하는 방법은 선언위치에 따라 정해진다.
위의 클래스 선언부에 Constructor가 선언되어있으면 Primary Constructor, class의 body 부분에 선언되어있으면 Secondary Constructor이다.
2.1 Primary Constructor 사용
Primary Constructor는 클래스 선언부에 constructor
라는 키워드를 이용해 선언할 수 있다.
class Person constructor(firstName: String) { /*...*/ }
// Primary Constructor는 어노테이션이나 접근제한자를 지정하지 않는다면 아래와 같이 축약할 수 있다.
class Person(firstName: String) { /*...*/ }
Primary Constructor
는 어떠한 코드도 포함할 수 없기 때문에, 생성자 안에서 특정 코드를 추가하려면 init
블록을 통해 인스턴스 초기화를 위한 추가 코드를 실행 할 수 있다.
class GoogleUser(email: String) {
val nickname:String
init {
//이메일 중 @ 앞의 아이디를 닉네임으로 지정한다.
nickname = email.substringBefore("@")
println("닉네임 설정 완료")
}
}
위와 같은 init도 좀더 축약하여 아래와 같은 형태로 사용 가능하다.
class GoogleUser(email: String) {
val nickname:String = email.substringBefore("@")
}
생성자와 필드를 한번에 선언하기
위와 같은 방법으로 Primary Constructor를 생성하면 Constructor로 전달된 변수를 클래스 속성에 저장하는 작업을 기본적으로 진행해야 한다. Kotlin에서는 var, val을 이용하여 클래스 프로퍼티의 선언과 초기화를 한번에 진행 할 수 있다.
//기본적인 방법을 통한 클래스 프로퍼티 초기화
class Person(_name:String) {
val name = _name
}
//위의 선언을 아래의 방식으로 생성자와, 클래스 프로퍼티를 한번에 설정하고 초기화 할 수 있다.
class Person(val name:String)
//또는
class Person(var name:String)
Kotlin에서는 위와 같은 방식으로 클래스 프로퍼티를 선언하고, 초기화까지 진행할 수 있다. Kotlin에서는 기본적으로 getter, setter 메소드를 자동으로 생성해 주는데, val
로 클래스를 선언할 경우 getter만, var
로 선언할 경우 getter와 setter가 생성된다.
아래는 'val'과 'var'로 클래스를 선언했을때 차이점을 알기 쉽게 java 코드로 설명한 것이다.
// class Person(val name:String) 의 선언을 Java로 표현하면
public class Person{
//val로 선언한 것은 java의 final로 설정한 것과 같다.
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
// class Person(var name:String) 의 선언을 Java로 표현하면
public class Person{
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
2.2 Secondary constructor 사용
클래스를 인스턴스화 할때, 조건에 따라 클래스의 일부 프로퍼티를 초기화 하고자 할때 사용한다. 자바로 표현하자면 아래와 같다.
// Java 코드
public class Person {
private Long id;
private String name;
private String address;
//어떨때는 Id로만 인스턴스를 생성하고
public Person(Long id) {
this.id = id;
}
//어떨때는 name, address를 통해 인스턴스를 생성한다.
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
이것을 Secondary Constructor를 이용하여 Kotlin으로 구현하면 아래와 같이 할수 있다.
class Person {
var id:Long = 0
var name:String = ""
var address:String = ""
constructor(id:Long){
this.id = id
}
constructor(name:String, address:String){
this.name = name
this.address = address
}
}
val person1 = Person(10)
val person2 = Person("my name", "Korea, Seoul")