👍 오늘의 목표
이번 포스팅에서는 코틀린의 클래스와 오브젝트에 대해 공부해 보겠습니다.
1. 클래스 선언
class Person { /*...*/ }
class Person // 본문 없으면 중괄호 생략 가능
코틀린에서 클래스를 선언할 때는 class 키워드와 함께 위와 같이 사용합니다.
클래스에 본문이 없으면 중괄호를 생략하고 선언이 가능합니다.
참고로 코틀린에서는 가시성 변경자를 붙이지 않으면 기본으로 public입니다.
가시성 변경자는 자바에서 접근 제한자와 동일한 것으로, 이에 대해서는 뒤에서 자세히 다루겠습니다.
val myPerson = Person()
객체를 선언할 때는 자바와 달리 new 키워드 없이 선언할 수 있습니다.
2. 생성자
코틀린에서는 하나의 주 생성자(primary constructor)와 여러 개의 부 생성자(secondary constructor)를 사용할 수 있습니다. 그리고 초기화 블록(initializer block)을 사용하여 초기화 로직을 구성할 수 있습니다.
2.1 주 생성자(primary constructor)
public class Person {
String name;
int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
자바에서는 위와 같이 클래스를 선언 후 생성자를 이용하여 필드들을 초기화하였습니다.
특징은 생성자 이름이 클래스 이름과 같으며, 생성자의 매개변수가 필드와 같다면 this 키워드를 사용했습니다.
class Person constructor(name: String, age : Int){
val name : String = name
val age : Int = age
}
코틀린에서는 constructor 키워드를 사용하여 클래스 헤더에 주 생성자를 함께 선언합니다.
class Person (name: String, age : Int){
val name : String = name
val age : Int = age
}
만약 주 생성자에 어노테이션이나 가시성 변경자(visibility modifiers)가 없다면 constructor 키워드를 생략할 수 있습니다.
class Person (val name: String, val age: Int){ }
주 생성자에 파라미터에 val 또는 var 키워드를 추가하면 파라미터에 상응하는 프로퍼티가 자동으로 생성됩니다.
class Person (val name: String, val age: Int = 25){ }
val myPerson1 = Person("고기", 20)
val myPerson2 = Person("좋아")
생성자 파라미터에 디폴트 값을 정의할 수 있습니다.
myPerson2 객체를 출력해보면 age 프로퍼티는 디폴트 값인 25로 초기화되어있습니다.
2.2 초기화 블록 (initializer block)
class Person (val name: String, val age: Int = 25){
init {
println("주 생성자 초기화 블록")
}
}
주 생성자에는 어떠한 실행문도 포함할 수 없습니다. 따라서 초기화를 위한 코드를 넣으려면
init 키워드를 이용하여 초기화 블록(initializer block)을 사용할 수 있습니다.
객체를 선언해 보면 위와 같이 초기화 블록 안에 있는 println 구문이 출력됩니다.
초기화 블록은 여러 개 사용할 수 있으며, 보통 초기화 시에 필요한 유효성 작업 등을 하기 위해 사용됩니다.
class Person (val name: String, val age: Int = 25){
val address : String = ""
init {
println("주 생성자 초기화 블록")
}
constructor(name : String, age : Int, address : String) : this(name, age){
println("부 생성자")
}
}
fun main(){
val myPerson = Person("고기",25,"티스토리")
}
init 블럭은 주 생성자의 일부 이므로 호출 순서를 출력해보면 다음과 같이 init 블록 호출 후
constructor 부 생성자가 호출되는 것을 알 수 있습니다.
(* 만약 주 생성자가 없다고 하더라도 init 블록이 항상 먼저 호출됩니다.)
2.3 부 생성자(secondary constructor)
class Person (val name: String){
var age : Int = 20
constructor(name: String, age : Int) : this(name){
this.age = age
}
}
주 생성자 이외에 여러 개의 생성자를 만들고 싶을 때는 constructor 키워드를 사용하여 생성자를 선언합니다.
중요한 점은 constructor로 생성된 생성자는 반드시 주 생성자를 상속받아야 하는 구조이므로
this 키워드를 이용하여 주 생성자를 호출하게 됩니다.
이때 constructor로 생성된 생성자는 반드시 주 생성자가 가지고 있는 인자들을 가지고 있어야 합니다.
class Person {
constructor(name: String) { }
constructor(age : Int) { }
constructor(name : String, age : Int) { }
}
기본 생성자가 없다면 this 키워드를 사용하지 않고 constructor를 자유롭게 사용할 수 있습니다.
다만 주의할 점이 있는데, 앞에서 주 생성자에서는 사용했던 var, val 키워드는 부 생성자에서는 사용하지 못합니다.
즉 주 생성자에서만 var, val 키워드를 사용할 수 있습니다.
위와 같이 constructor에서 var이나 val 키워드를 사용 시 허용되지 않는다는 에러가 발생합니다.
3. 코틀린 가시성 변경자 (접근 제한자)
코틀린에서 가시성 변경자의 종류는 총 네가지로 private, protected, internal, public 가 있습니다.
가시성 변경자를 명시하지 않으면 기본적으로 public으로 지정됩니다.
3.1 패키지 관점
패키지 관점에서 가시성 변경자에 대해 알아보겠습니다.
private | 해당 파일 안에서만 접근 가능 |
protected | 최상위(top-level)에 정의되는 클래스, 인터페이스 등에서는 사용 불가 |
internal | 같은 모듈 내에서 접근 가능 |
public | 어디에서나 접근 가능, 기본 가시성 변경자 |
3.2 클래스, 인터페이스 관점
클래스, 인터페이스 관점에서 가시성 변경자에 대해 알아보겠습니다.
private | 클래스 내부에서만 접근 가능 |
protected | private과 같지만, 서브 클래스에서도 접근이 가능함 |
internal | 같은 모듈 내에서 접근 가능 |
public | 어디에서나 접근 가능, 기본 가시성 변경자 |
3.2 생성자 관점
생성자에도 가시성 변경자를 붙일 수 있는데, 이 경우에는 생성자에 constructor 키워드를 붙여줘야 합니다.
private | 클래스 내부에서만 접근 가능 |
protected | 지정할수 없음 |
internal | 같은 모듈 내에서 접근 가능 |
public | 어디에서나 접근 가능, 기본 가시성 변경자 |
참고로 지역 범위 안에서 생성된 지역 변수, 함수 및 클래스는 가시성 수정자를 가질 수 없습니다.
internal 키워드의 경우 같은 모듈 내에서 접근이 가능하다고 하는데, 같은 모듈이란 다음을 의미합니다.
- Intelliji IDEA 모듈
- Maven 프로젝트
- Gradle 소스 세트
- <kotlinc> Ant 태스크를 한 번 호출하여 컴파일된 파일 세트
다음 포스팅에서는 상속과 오버라이딩, 인터페이스에 대해 알아보도록 하겠습니다!
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 변수, 자료형, 타입추론, null (4) | 2021.02.03 |
---|---|
[Kotlin] 코틀린 HelloWorld 출력하기 + IntelliJ 기본설정 (3) | 2021.02.02 |
[Kotlin] 코틀린 프로그래밍 시작하기 - 개발환경 구축 IntelliJ 설치 (0) | 2021.02.02 |