Kotlin - 생성자(constructor), init

이동수·2024년 9월 3일

Kotlin

목록 보기
15/33
post-thumbnail

class P(var name : String, val birth :Int) 클래스 속성들을 선언함과 동시에 생성자도 선언한 것

constructor(생성자)

  • 새로운 인스턴스를 만들기위해 호출하는 특수한 함수
  • 인스턴스 속성을 초기화 - 인스턴스의 파라미터로 넘겨줄 값을 만드는
    • var a = P("이동수",1998) 같이 ()안에 값이있는거
  • 인스턴스 생성시 필요한 구문을 수행 (init을 통해 가능)
  • 클래스 이름 옆에 ()로 불러싸인 코드
  • java는 기본생성자, 보조생성자 구분X - 코틀린에서만 구분됨
  • 클래스 별로 1개만 가질수 있음
  • 클래스 해더의 일부
  • 클래스 이름 뒤에 작성
    class Person constructor(firstName: Strint){}
  • 어노테이션이나 접근지정자가 없을때는, 기본생성자의 constructor 키워드 생략가능
    class Person (firstName: Strint){}
  • 기본생성자는 코드를 가질 수 없음
    • 기본생성자 코드는 init블록 안에 들어간다.

    • 기본생성자의 파라미터는 init 블록 안에서 사용 가능

    • 초기화는 초기화블록 안에서 작성해야함. init

      fun main() {
          val obj = Customer("kotlin")
          println(obj)
      }
      class Customer constructor(name: String) {
          init {
      		    //프로퍼티 초기화 문장들. 프로퍼티 = name
             println("$name")
          }
      }
      	
    • 기본 생성자의 파라미터는 프로퍼티 초기화 선언에도 사용 가능

       class Customer(name: String) {
      	 val key = name.toUpperCase()
      	}
    • 프로퍼티 선언 및 초기화는 기본생성자에서 간결한 구문으로 사용가능

      class Person(val firstNmae: String, val lastName: String){
      }
    • 기본생성자에 어노테이션, 접근지정자 등이 있는 경우 constructor키워드가 필요함 (이럴때는 생략 불가)

      class Customer public @Ingect constructor(name: String){}

init(초기화 블럭 )

  • 코틀린만있음
  • 클래스 내의 맨위 선언
  • 패러미터나 반환형이 없는 특수한함수
  • 생성자를 통해 인스턴스가 만들어 질 때 호출되는 함수
    • 호출 순서 : 속성(var,val) → init → 부 생성자
  • 클래스 함수는 . 를 통해 호출해야하는데 이거는 그냥 바로 호출됨
  • 생성자 파라미터 이름과 속성이름이 같아도 상관 없다
fun main(){
    A(1)
}
class A(a: Int){
    var a: Int = 3
    
    init {
        var a: Int =2
        println(this.a) //class 속성 a
        println(a) // init안의 a
    }
    fun print(){print(a)}

}
// 출력 3 2

보조생성자

  • constructor() 키워드 사용
  • 년도가 1996년생이 90%면 다 입력하기 비효울적이자나 그때쓰이는구만
  • 보조생성자 만들때 반드시 기본 생성자를 통해 속성을 초기화 해주어야함
  • 보조생성자가 기본생성자를 호출하려면 : 붙이고 this라는 키워드를 사용하고 기본생성자가 필요로 하는 패러미터를 ()에 넣으면된다
    • constructor(name : String) : this(name,1996) 이름은 받은 그대로 넘겨주고 년도는 1996년을 초기화함

this()에 의한 생성자 연결

fun main(){
    var a = P("이동수",1998)           //인스턴스
    var b = P("심섬재",1997)           //위에는 아무 것도 출력을 못하는데 이거는 인스턴스 생성을하면서 init 이 호출돼 바로 init함수 실행
    var c = P("소진호",1999)
    var d  = P("심성재")   //보조 생성자가 1996년으로 해놨음
    
                          //출력 나는 심성재 1996년생입니다
                          //출력 보조생성자 사용

}

class P(var name : String, val birth :Int){
    init{       //함수
        println("나는 ${this.name}이고 ${this.birth}년생입니다") //this는 인스턴스 자신의 속성이나 함수를 호출하기위해 클래스 내부에서 사용되는 키워드 임
    }

    constructor(name : String) : this(name,1996){ //보조생성자함수 ()안에있는게 파라미터임, 년도는 1996으로 고정했다느뜻
        println("보조생성자 사용")
    }
}
  • 클래스 별로 여러개 가질 수 있음 (0~여러개)
  • 기본생성자 없이 보조생성자 여러개 만들수도있음
  • 보조생성자 클래스 바디에 생성 (기본생성자는 클래스 해더에 생성)
  • constructor 키워드로 선언
class Person {
	constructor(parent: Person){
		parent.children.add(this)
	}
}
	
  • 클래스가 기본생성자를 가지고 있다면, 각각의 보조생성자들은 기본생성자를 직접or간접적으로 위임해 주어야함
  • this 키워드를 이용
    • 직접적: 기본생성자에 위임

    • 간접적: 다른 보조생성자에 위임

      class Person(val name: String) {
      	constructor(name:String, parent: Person): this(name){
      		
      	}
      	constructor(): this("홍길동", Person()) {
      	
      	}
      }
      fun main(){
          var a = P("이동수",1998)           //인스턴스
          var b = P("심섬재",1997)           //위에는 아무 것도 출력을 못하는데 이거는 인스턴스 생성을하면서 init 이 호출돼 바로 init함수 실행
          var c = P("소진호",1999)
          var d  = P("심성재")   //보조 생성자가 1996년으로 해놨음
                                출력
                                나는 심성재 1996년생입니다
                                보조생성자 사용
      
      }
      
      class P(var name : String, val birth :Int){
          init{       //함수
              println("나는 ${this.name}이고 ${this.birth}년생입니다") //this는 인스턴스 자신의 속성이나 함수를 호출하기위해 클래스 내부에서 사용되는 키워드 임
          }
      
          constructor(name : String) : this(name,1996){ //보조생성자함수 ()안에있는게 파라미터임, 년도는 1996으로 고정했다느뜻
              println("보조생성자 사용")
          }
      }
      /*
      출력
      나는 이동수이고 1998년생입니다
      나는 심섬재이고 1997년생입니다
      나는 소진호이고 1999년생입니다
      나는 심성재이고 1996년생입니다
      보조생성자 사용
      */

생성된(generated) 기본생성자 (generated primary constructor)

  • 클래스에 기본생성자 or 보조생성자를 선언하지 않으면, 생성된 기본생성자가 만들어짐
  • generated primary constructor
    • 매개변수x
    • 가시성이 public임
  • 만약 생성된 기본생성자의 가시성이 public이 아니어야 한다면, 다른 가시성을 가진 빈 기본생성자를 선언해야함
    class A private constructor(){}

인스턴스 생성

  • 코틀린은 new 키워드가 없음
  • 객체를 생성하려면 생성자를 일반함수처럼 호출하면 됨
val invoice = Invoice()
val customer = Customer("lee")

아무 생성자도 선언 안될시

  • default primary constructor생성됨
  • constructor()은 생략가능
    class A constructor(){ //constructor()은 생략가능
    
    }

0개의 댓글