hyeals study
[코틀린] 특이한 생성자와 프로퍼티를 갖는 클래스 본문
- 코틀린은 primary 생성자와 secondary 생성자를 구분함.
- 또한 코틀린에서는 초기화 블록을 통해 초기화 로직을 추가할 수 있음.
[주(primary)생성자 초기화]
- 보통 클래스의 모든 선언은 중괄호({})에 들어가 있음
- 하지만 위의 클래스 선언 예시를 보면 중괄호가 없음. 대신에 val 선언만 존재함. → 이처럼 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드를 주 생성자 라고 함.
<주 생성자 목적>
- 생성자 파라미터를 지정
- 지정한 생성자 파라미터에 의해 초기화 되는 프로퍼티를 정의
따라서 위의 코드를 풀어쓰면 아래와 작은 코드로 이해할 수 있음
- constructor 키워드: 주 생성자나 부 생성자 정의를 시작할 때 사용
- init 키워드: 초기화 블록을 시작함.
- _nickname: 생성자 파라미터임. 밑줄(_)은 프로퍼티와 생성자 파라미터를 구분해줌. → 자바의 this.nickname = nickname 처럼 생성자 파라미터와 프로퍼티의 이름을 같게하고 프로퍼티에 this를 써도됨.
* 초기화 블록: 클래스의 객체가 만들어질 때(=인스턴스화될 때) 실행될 초기화 코드가 들어가 있음.
☞ 초기화 블록은 주 생성자와 함께 사용됨. → 주 생성자는 제한적이기 때문에 별도의 코드를 포함할 수 없어서 초기화 블록이 필요함.
☞ 필요에 따라 클래스 안에 여러 초기화 블록을 선언할 수 있음
* 프로퍼티를 초기화하는 식이나 초기화 블록 안에서만 주 생성자의 파라미터를 참조할 수 있음.
* 클래스의 인스턴스를 만들고 싶으면 new 키워드없이 그냥 생성자를 직접 호출하면 됨.
* 클래스에 기반 클래스가 있으면 주 생성자에서 기반클래스 생성자를 호출해야 함.
☞ 기반 클래스를 초기화 하기 위해서 기반 클래스 이름 뒤에 괄호를 치고 생성자 인자를 넘김.
* 클래스를 정의할 때 별도로 생성자를 정의하지 않으면 컴파일러가 자동으로 디폴트 생성자를 만들어줌.
☞ 디폴트 생성자: 아무 일도 하지 않고 인자가 없음.
* 어떤 클래스를 클래스 외부에서 인스턴스화하지 못하게 막고 싶을 때 모든 생성자를 private로 만들면 됨.
[부(secondary) 생성자 초기화]
<부 생성자가 필요한 경우>
☞ 프레임워크 클래스를 확장해야할 때 여러 방법으로 인스턴스를 초기화할 수 있게 다양한 생성자를 지원해야 하는 경우
* 부 생성자는 constructor 키워드로 시작함
* 클래스에 주 생성자가 없다면 모든 부 생성자는 반드시 상위 클래스를 초기화하거나 다른 생성자에게 생성을 위임해야 함.
본 게시물은 "Kotlin IN ACTION"을 참고함.
'코틀린' 카테고리의 다른 글
[코틀린] object 키워드 (0) | 2020.02.19 |
---|---|
[코틀린] 컴파일러가 생성한 메소드 (0) | 2020.02.19 |
[코틀린] 클래스 계층 정의 (0) | 2020.02.18 |
[코틀린] 로컬 함수 (0) | 2020.02.07 |
[코틀린] 컬렉션 처리 (0) | 2020.02.06 |