[Android / Kotlin] 클래스와 생성자 정리

영서·2023년 7월 5일
0

Kotlin Basics

목록 보기
2/5

1. 클래스

  • 클래스의 멤버는 생성자, 변수, 함수, 클래스로 구성된다.
  • class 키워드로 선언하고 클래스 안에 다른 클래스를 선언할 수 있다.
  • 객체 생성시 자바와 달리 new 키워드 사용 X

예제

// 객체 생성
fun main() {
	val user = User("Kim")
    user.someFun()
}

// 클래스 생성
class User {
    var name = "mess"
    constructor(name: String){
        this.name = name
    }
    fun someFun() {
        println("name: $name")
    }
    class SomeClass {}
}

2. 주 생성자

주 생성자 선언은 constructor 키워드로 클래스 선언부에 선언하거나 키워드 생략가능.

class User constructor() {
}
class User() {
}

주 생성자 선언은 필수는 아니며 한 클래스에 하나만 가능.
개발자가 클래스의 주 생성자 선언하지 않으면 컴파일러가 매개변수가 없는 주생성자를 자동으로 추가.

class User {
}

주 생성자의 매개변수 예제

class User(name: String, age: Int){ // 매개 변수 2개 있는 클래스 생성
}
val user = User("Won", 23) // 객체 생성

2.1 init 키워드 사용

입력

class User(name: String, age: Int){
	init {
    	println("생성자")
    }
}
fun main() {
	val user = User("Won", 23)
}

init 키워드를 사용하여 주 생성자의 본문을 구현할 수 있다. init은 보조 생성자로 객체를 생성할 때도 실행되나, 일반적으로 주 생성자의 본문을 구현하는 용도로 사용한다. 위 코드를 입력하면 아래 출력결과가 나오는 것을 알 수 있다.

출력

생성자

2.2 init을 사용하여 생성자의 매개변수를 클래스의 멤버 변수로 선언하는 방법

잘못된 예제

class User(name: String, age: Int){
	init {
    	println("$name $age") // 성공
    }
    fun someFun(){
        println("$name $age") // 오류 발생
    }
}
fun main() {
	val user = User("Won", 23)
}
  • 객체 생성시 생성자가 호출되어 init영역이 실행되기 때문에 이곳에서 생성자의 매개변수에 접근가능
  • 생성자의 매개변수는 지역 변수이므로 다른 함수에서는 사용할 수 없다. 그러므로 주석에 있는 내용대로 someFun() 함수는 오류가 발생한다.
  • 위의 코드를 올바르게 고쳐서 아래 코드를 확인하면, 클래스 안의 멤버 변수를 선언하여 init 영역안에서 클래스 멤버 변수에 생성자의 매개변숫값을 대입하는 것을 알 수 있다.

입력

class User(name: String, age: Int){
	// 클래스 멤버 변수 선언
    var name: String
    var age: Int
    init {
    	// 클래스 멤버 변수에 생성자 매개변숫값 대입
        this.name = name
        this.age = age
    }
    
    fun someFun(){
        println("$name $age") // 성공
    }
}
fun main() {
	val user = User("Won", 23)
    user.someFun()
}

출력

Won 23

2.3 생성자의 매개변수를 클래스의 멤버 변수로 선언하는 방법

  • 위에 init으로 하는 것보다 간단한 장점이 있음
  • 매개변수를 var나 val 키워드로 선언하면 클래스의 멤버 변수가 됨
  • 단, 원래 함수에서는 선언할 수 없고, 주 생성자에서만 가능하다.

예제

class User(val name: String, val age: Int){
    fun someFun(){
        println("$name $age") // 성공
    }
}
fun main() {
	val user = User("Won", 23)
    user.someFun()
}

따라서 위 코드에서 생성자의 매개변수 namecountsomeFun() 멤버 함수에서 사용할 수 있다.

3. 보조 생성자

  • 클래스의 본문에 constructor키워드로 선언한다.
  • 여러 개를 추가할 수 있다.

예제

class User {
    constructor(name: String){
        println("생성자 (name: String) 호출")
    }
    constructor(name: String, age: Int){
        println("생성자 (name: String, age: Int) 호출")
    }
}
fun main() {
	val user1 = User("Yoon")
    val user1 = User("Won", 23)
}

3.1 보조 생성자에 주 생성자 연결

주 생성자와 보조 생성자를 모두 선언하면 생성자끼리 연결해주어야 한다.

(1) 생성자를 연결해주지 않아 주 생성자와 보조 생성자 선언시 오류 발생하는 코드

class User(name: String){
    constructor(name: String, age: Int){ // 오류
        println("생성자 (name: String, age: Int) 호출")
    }
}

(2) 보조 생성자에서 주 생성자 호출하는 코드

class User(name: String){
    constructor(name: String, age: Int): this(name) { // 성공
        println("생성자 (name: String, age: Int) 호출")
    }
}
fun main() {
    val user1 = User("Won", 23)
}

this(name) 만 추가하면 보조 생성자로 객체 생성시 주 생성자가 함께 호출된다.

(3) 보조 생성자가 여러개일 때 생성자 연결

class User(name: String){
    constructor(name: String, age: Int): this(name) { 
        println("생성자 (name: String, age: Int) 호출")
    }
    constructor(name: String, age: Int, email: String): this(name, age) { // 성공
        println("생성자 (name: String, age: Int, email: String) 호출")
    }
}
fun main() {
    val user1 = User("Won", 23, "youn.com")
}

위의 코드처럼 보조 생성자에서 this()로 다른 보조 생성자를 호출할 수도 있다. 이때 보조 생성자로 객체를 생성한다면 주 생성자가 호출되게 해야 한다.

Reference

Book: 깡샘의 안드로이드 프로그래밍 with 코틀린

profile
Let it rip

0개의 댓글