ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 23.01.17 Kotlin Class와 생성자(init, constructor)
    개발 이야기/TIL 2023. 1. 17. 13:19

    저번 글에서 썼던 부분 중 생성자에 관한 부분이 보강이 필요한 것 같아서 하나씩 나누어서 재작성하는 중이다. 

    참고 강의: 

    https://www.udemy.com/course/best-android-12-kotlin

    Class vs instance vs object

    class는 기본적으로 청사진이라고 생각하면 된다. 이 표현이 어려우면 붕어빵틀이라고 생각하면 된다. 

    이 붕어빵 틀을 이용해서 우리는 실제 붕어빵, 객체(object)를 만들 수 있다. 또 그 안의 속재료를 변경할 수도 있다. 

    이 중 우리가 실제로 다루는 것, 사용하는 것들을 인스턴스라고 한다. 

    //class
    class Boong(ing:String){
    	
    }
    //object, instance
    shoBoong  = Boong("sho")
    phatBoong = Boong("redBean")

    Constructor(생성자)

    새로운 인스턴스를 만들 때, 혹은 만들기 위해 호출하는 함수

    인스턴스 초기화 메소드라고도 한다. 

    역할:  1. 인스턴스의 속성을 초기화 2.인스턴스 생성시 구문을 수행 

    다만, 생성자는 초기화의 역할만 해주는 것이 좋다. 생성자는 최대한 간단한 것이 좋다고 한다. 

     

    주생성자(primary)와 보조생성자(secondary) 

    primary 생성자는 class정의와 동시에 생성자를 정의하는 경우를 말한다. Class의 parmaeter가 정의되어있는 경우 해당 파라미터가 바로 주생성자이다. 

    주생성자는 필요에 따라 정의할수도 있고, 안 할 수도 있다. 

    주생성자만 val, var변수를 가질 수 있다.

    Secondary는 주생성자 이외에 다양한 인자를 받는 경우에 관해서 정의한다.

    consturctor라고 작성하고 작성한다.

    예를 들어 붕어빵의 속을 정하고 난 뒤, 개수까지 한번에 정의한다면, 해당 부생성자를 이용할 것이다. 

    이 때 부생성자는 주생성자를 먼저 호출한 후 호출된다(:this(in)을 보자)

    //class
    class Boong(in:String){
    
    //sub construcor 
    //에러 발생 
    //    constructor(in: String, num:Int){
    //    	this.in = in
    //    }
    
     	constructor(in: String, num:Int):this(in){
        	this.in = in
            //this는 class Boong을 의미한다. 즉, this.in은 Boong의 in property을 의미 
        }	
    }
    
    //object, instance
    shoBoong  = Boong("sho")
    phatBoong = Boong("redBean", 10)

     

    init과 초기화

    init블록은 primary 생성자에 코드를 포함시킬 수 없기에 초기화 코드, 혹은 유효성 검사를 하기 위해서서 존재한다. 

    init 블록의 호출 시점은 primary -> init -> secondary 순이다. 

    매개변수가 없고, 반환되는 값이 없다. 

    //class
    class Boong(in:String){
        // Member Variables (Properties) of the class
        var in: String
    	init{
        	this.in = in
        }
    
     	constructor(in: String, num:Int):this(in){
        	this.in = in
            //this는 class Boong을 의미한다. 즉, this.in은 Boong의 in property을 의미 
        }	
        fun howBoong(){
        //해당 함수는 member변수 in을 이용한다, 즉 this.in = in이 없으면 $in을 찾을 수 없다, scope문제
        	println("$in")
        }
    }
    
    //object, instance
    shoBoong  = Boong("sho")
    phatBoong = Boong("redBean")

    위의 코드의 경우 in을 우리가 property로 사용하기 위해서 class 내부에서 var로 재정의하고, 이를 init블록에서 this를 통해 할당하는 코드이다. 

    primary 생성자에 var과 val 

    var과 val을 primary생성자에 적어줄 수 있다고 했다. 이는 무슨 차이를 만들어 낼까? 

    기본적으로 var,val로 선언한것과 아닌 것을 비교하면 아래 코드와 같다. 

    즉, 작성하는 경우 생성자 호출과 함께 멤버변수(혹은 property)로 저장된다(When you write val/var within the constructor, it declares a property inside the class. When you do not write it, it is simply a parameter passed to the primary constructor, where you can access the parameters within the init block or use it to initialize other properties.)

    https://stackoverflow.com/questions/45821929/in-which-situation-val-var-is-necessary-in-kotlin-constructor-parameter

    //class
    class Boong(var in:String){
        // Member Variables (Properties) of the class
    	//var in:String
    	//init{
        //	this.in = in
        //}
    
     	constructor(in: String, num:Int):this(in){
        	this.in = in
            //this는 class Boong을 의미한다. 즉, this.in은 Boong의 in property을 의미 
        }	
        fun howBoong(){
        //해당 함수는 member변수 in을 이용한다, 즉 this.in = in이 없으면 $in을 찾을 수 없다, scope문제
        //하지만 var in:String으로 생성자에서 작성하면서 member 변수에 var in:String = in과 동일한 문법이 되었다.
        	println("$in")
        }
    }
    
    //object, instance
    shoBoong  = Boong("sho")
    phatBoong = Boong("redBean")

    또 추가로 이는 getter과 setter과도 연관이 있는데 이는 다음에 더 자세히 작성하도록 하겠습니다. 

    '개발 이야기 > TIL' 카테고리의 다른 글

    23.1.17 Kotlin Setter&Getter  (0) 2023.01.17
    Kotlin Data Class  (0) 2023.01.17
    23.01.14 Kotlin Class와 field  (0) 2023.01.14
    23.01.13 Kotlin not null operator !!.  (0) 2023.01.13
    23.01.10 python list와 2차원 배열  (0) 2023.01.11
Designed by Tistory.