📱 안드로이드 Android ~ Kotlin

[Kotlin/코틀린] 3 - 클래스와 생성자

핑크빛연어 2022. 2. 4. 15:40

 

🚨 클래스와 생성자

 

class 클래스 선언

 

class User { ... }

- 클래스의 본문 내용이 없으면 {} 생략가능
- 생성자는 constructor 라는 키워드로 선언하는 함수
- 클래스 안에 다른 클래스 선언 가능
- 클래스의 멤버는 생성자, 변수, 함수, 클래스로 구성
- 클래스는 객체를 생성해 사용하며 객체로 클래스의 멤버에 접근한다
- 코틀린(Kotlin)에서는 객체를 생성할 때 new 키워드를 사용하지 않고, 클래스 이름과 같은 함수로 객체 생성

class User {
    var name = "eun"  //변수

    constructor(name: String) {  //생성자
        this.name = name
    }

    fun someFun() {  //함수
        println("name : $name")
    }

    class SomeClass {}  //다른 클래스
}

fun main() {

    //객체 생성과 접근
    var user = User("eeun")
    user.someFun()
}

 

주 생성자

- 코틀린(Kotlin) 클래스는 생성자를 주생성자와 보조 생성자로 구분한다
- 주 생성자 선언은 필수는 아니며 한 클래스에 하나만 가능
- 주 생성자를 선언할 때 constructor 키워드는 생략 가능
- 주 생성자를 선언하지 않으면 컴파일러가 매개변수가 없는 주 생성자를 자동으로 추가함
- 주 생성자를 선언할 때 필요에 따라 매개변수 선언 가능

/* 주 생성자 선언 */
class User constructor() { ... }

/* constructor 키워드 생략 */
class User() { ... }  //constructor 생략가능

/* 매개변수가 없는 주 생성자 자동 선언 */
class User { ... }

/* 주 생성자의 매개변수 */
class User(name: String, count: Int) { ... }

 

주 생성자의 본문 - init 영역

- 주 생성자는 클래스의 선언부에 있기 때문에 {} 를 추가해서 본문을 구현할 수 없다
- 클래스 안에서 init 키워드로 지정한 영역에 주 생성자의 본문을 구현할 수 있다
- 생성자의 매개변수는 생성자에서만 사용할 수 있는 지역변수다
- 주 생성자의 매개변수는 생성자 안에서만 사용할 수 있는 지역 변수지만,
  매개변수를 var/var 키워드로 선언하면 클래스의 멤버 변수가 된다


/* 생성자의 매개변수를 init 영역에서 사용하는 예 */
class User(name: String, count: Int) {
    init {
        println("User > init() - name : $name")  //생성자의 매개변수를 init 영역에서 사용
    }
    fun someFun() {
//        println("someFun > name : $name")  //사용불가! - 생성자의 매개변수는 생성자에서만 사용할 수 있는 지역변수다
    }
}


/* 생성자의 매개변수를 다른 함수에서 사용하는 예 */
class User2(name: String, count: Int) {
    //클래스 멤버변수 선언
    var name: String
    var count: Int

    init {
        this.name = name
        this.count = count
        println("User2 > init() - name : $name")  //생성자의 매개변수를 init 영역에서 사용
    }

    fun someFun() {
        println("User2 > someFun() - name : $name")  //사용불가! - 생성자의 매개변수는 생성자에서만 사용할 수 있는 지역변수다
    }
}


/* 생성자의 매개변수를 클래스의 멤버 변수로 선언
*  - 주 생성자의 매개변수는 생성자 안에서만 사용할 수 있는 지역 변수지만 매개변수를 var/var 키워드로 선언하면 클래스의 멤버 변수가 된다
*  */
class User3(val name: String, val count: Int) {
    fun someFun() {
        println("User3 > someFun() - name : $name, count : $count")
    }
}


fun main() {
    //User 클래스의 객체 생성과 접근
    val user = User("eun", 10)  // => User > init() - name : eun

    //User2 클래스의 객체 생성과 접근
    val user2 = User2("eun", 10)  // => User2 > init() - name : eun
    user2.someFun()  // => User2 > someFun() - name : eun

    //User3 클래스의 객체 생성과 접근
    val user3 = User3("eun", 10)
    user3.someFun()  // => User3 > someFun() - name : eun, count : 10
}

 

보조 생성자

- 클래스의 본문에 constructor 키워드로 선언하는 함수
- 클래스 본문에 선언하므로 여러 개 추가 가능
- 보조 생성자도 생성자이므로 객체를 생성할 때 자동으로 호출된다.
- 생성자 본문을 중괄호 {} 로 묶어서 객체 생성과 동시에 실행할 영역을 지정할 수 있다
- 클래스 선언 시 주 생성자와 보조 생성자 모두 선언한다면 반드시 생성자끼리 연결해 주어야 한다 
  -> this() 구문을 이용해 주 생성자 호출



/* 보조생성자 선언 */
class User {
    constructor(name: String) {
        println("User > constructor(name) call ...")
    }
    constructor(name: String, count: Int) {
        println("User > constructor(name, count) call ...")
    }
}


/* 보조 생성자에서 주생성자 호출
*  - 보조 생성자는 객체를 생성할 때 호출되며, 이때 클래스 내에 주 생성자가 있다면 this() 구문을 이용해 주생성자를 호출해야 한다.
* */
class User2 (name: String) {
    constructor(name: String, count: Int) : this(name) {  //보조 생성자로 객체를 생성할 때 주생성자가 함께 호출됨
        println("User2 > constructor() - name : $name, count : $count")
    }
}


/* 보조 생성자가 여럿일 떄 생성자 연결
*  - 주 생성자가 있는 상태에서 보조 생성자를 여러 개 선언
*  - 보조 샌성자를 여러개 선언한다면, 보조 생성자에서 this() 로 다른 보조 생성자를 호출할 수 있다
*  */
class User3(name: String) {
    constructor(name: String, count: Int) : this(name) {
        println("User3 > constructor() - name : $name, count : $count")
    }
    constructor(name: String, count: Int, email: String) : this(name, count) {
        println("User3 > constructor() - name : $name, count : $count, email : $email")
    }
}


fun main() {
    val user1 = User("eun")  // => User > constructor(name) call ...
    val user2 = User("eun", 20)  // => User > constructor(name, count) call ...
    val user3 = User2("eun", 30)  // => User2 > constructor() - name : eun, count : 30

    // => User3 > constructor() - name : eun, count : 40
    // => User3 > constructor() - name : eun, count : 40, email : @@@
    val user4 = User3("eun", 40, "@@@")
}

 

 

감사합니당~:)

더보기
Kotlin/코틀린
728x90
반응형