class 클래스이름 {
// 클래스 스코프 (class scope)
}
클래스 이름 다음에는 클래스의 범위를 지정하는 중괄호가 있어야 한다. 이 중괄호를 스코프(scope)라고 하는데, 클래스에서 사용했기 때문에 클래스 스코프라고 한다.
class Person constructor(value: String) {
// 코드
}
프라이머리 생성자는 마치 클래스의 헤더처럼 사용할 수 있으며, constructor 키워드를 사용해서 정의하는데 조건에 따라 생략할 수 있다. 프라이머리 생성자도 결국은 함수이기 때문에 파라미터를 사용할 수 있다.
지금까지 나는 프라이머리 생성자는 생략된 상태의 클래스 형태만 봤던 것 같다.
생성자에 접근 제한자나 다른 옵션이 없다면 constructor 키워드를 생략할 수 있다.
이런 이유로 생략된 형태만 봤던 것 같다. 접근 제한자가 있는 클래스는 라프 과제나 프로젝트 동안 한 번도 사용해 본 적 없다.
class Person(value: String) {
init {
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다.")
}
}
생성자가 호출되면 init 블록의 코드가 실행된다.
class Person(val value: String) {
fun process() {
print(value)
}
}
하지만 init 초기화를 통해 생성자로 넘어온 파라미터에 접근할 필요가 없다면 작성해주지 않아도 된다. 대신 파라미터로 전달된 값을 사용하기 위해서 파라미터 앞에 변수 키워드인 val을 붙여주면(value -> val value로 바뀜) 클래스 스코프 전체에서 해당 파라미터를 사용할 수 있다.
생성자 파라미터 앞에 var를 사용할 수 있지만, 읽기 전용인 val을 사용하는 것을 권장한다고 한다.
class Person {
constructor (value: String) {
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다.")
}
}
세컨더리 생성자는 위 클래스 형식처럼 constructor 키워드를 마치 함수처럼 클래스 스코프 안에 직접 작성하는 식이다.
class Kotlin {
constructor(value: String) {
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다.")
}
constructor(value: Int) {
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다.")
}
constructor(value1: Int, value2: String) {
Log.d("class", "생성자로부터 전달받은 값은 ${value1},${value2}입니다.")
}
}
세컨더리 생성자는 파라미터의 개수, 또는 파라미터의 타입이 다르다면 여러 개를 중복해서 만들 수 있다.
class Student { // 생성자를 작성하지 않아도 기본 생성자가 동작한다.
init {
// 기본 생성자가 없더라도 초기화가 필요하면 여기에 코드를 작성
}
}
생성자는 작성하지 않을 경우 파라미터가 없는 프라이머리 생성자가 하나 있는 것과 동일하다.
이게 가장 자주 접하는 클래스 형식이 아닐까 싶다. 하지만 아직 각 생성자에 따른 클래스의 모양이 어떤식으로 실제 코드에서 활용되는지는 아직 감을 못 잡겠다. 기술부채로 남겨두고 넘어가려 한다.