언어/Kotlin

Kotlin : Objectreference (ft. Call by value)

해리누나 2022. 9. 5. 22:10
728x90
반응형

저번에 썼던 코드를 다시 보자.

fun main(){

    fun calculateAmount (maxGlassContent : Double, currentBottleContent : Double, currentGlassContent : Double ) : Double{

        var amount = maxGlassContent - currentGlassContent

        if(currentBottleContent < amount){
            amount = currentBottleContent
        }

        return amount
    }

    fun pourWater (maxGlassContent : Double, currentBottleContent : Double, currentGlassContent : Double) : Unit {

        val toBeFilled = calculateAmount(maxGlassContent, currentBottleContent, currentGlassContent)

        val newBottleContent = currentBottleContent - toBeFilled
        val newGlassContent =  currentGlassContent + toBeFilled

        println("현재 잔의 물의 양은 $newGlassContent ml입니다." )
        println("현재 병의 남은 물의 양은 $newBottleContent ml입니다." )

    }


    var bottleContent: Double  = 800.0  //병
    //잔1
    var glassContent: Double= 40.0
    val maxGlassContent: Double = 150.0

    //잔2
    var glassContent2 : Double = 90.0
    val maxGlassContent2 : Double= 200.0

    println("잔1:")
    pourWater(maxGlassContent,bottleContent,glassContent)
    println("잔2:")
    pourWater(maxGlassContent2,bottleContent,glassContent2)

}

시행결과

 

결과를 보면 틀리지 않은 답이나와 문제될 게 없어보이지만,  변수 glassContent 와 glassContent2의 양은 변하지 않았다. 즉 함수 pourWater() 내에서의 변수 값만 변해있고 함수 외부에서의 값은 그대로다. ( Call by value )

이제 저번 포스트를 통해 클래스를 만드는 방법을 배웠으니, 이를 해결할 수 있다.

 

class Glass(var content: Double, val capacity: Double)
class Bottle(var content: Double)

fun main(){

    val bottle = Bottle(800.0)

    val glass1 = Glass(40.0,150.0)
    val glass2 = Glass(90.0,200.0)

    fun calculateAmount (maxGlassContent : Double, currentBottleContent : Double, currentGlassContent : Double ) : Double{

        var amount = maxGlassContent - currentGlassContent

        if(currentBottleContent < amount){
            amount = currentBottleContent
        }

        return amount
    }

    fun pourWater (bottle: Bottle,glass: Glass) : Unit {

        val toBeFilled = calculateAmount(glass.capacity, bottle.content, glass.content)

        bottle.content = bottle.content - toBeFilled
        glass.content =  glass.content + toBeFilled

        println("현재 잔의 물의 양은 ${glass.content} ml입니다." )
        println("현재 병의 남은 물의 양은 ${bottle.content} ml입니다." )

    }

    pourWater(bottle,glass1)
    pourWater(bottle,glass2)

    println(glass1.content)
    println(glass2.content)
    
 }

 

결과

 

결과를 보면 이제 glass 와 bottle 내 content가 성공적으로 같이 변했음을 볼 수 있다.

 

시작

 

결과 (pourWater 함수 후)

 

 

 

 

출처:

내용 / 도움준 곳: 학교 교수님 (Christian Kohls) 강의

728x90
반응형

'언어 > Kotlin' 카테고리의 다른 글

Kotlin : 중간점검  (1) 2022.10.11
Kotlin : ArrayList (배열 + 리스트)  (0) 2022.09.07
Kotlin : 클래스 (Class)  (0) 2022.09.02
Kotlin : 객체 (Object)  (0) 2022.06.24
Kotlin : 함수 선언과 호출  (0) 2022.06.18