3-1. Kotlin 클래스 생성자

2020. 3. 3. 19:00소프트웨어 공학/코딩 공부

본 내용은 kotlinlang.org 공식 문헌과 기타 자료들을 바탕으로 필자가 학습한 내용을 정리한 것입니다.

필자의 허락 없이 글을 상업적 목적으로 인용, 수정, 재배포할 수 없습니다. 내용의 오류 지적은 덧글로 받습니다.

 

 

독자가 객체지향 프로그래밍[각주:1]을 알고 있다는 가정하에 이 글을 작성하였다. 클래스와 객체의 개념 설명은 기회가 되면 따로 작성할 생각이다.

 


클래스 형태

class Main {
  // Body
}

// No body
class Empty

class 키워드로 클래스를 선언한다. 몸체가 없으면 중괄호(braces)를 생략할 수 있다.

 

생성자

class Human constructor(name: String) { // 초기 생성자
    val myName = name // 프로퍼티 (Java 멤버 변수와 유사함)
    
    fun greet() {
        println("Hello! I'm $myName.")
    }
}

fun main() {
    val person = Human("Lazo") // Human 인스턴스 생성
    person.greet() // 출력: Hello! I'm Lazo.
}

생성자는 초기 생성자부수 생성자[각주:2]로 분류되며, constructor 키워드로 선언할 수 있다.

초기 생성자[각주:3]는 클래스 헤더에 위치하며, 어노테이션이나 접근 제어자가 없다면 키워드를 생략할 수 있다.

인스턴스(객체)를 생성할 때, Java처럼 new 키워드를 붙이면 안된다는 점을 상기하자.

 

생성자 위임

class Pet(val name: String) { // 초기 생성자
    var owner: String? = null
    
    // 부수 생성자. this(name)으로 초기 생성자를 위임
    constructor(name: String, owner: String) : this(name) {
        this.owner = owner
    }
}

fun main() {
    val pet1 = Pet("Doggy")
    val pet2 = Pet("Kitty", "Lazo")
    
    // 이름: Doggy, 주인: null
    println("이름: ${pet1.name}, 주인: ${pet1.owner}")
    
    // 이름: Kitty, 주인: Lazo
    println("이름: ${pet2.name}, 주인: ${pet2.owner}")
}

부수 생성자는 반드시 초기 생성자를 위임(Delegate)해야 한다. 인스턴스 반환값을 초기 생성자로 넘긴다고 생각하면 될 것 같다. 콜론(:) 뒤에 this 키워드로 생성자를 참조하여 넘긴다.

생성자의 파라미터 앞에 val 또는 var 키워드가 붙으면, 해당 변수는 클래스의 프로퍼티(Property)가 된다.

 

초기화 블록

class Machine {
    init {
        println("Initialize")
    }
    constructor(x: Int) {
        println("Constructor 1")
    }
    constructor(x: Int, y: Int) : this(x) {
        println("Constructor 2")
    }
}

fun main() {
    Machine(1, 1)
}

/*
 * 콘솔 출력결과:
 * Initialize
 * Constructor 1
 * Constructor 2
 */

초기화 블록은 클래스가 객체를 만들 때 최초로 실행하는 코드이다. 초기 생성자보다도 먼저 실행된다.

 

생성자 접근제어

class MasterKey private constructor() { /* ... */ }

싱글톤 패턴이나 기타 여러가지 상황에 따라 생성자 접근을 제한시킬 필요가 있다.

생성자 키워드 앞에 접근 제어자(Access Modifier)를 붙이면 해결할 수 있다. 참고로 모든 개체들은 기본적으로 접근 제한이 public으로 풀려있는 점을 주의할 것.

 

 

  1. Object Oriented Programming, 필드와 함수로 구성된 여러 객체들이 서로 적절하게 상호작용하도록 만드는  패러다임이다. Java, C++, C#, Python, JavaScript 등 많은 언어가 이에 속한다. [본문으로]
  2. Secondary Constructor를 의역한 것이다. [본문으로]
  3. 초기 생성자가 없어도 문제는 없다. [본문으로]

'소프트웨어 공학 > 코딩 공부' 카테고리의 다른 글

3-3. Kotlin 클래스 추상화  (0) 2020.03.04
3-2. Kotlin 클래스 상속  (1) 2020.03.03
3. Kotlin 클래스  (0) 2020.03.03
2. Kotlin 자료형  (1) 2020.03.02
1. Kotlin 언어 개요  (2) 2020.03.02