달나라 노트

Kotlin - Class 본문

Kotlin

Kotlin - Class

CosmosProject 2021. 3. 15. 02:27
728x90
반응형

 

 

 

 

Original source = play.kotlinlang.org/byExample/01_introduction/01_Hello%20world

 

 

 

Kotlin도 객체 지향 언어이기 때문에 class는 상당히 중요한 개념입니다.

 

Class의 개념 자체에 대해선 아래 링크를 읽어봅시다.

cosmosproject.tistory.com/198?category=972064

 

 

여기선 Kotlin에서 어떻게 class를 사용하는지를 중점적으로 다뤄봅시다.

(미리 말씀드리면 python과 비슷하다고 느끼면 편합니다.)

 

 

class EmptyClass // 1

class PeopleInfo(val name: String, var age: Int) // 2

fun main() {
    val emptyclass = EmptyClass() // 3
    val peopleinfo = PeopleInfo("Bella", 25) // 4

    println(emptyclass) // 5
    println(peopleinfo.name) // 6
    println(peopleinfo.age) // 7

    peopleinfo.age = 26 // 8
    println(peopleinfo.age)
}


-- Result
EmptyClass@548c4f57
Bella
25

1. EmptyClass라는 이름의 class를 생성하지만 아무 내용이 없는 class입니다.

2. PeopleInfo라는 이름의 class를 생성하며 2개의 parameter를 받습니다. name은 val로 생성되어서 immutabe variable이며 age는 var로 생성되어 나중에 reassign이 가능하다는 것을 알 수 있습니다. 또한 각각의 data type은 String과 int이네요.

3. EmptyClass라는 class를 emptyclass라는 변수에 할당하여 emptyclass 객체를 생성합니다.

4. 위에서 선언한 PeopleInfo라는 이름의 class를 peopelinfo라는 변수에 할당하여 peopelinfo 객체를 생성합니다. 생성할 때 name, age parameter도 입력해줍니다.

5. 아무 내용이 없는 EmptyClass로 생성된 객체이니 어떠한 method도 attribute도 존재하지 않습니다.

6, 7. peopleinfo는 생성할 때 name, age라는 값을 입력했으니 이 두 값이 attribute로 존재합니다.

8. peopleinfo 객체의 age 값을 26으로 reassign 했습니다.

 

 

 

구문들이 완벽히 같진 않지만 python의 class와 사용 방식이 비슷하지 않나요?

 

 

 

 

 

이제 constructor라는 것을 알아봅시다.

class PeopleInfo(val name: String, var age: Int)

fun main() {
    val peopleinfo = PeopleInfo()

    println(peopleinfo.name)
    println(peopleinfo.age)
}

위 같은 코드를 쓰면 Error가 발생합니다.

왜냐면 val peopleinfo = PeopleInfo() 부분에서 PeopleInfo class의 parameter(name, age)를 적어줘야 했는데 적어주지 않았기 때문이죠.

 

 

class PeopleInfo(var name: String, var age: Int) {
    constructor(): this(name = "", age = 0)
}

fun main() {
    val peopleinfo = PeopleInfo()

    println(peopleinfo.name)
    println(peopleinfo.age)
}



-- Result

0

근데 class에 constructor라는 것을 사용하면 default 생성자를 설정해줄 수 있습니다.

그래서 위 예시에는 PeopleInfo에 아무 parameter로 명시하지 않고 peopleinfo 객체를 만들었지만

Error가 발생하지 않고 constructor에 명시된 parameter대로 객체가 생성되었습니다.

 

 

 

 

 

 

 

 

 

 

 

 

추가

class Temp {
    private var x: String = "Apple"
    var y: String = "Strawberry"

    var z: String = x + y
}

fun main() {
    var temp = Temp()

//    println(temp.x) // Error 발생
    println(temp.y)
    println(temp.z)
}


-- Result
Strawberry
AppleStrawberry

.별도의 얘기이긴 한데 class에서 변수 생성 시 private이라는 키워드를 사용할 수 있습니다.

이렇게 되면 Class로 객체를 만들었을 때 private 키워드가 붙은 변수는 객체에서 조회할 수 없습니다.

그래서 println(temp.x)가 에러를 발생시키죠.

다만 Class 내부에서 private 변수를 가지고 어떤 연산이나 특정 동작에 사용하는 건 가능합니다.

그래서 x + y의 결과값인 z는 temp.z의 형태로 참조 가능하죠.

 

 

 

 

추가2.

class Test(x: Int) {
    val temp = x
    
    fun getvalue() {
        return temp
    }
}

fun main() {
    val test = Test(1)
    
    val result_value = test.getvalue()
    println(result_value)
}


-- Result
1

위와 같은 코드가 있습니다.

잘 작동되는군요.

하지만 코드는 간결할수록 좋습니다.

위 코드를 refactoring해봅시다.

 

 

 

 

class Test(val x: Int) { // 1
    fun getvalue(): Int {
        return x // 2
    }
}

fun main() {
    val test = Test(1)
    println(test.getvalue()) // 3
}


-- Result
1

1. 이 예제로 말하고싶은 것의 핵심입니다.

refactoring 전 = class의 argument(이 예시에서는 x)로 주어진 값을 다른 변수(변수 명 = temp)에 할당하고 class 내에서 해당 값을 사용했습니다.

refactoring 후 = class의 parameter인 x 앞에 val이라는 변수 생성 키워드를 붙여서 class가 받은 parameter를 바로 x라는 변수에 할당하여 class내에서 사용할 수 있게 됩니다.

 

2. x를 return합니다.

 

3. refactoring 전 = test.getvalue()의 값을 다른 변수에 저장하고 해당 변수를 println으로 출력.

refactoring 후 = test.getvalue()를 println에서 실행하여 중간에 변수에 할당하는 과정을 없앰.

 

 

 

 

728x90
반응형

'Kotlin' 카테고리의 다른 글

Kotlin - when 구문  (0) 2021.03.15
Kotlin - Inheritance (상속)  (0) 2021.03.15
Kotlin - Null  (0) 2021.03.15
Kotlin - Variable  (0) 2021.03.15
Kotlin - Functions  (0) 2021.03.15
Comments