코 틀린 클래스 호출 - ko teullin keullaeseu hochul

코틀린은 클래스를 정의할 때 동시에 생성자를 만들도록 할 수 있다.

다음 코드를 보자.

<생성자 자동 생성>

class Person(var name:String){
}

fun main() {
    var person1 = Person("Lee")
    println("person1의 이름은: ${person1.name}")
}


>> 출력
>> person1의 이름은: Lee

자바와는 다르게 코틀린은 클래스를 작성할 때 함수처럼 인자를 받을 수 있다.

위와 같이 클래스 객체 생성 시에 "Lee"라는 인자를 바로 넘겨주면 자동으로 생성자가 만들어지기 때문에

person1.name을 출력해보면 "Lee"가 할당되었음을 알 수 있다. 

참고:  init은 클래스 생성시 자동으로 실행되는 함수다.

class Person(var name:String){
    init {
        println("생성자 호출됨. 이름: $name")
    }
}

fun main() {
    var person1 = Person("Lee")

    println("person1의 이름은: ${person1.name}")
}

>> // 출력
>> 생성자 호출됨. 이름: Lee
>> person1의 이름은: Lee

<생성자 직접 생성>

자바처럼 생성자를 직접 작성할 수도 있다.

class Person{
    var name:String? = null
    var age:Int? = null
    constructor(){
    }
    constructor(_name:String?){
        this.name = _name
    }
    constructor(_name:String?, _age:Int?){
        this.name = _name
        this.age = _age
    }
}

fun main() {
    var person1 = Person()
    println("첫번째 사람 이름: ${person1.name} 나이: ${person1.age}")

    var person2 = Person("Kim")
    println("두번째 사람 이름: ${person2.name} 나이: ${person2.age}")

    var person3 = Person("Park", 20)
    println("세번째 사람 이름: ${person3.name} 나이: ${person3.age}")

}


// 출력
첫번째 사람 이름: null 나이: null
두번째 사람 이름: Kim 나이: null
세번째 사람 이름: Park 나이: 20

<생성자 자동 생성 + 생성자 직접 생성>

둘을 합쳐서 사용할 수도 있다. 단 이때는 constructor 뒤에 :을 붙이고 this(_name)을 추가시켜주어야 오류가 발생하지 않는다. 아래 코드의 결과를 보면

첫번째 사람은 생성자 자동생성을 사용했기 때문에 이름만 제대로 할당이 되었고

두번째 사람은 생성자 자동생성+직접생성을 사용했기 때문에 이름, 나이, 주소가 모두 할당되었다.

참고로 constructor 안에는 this.name = _name을 해줄 필요가 없다. 이미 생성자 생성 시 자동으로 할당되었기 때문이다. 

class Person(var name:String?){
    var age:Int? = null
    var address:String? = null

    constructor(_name:String?, _age:Int?, _address:String?):this(_name){
        this.age = _age
        this.address = _address
    }
}

fun main() {
    var person1 = Person("Kim")
    println("첫번째 사람 이름: ${person1.name} 나이: ${person1.age} 주소: ${person1.address}")

    var person2 = Person("Lee", 20, "Seoul")
    println("두번째 사람 이름: ${person2.name} 나이: ${person2.age} 주소: ${person2.address}")

}

// 출력
첫번째 사람 이름: Kim 나이: null 주소: null
두번째 사람 이름: Lee 나이: 20 주소: Seoul

지난 시간까지는 간단한 코틀린 코딩 방법과 타이머 만드는 방법까지 설명드렸습니다. 이번 시간부터는 본격적으로 코틀린과 자바의 차이점을 다뤄보려고 합니다. 제가 가장 익숙해지기 힘든 부분이기도 했고 자바와는 다른 부분이 너무 많아서 조금 고생했던 부분이기도 합니다. 바로 클래스 생성 부분이죠.

코 틀린 클래스 호출 - ko teullin keullaeseu hochul
코틀린 클래스 만드는 방법

코틀린은 자바와는 전혀 다른 방식으로 클래스 생성자와 클래스 내부 변수를 만듭니다. 코틀린 언어의 간결하다는 특징을 여실히 보여주는 가장 대표적인 부분이라고 저는 생각합니다. 자바에 익숙한 분이시면 조금 의아할 수도 있지만 익숙해지시면 더 간결하고 편하게 사용할 수 있죠.

    1. 코틀린에서의 클래스 생성 방법

    class Test()
    {}

    코틀린에서 클래스를 생성하는 방법은 평범합니다. 그냥 다른 언어에서 클래스를 생성하듯 class 이름 대괄호 순으로 클래스를 생성해주면 되죠. 코틀린에서는 default 스코프가 public으로 설정되어 있기 때문에 클래스 앞에 따로 public을 적어줄 필요도 없습니다.

    코 틀린 클래스 호출 - ko teullin keullaeseu hochul
    상속

    만약 다른 클래스를 상속받고 싶다면 콜론[:]을 추가한 뒤 그 뒤에 상속받고 싶은 클래스를 적어 넣으면 됩니다.

    코 틀린 클래스 호출 - ko teullin keullaeseu hochul
    인터페이스

    인터페이스를 추가할 때에는 클래스 이름 뒤에(상속받은 클래스가 있다면 해당 클래스 뒤에) 컴마[,]를 추가한 뒤 적어줍니다.

    class Test():JLabel(),EventListener
    {}

    위 코드가 인터페이스와 상속을 모두 적용해본 코틀린 클래스입니다. 부모 생성자 호출의 경우 상속 클래스의 괄호 안에 적어 넣어주면 생성자가 호출될 때 자동으로 호출됩니다. 이 부분은 나중에 설명드리겠습니다.

    2. 코틀린에서 매개변수 생성 방법

    코틀린은 클래스에 전달될 매개 변수를 생성할 때 클래스 이름 바로 옆에 괄호() 안에 생성할 수 있습니다. 바로 아래 사진처럼 말이죠.

    코 틀린 클래스 호출 - ko teullin keullaeseu hochul
    매개변수 생성 방법

    위 사진처럼 변수를 생성하면 클래스를 생성할 때 매개변수로 집어넣어줄 때 따로 클래스 내부 변수에 저장해주는 코드를 생성자에 집어넣어 줄 필요가 없습니다. 즉 자바와 같이 프로그래머가 변수를 직접 옮겨주지 않아도 클래스 내부 변수에 저장되어 편하다고 생각할 수 있겠죠.

    위 코드를 코틀린 코드와 자바 코드로 각각 작성해보면 아래와 같습니다.

    코틀린
    class Test(
            private var num:Int,
            private var name:String
    )
    자바
    public class Test {
    	private int num;
    	private String name;
    	public Test(int num,String name) 
    	{
    		this.num = num;
    		this.name = name;
    	}
    }

    자바의 경우 생성자 내부에 코드를 더 적어 넣어줘야 하는 불편함도 있고 코드 길이도 코틀린이 더 간결합니다.

    코 틀린 클래스 호출 - ko teullin keullaeseu hochul
    매개변수의 생명주기

    위와 같이 클래스 매개변수에 var/val 형식으로 변수를 형성하지 않는다면 생성자에서만 사용 가능한 변수가 됩니다. 즉 생성자가 실행된 뒤 사라지는 변수로 만들어 줄 수 있습니다. 아래 사진을 보실까요?

    코 틀린 클래스 호출 - ko teullin keullaeseu hochul
    사용할 수 없는 수명이 끝난 매개변수

    위 사진을 보면 생성자[init]가 아닌 다른 함수를 만들어 변수를 호출하니 붉은 색으로 표시되며 오류가 발생합니다. 이처럼 클래스 매개변수의 생성 방식에 따라 변수의 생명주기를 정해줄 수 있습니다. 이제 생성자로 넘어가봅시다.

    3. 코틀린에서의 생성자 init()

    코틀린에서는 클래스 이름으로 생성자를 만들지 않습니다. 위에서 잠시 보여드렸던 것처럼 init() 함수를 통해 생성자를 만들어주죠. 또 생성자는 클래스가 받는 매개변수를 그대로 호출할 수 있습니다.

    코 틀린 클래스 호출 - ko teullin keullaeseu hochul
    기본 생성자

    Init은 그 자체로 키워드이기 때문에 따로 앞에 뭘 적어주거나 하지 않아도 됩니다. 클래스가 받은 모든 매개변수를 사용할 수 있고 이곳에서 생성자에서만 가능한 작업을 할 수 있습니다.

    하지만 init으로 생성 가능한 건 기본 생성자뿐입니다. 그래서 다른 매개변수를 받는 생성자를 만드는 생성자 오버 로딩은 constructor이라는 키워드를 통해 가능합니다.

    해당 부분은 다음 강의에서 진행해보도록 하겠습니다.


    이번 포스팅에서는 코틀린에서의 클래스에 대해 알아보았습니다. 자바를 배운 직후 코틀린을 처음 사용했을 때 코틀린에서의 클래스 부분 때문에 조금 애먹었던 기억이 나는군요.

    근데 최근에는 자바보다 더 편하게 코딩할 수 있는 것 같아 좋습니다.

    그럼 이번 포스팅은 여기에서 마치도록 하고 다음에 코틀린 생성자 constructor으로 찾아뵙도록 하겠습니다.

    긴 글 읽어 주셔서 감사합니다.


    이전 글 읽기

    [Kotlin][4]코틀린 timer 함수 기본 사용법과 println, print의 차이에 대하여

    안녕하세요. 오랜만에 코틀린 강좌로 다시 찾아왔습니다. 한동안 프로그래밍 관련 강좌를 하지 않았었는데 그 이유는 어떤 것을 먼저 설명해드리면 좋을 지 몰라서 그랬어요. 그런데 안드로이

    postiveemblem.tistory.com

    코 틀린 클래스 호출 - ko teullin keullaeseu hochul

    이전 글 읽기

    [Kotlin][5]코틀린 readline()과 자료형 변환 방법

     안녕하세요. 오늘은 저번 타이머 함수 사용법에 이어서 readline()을 이용해 사용자에게 입력받는 법을 알아보려고 합니다. 또 입력 받은 모든 값을 스트링 값으로 반환하는 readline()을 어떻게 하

    postiveemblem.tistory.com

    코 틀린 클래스 호출 - ko teullin keullaeseu hochul

    이 글의 저작권은 전적으로 작성자인 P_Emblem에게 있으며
    허락 없는 사용을 금합니다.