일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Oracle 18c HR
- 무료 오라클 설치
- Oracle 초기 사용자
- oracle
- Orace 18c
- 서평단
- 오라클 캐릭터셋 확인
- 오라클 캐릭터셋 조회
- ORA-00922
- ora-01722
- 윈도우 Oracle
- 비전공자를 위한 데이터베이스 입문
- 무료 오라클 데이터베이스
- 오라클 캐릭터셋 변경
- Oracle 사용자명 입력
- Oracle Express Edition
- Oracle 테이블 대소문자
- Oracle 테이블 띄어쓰기
- Oracle 사용자명
- ORA-12899
- Oracle 18c HR schema
- Oracle 윈도우 설치
- oracle 18c
- Oracle 18c 설치
- Today
- Total
The Nirsa Way
[Kotlin] 클래스와 생성자(생성자 실행 순서, 주 생성자, 보조 생성자, init 블록) 본문
[Kotlin] 클래스와 생성자(생성자 실행 순서, 주 생성자, 보조 생성자, init 블록)
KoreaNirsa 2025. 8. 22. 11:06※ 해당 코틀린 포스트들은 기본적으로 자바를 알고 있다는 가정하에 간단히 예제만 제공하여 설명됩니다.
코틀린의 클래스와 생성자(주 생성자, 보조 생성자, init 블록)
코틀린에서는 클래스와 생성자를 어떠한 방식으로 사용하는지 예제를 보며 확인해보도록 하겠습니다.
1. 클래스
기본적으로 클래스를 선언하는 방식은 자바와 동일하게 class를 사용하며, 그 안에 필드와 메서드들로 구성됩니다. 필드의 선언 및 초기화는 코틀린의 문법을 따라 타입을 명시해주면 됩니다. 문법을 제외하면 여기까지는 자바와 크게 차이가 없습니다.
class Person {
// var : 가변 (저장된 값 수정 가능)
// String : 해당 변수의 타입은 String으로 지정
var name: String = "Nirsa"
// 매개변수 및 반환값 없는 메서드
fun sayHello() {
println("Hello, my name is $name")
}
}
2. 주 생성자와 보조 생성자
주 생성자는 클래스명 뒤에 작성하여 만들 수 있습니다. 자바와 조금 다른 점이라면 주 생성자에 작성된 필드는 따로 정의해주지 않아도 됩니다. 주 생성자에 val 또는 var가 붙으면 자동으로 클래스 필드가 되어 저장됩니다. 만약, val 또는 var를 뺀다면 단순 매개변수로써만 활용되며 필드에 저장되지 않습니다.
class Person(val name: String) {
fun sayHello() {
println("Hello, my name is $name")
}
}
fun main() {
val p = Person("Nirsa")
p.sayHello()
}
또한 아래와 같이 보조 생성자를 만들 수 있는데, 주의해야 할 점은 this()를 사용하여 주 생성자와 같이 사용을 해주어야 합니다.
보조 생성자의 경우 매개변수에 val 또는 var가 붙지 않으므로 단순 매개변수로만 활용되기에 필드를 직접 생성해주어야 하며, 자바와 마찬가지로 this. 를 사용하여 매개변수로 전달받은 age 값을 클래스 필드 age에 저장해주어야 합니다.
아래 코드의 흐름은 보조 생성자가 호출되었을 때 바로 주 생성자(+ init 블록) 호출로 이어집니다. (아직 age는 초기화 전 상태)
class Person(val name: String) {
var age: Int = 0
// 보조 생성자
// 매개변수 name은 this 호출 시 사용
constructor(name: String, age: Int) : this(name) {
this.age = age
}
fun sayHello() {
println("Hello, my name is $name and my age is $age")
}
}
fun main() {
val p = Person("Nirsa", 19)
p.sayHello()
}
보조 생성자에서 this()를 호출해야하는 이유는 자바의 경우 아래와 같이 중복 코드가 발생하게 되는데, 코틀린에서는 주 생성자 + init 블록을 반드시 거치게 하여 이러한 중복 코드 없이 초기화를 보장하도록 하였습니다.
public class Person {
private String name;
private int age;
public Person(String name) { // 생성자 1
this.name = name;
}
public Person(String name, int age) { // 생성자 2
this.name = name; // 중복 코드 발생
this.age = age;
}
}
3. init 블록
init 블록은 주 생성자 → 필드 초기화 후 실행되는 블록입니다. 즉, 아래와 같은 코드가 있을 때 출력 값은 "Created: Nirsa, 0", "Hello, my name is Nirsa and my age is 19"가 나옵니다.
class Person(val name: String) {
var age: Int = 0
constructor(name: String, age: Int) : this(name) {
this.age = age
}
init {
println("Created: $name, $age")
}
fun sayHello() {
println("Hello, my name is $name and my age is $age")
}
}
fun main() {
val p = Person("Nirsa", 19)
p.sayHello()
}
마지막으로 정리하자면 전체적인 흐름은 다음과 같습니다.
- 보조 생성자 호출 : Person("Nirsa", 19)
- 보조 생성자 실행 → 블록 실행 전 주 생성자 먼저 호출 : this(name)
- 주 생성자 실행 : name = "Nirsa"
- 필드 초기화 : age = 0
- init 블록 실행 : "Created: Nirsa, 0" 출력
- 다시 보조 생성자로 돌아와 블록 안의 코드 실행 : this.age = 19
- 모두 완료되어 참조 변수(p)가 생성 되었으므로 p.sayHello() 호출 시 "Hello, my name is Nirsa and my age is 19" 출력
'Development > Kotlin' 카테고리의 다른 글
[Kotlin] 람다(Lambda)와 고차 함수(Higher-Order Function) 예시 (0) | 2025.08.22 |
---|---|
[Kotlin] 데이터 클래스, 오브젝트 클래스(data class, object class) (0) | 2025.08.22 |
[Kotlin] 상속과 오버라이딩 (open, override) (2) | 2025.08.22 |
[Kotlin] 코틀린 기본 문법 (if, when, for, white, 함수 선언과 호출) (0) | 2025.08.22 |
[Kotlin] 코틀린 변수와 타입, Null 처리 연산자 정리 (0) | 2025.08.20 |