인프런 커뮤니티 질문&답변

이용조님의 프로필 이미지

작성한 질문수

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

9강. 코틀린에서 클래스를 다루는 방법

부 생성자와 정적 팩토리 질문드립니다.

작성

·

443

2

부생성자 부분에서 조금 햇갈리는게 생겨서 문의드립니다.

그리고 정적팩토리도 말씀해주셨는데 제가 생각한게 맞나 문의드립니다.

코드는 아래와 같습니다.

아래 주석에 질문 있습니다.

constructor (alien: Alien) : this()<- 이부분에서 this를 좀 나중에 호출하고 싶은지 문의드립니다. 밑에 if를 처리하여 호출하고 싶거든요. 불가능한게 맞을까요?

fun main(args: Array<String>) {
    var alien = Alien("에얼리언", AlienType.AType)

    //부생성자로 person 생성
    var personFromSubConstructor = Person(alien)
    println("부생성자로 만든 person의 나이 : ${personFromSubConstructor.age}")

    //정적 팩토리로 person생성
    val personFromStaticFactory = Person.createPersonFromAlien(alien)
    println("주생성자로 만든 person의 나이 : ${personFromStaticFactory.age}")
}

class Person(
    val name: String,
    var age: Int
){
    //에어리언의 타입이 A면 10살, B면 20살
    constructor (alien: Alien) : this(alien.name, 0){ //질문1. 일단 임의값으로 주생성상자를 만들어서 객체를 초기화 한 다음에 바꿀수 밖에 없는 것인지 궁금합니다.
        if(alien.type == AlienType.AType)
            this.age = 10
        else
            this.age = 20
    }

    //질문2. 아래와 같은 코드를 정적 팩토리맞을까요?
    companion object{
        fun createPersonFromAlien(alien: Alien) : Person
        = if(alien.type == AlienType.AType) Person(alien.name, 10) else Person(alien.name, 20)
    }
}

class Alien(
    val name: String,
    val type: AlienType
)

enum class AlienType(type: String){
    AType("AType"), BType("BType")
}

답변 2

0

최태현님의 프로필 이미지
최태현
지식공유자

좋은 질문 남겨주셔서 감사드립니다!! 🙏 (대댓글로 두 번째 질문에 대해서 남겨두었어요~) 혹시라도 또 궁금하신 점 생기시면 편하게 질문 남겨주세요! 감사합니다!! 🙏

0

이용조님의 프로필 이미지
이용조
질문자

constructor (alien: Alien) : this(alien.name, if(alien.type == AlienType.AType) 10 else 20)
constructor (alien: Alien) : this(alien.name, alien.type.let{
    if(it == AlienType.AType)
        10
    else
        20
})

첫번째 질문은 위와같이 익스프레션이나 let같은 스코프 펑션 써서 해결하면 되겠꾼여...


 

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 용조님!! 😊😊 아이고~ 네네 맞습니다! 말씀해주신 두 가지 방법으로 name을 처리할 수 있습니다! 다만 개인적으로는 두 번째 방법은 age 를 가변 변수 (var)로 열어야 하다보니 불변 변수 (val) 를 쓸 수 있는 첫 번재 방법을 선호합니다!

 

그리고 질문 주신 두 번째 내용에 대한 답변도 이어 드리자면, 네네 맞습니다!!

Kotlin에서는 static 키워드 대신 companion object 를 활용해 정적인 함수, 정적인 변수를 표현하고 있습니다! 그래서 companion object 안에 객체를 생성하는 코드를 작성하면 정적 팩토리 메소드인 것이 맞습니다!!! ㅎㅎㅎㅎ