728x90

프로퍼티(Property)

Java에서는 데이터르 필드에 저장하며, 멤버 필드의 가시성은 보통 비공개(private)이다.

클래스는 자신을 사용하는 클라이언트가 그 데이터에 접근하는 통로로 쓸 수 있는 접근자 메소드를 제공한다.

보통은 필드를 읽기 위한 getter를 제공하고 필드를 변경 허용해야 할 경우 setter를 추가 제공할 수 있다.

Java에서는 필드와 접근자를 묶어 property 라구 부르며, 프로퍼티를 활용하는 프레임워크가 많다.

코틀린은 프로퍼티를 언어 기본 기능으로 제공한다.

class Person(val name: String, val age: Int)

코틀린에서는 Java 클래스의 getter를 val 프로퍼티처럼 사용할 수 있고, getter/setter 쌍이 있는 경우에는 var 프로퍼티처럼 사용할 수 있다.


코틀린에서는 하나의 파일에 하나 또는 여러개의 클래스를 정의할 수 있다.

하지만 유지보수의 용이성을 고려하여 가급적 하나의 클래스를 하나의 파일에 정의하는 것이 좋다.


가시성 제한자(visibility modifier)

 public

 함수나 속성이 클래스 외부에서 사용될 수 없다.

 코틀린의 기본 가시성은 public 이므로 가시성 제한자를 생략해도 된다.

 private

 함수나 속성이 정의된 클래스 내부에서만 사용될 수 있다.

 protected

 함수나 속성이 정의된 클래스 내부 또는 클래스의 서브 클래스에서만 사용될 수 있다.

 internal

 함수나 속성이 정의된 클래스가 포함된 모듈에서 사용될 수 있다.


코틀린에서는 자바에 없는 internal 가시성을 지원한다. 이것은 같은 모듈에 있는 클래스, 함수, 속성까리 상호 사용할 수 있다는 것을 뜻한다.


Java는 기본적으로 패키지 가시성을 지원한다. 즉, 가시성 제한자가 없는 메서드, 필드, 클래스는 같은 package에 있는 클래스에서만 사용 가능하다는 뜻이다.

코틀린에서는 package 가시성이 없다. 같은 package에 있는 클래스, 함수, 속성 등은 기본적으로 상호 사용할 수 있어서 굳이 별도의 가시성을 가질 필요가 없기 때문이다.


서로 다른 패키지에 있는 같은 이름의 클래스나 함수 등을 함께 사용할 경우에는 as 키워드로 별칭을 지정하여 이름 충돌이 생기지 않게 할 수 있다.


클래스 속성에서 var 는 변경 가능한 속성을, val 은 읽기 전용 속성을 지정하는 데 사용된다.


코틀린 생성자

코틀린은 자바, C++과는 달리 클래스 선언 부분에서 이름에 괄호를 붙여 생성자를 만들 수 있다.

이를 주 생성자(primary constructor)라고 한다.

코틀린 몸체에 보조 생성자가(secondary constructor)를 추가할 수 있다. 보조 생성자는 매개변수를 다르게 하여 여러 개를 정의할 수 있다.

    // (name: String, surname: String)  default constructor signature
    class Person(_name: String, surname: String) {
        // 맨 앞에 밑줄(_)이 있는 변수는 임시 변수를 나타낸다.
        // 매개변수를 포함해서 임시 변수는 한번 이상 참조될 필요가 없는 변수이며,
        // 1회용이라는 것을 나타내기 위해 이름 앞에 밑줄을 붙인다.

        val name: String

        // init block , represents the body of default constructor
        init { //주생성자와 함께 초기화 블럭
            // init 초기화 블록은 여러개 가능하다.
            name = _name
            Log.d("primary", name)
        }

        // secondary constructor
        // this(name,"") call to default constructor
        // constructor 로부터 생성된 생성자는 '기본 생성자'를 '상속' 받아야 한다.
        constructor(name : String):this(name,""){
            Log.d("secondary", "Hello")
        }
    }


class Person constructor(name: String) { /*...*/ }

primary constructor가 어노테이션이나 접근 제한자(public, private 등)을 갖고 있지 않다면 constructor 키워드를 생략할 수 있다.
class Person(name: String) { /*...*/ }

자바의 경우 생성자로부터 받아온 변수를 해당 클래스에서 사용할 때 생성자 내에서 [this.클래스변수 = 매개변수] 같은 형식으로 받아올 수 있다. 하지만 코틀린은 생성자 영역이 없어서 이렇게 할 수가 없다. 

코틀린에서는 기본과 보조 생성자에 추가하여 클래스 초기화 블럭도 정의할 수 있다.

초기화 블럭은 init 키워드로 정의한다. init 초기화 블록은 여러개 가능하다.

this.name = name

만일 속성을 초기화하는 코드가 복잡하다면 초기화 코드를 함수나 초기화 블럭에 넣은 것을 고려하자.


코틀린의 클래스는 secondary constructor도 가질 수 있다.
이때 사용되는 키워드는 constructor이고, primary constructor와 다르게 생략할 수 없다.
class Person {
    var children: MutableList<Person> = mutableListOf<Person>();
    constructor(parent: Person) {
        parent.children.add(this)
    }
}



728x90
블로그 이미지

Link2Me

,