불로구

[코틀린 기초] 13. 클래스(Class) <1> 본문

프로그래밍/코틀린

[코틀린 기초] 13. 클래스(Class) <1>

맹이맹이 2021. 3. 4. 02:34
반응형

클래스

- 클래스는 객체가 가지고 있는 데이터와 동작방법을 나타내는 정보이다.

- 프로그램 설명서에 의해 클래스가 생성되고 메모리에 객체가 만들어지면 인스턴스화 된 것이라 볼 수 있다.

 

클래스 생성

- 클래스는 class라는 키워드를 사용한다.

 

우선 간단하게 클래스를 생성해보자

class Computer(var cpu:String, var graphic:String, var ram:Int){
    override fun toString() = "cpu : $cpu ,  graphic : $graphic ,  ram : $ram"
}

Computer란 클래스를 생성하며 인자로 cpu, graphic, ram을 받았다.

toString을 오버라이딩하여 각가의 값을 출력해주었다.

val cpu1 = Computer("i5-8500", "gtx1080",16)
println(cpu1)

이렇게 cpu1이란 변수에 Computer를 할당하며 각가의 값을 넣어주었다.

println()을 통해 출력 시 오버라이딩된 toString()의 값이 출력된다.

 

이번에는 생성자를 통해 클래스를 생성해보자

class Computer2{
    var cpu : String
    var graphic : String
    var ram : Int

    constructor(cpu:String, graphic: String, ram: Int){
        this.cpu = cpu;
        this.graphic = graphic
        this.ram = ram
    }

    override fun toString(): String {
        return "cpu : $cpu ,  graphic : $graphic ,  ram : $ram"
    }
}

자바를 해본사람이라면 알겠지만 키워드만 다를뿐 코틀린에도 생성자가 존재한다.

constructor를 통해 클래스 호출 시 각각의 값을 받아 this 키워드를 통해 전역변수에 할당한다.

 

val cpu2 : Computer2 = Computer2("i7-10400" , "gtx3060", 32)
println(cpu2)

출력은 역시나 똑같지만 여기서 다른점은 우리는 변수를 선언할때 타입을 지정해주었다.

ex) var num : Int = 10

여기서도 클래스는 타입이 되며 Computer2라는 타입을 지정해서 생성하였다.

 

 

이번에는 특정 값은 있어도되고 없어도되는 클래스를 만들어보자

class Computer3(var cpu:String, var graphic:String){
    var ram : Int = 0
    constructor(cpu: String, graphic: String, ram:Int):this(cpu,graphic){
        this.ram = ram
    }

    override fun toString(): String {
        if(this.ram > 0){
            return "cpu : $cpu ,  graphic : $graphic , ram : $ram"
        }else{
            return "cpu : $cpu ,  graphic : $graphic , ram : 없음"
        }
    }
}

다음을 보면 Computer3를 생성 시 cpu와 graphic는 필수로 필요하지만 ram은 선택사항이다.

생성자를 보면 ram을 생성시 호출이되고, 생성자 옆에 : this(cpu, graphic)를 보면 인자로 받은 cpu와 graphic 값을

this키워드를 통해 클래스 키워드 옆에 생성자의 값에 할당한다.

    val cpu3 : Computer3 = Computer3("i5-8400", "gtx3060")
    val cpu3_s : Computer3 = Computer3("i7-8500", "gtx1080", 16)
    println(cpu3)
    println(cpu3_s)

Computer의 toString()을 오버라이딩한것을 보면 ram 값이 0이상일경우와 아닐경우 각각의 return값을 다르게했다.

 

다음은 위에 방법을 생성자 오버로딩을 통해 만들어보자

class Computer4{
    var cpu : String = ""
    var graphic : String = ""
    var ram : Int = 0
    constructor(cpu: String,graphic: String){
        this.cpu = cpu
        this.graphic = graphic
    }
    constructor(cpu: String, graphic: String, ram: Int){
        this.cpu = cpu
        this.graphic = graphic
        this.ram = ram
    }
    override fun toString(): String {
        if(this.ram > 0){
            return "cpu : $cpu ,  graphic : $graphic , ram : $ram"
        }else{
            return "cpu : $cpu ,  graphic : $graphic , ram : 없음"
        }
    }
}

자바를 배웠다면 다음코드가 이해가 될것이다.

오버로딩이란 같은 이름의 메서드를 타입, 인자개수 등을 다르게 재정의하는 것을 의미한다.

2개의 constructor를보면 첫번째는 2개의 인자, 2번째는 3개의 인자를 받아 각각의 값을 할당한다.

    val cpu4 : Computer4 = Computer4("i5-8500", "gtx1060", 16)
    val cpu4_s : Computer4 = Computer4("i5-8500", "gtx1060")
    println(cpu4)
    println(cpu4_s)
반응형
Comments