작성
·
450
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
안에 객체를 생성하는 코드를 작성하면 정적 팩토리 메소드인 것이 맞습니다!!! ㅎㅎㅎㅎ