언어/Kotlin

Kotlin : 변수 var 과 val

해리누나 2022. 6. 16. 08:36
728x90
반응형

1. 변수의 필요성

 

물론 변수가 없이도 우리는 예를 들어 어떤 수학적인 계산을 이어갈 수가 있다.

PI * pow(5.0,2.0)

그냥 위와 같은 값을 얻고 싶다 가정한다면, 변수가 필요없겠지만 여기서 생각해 봐야할 점이 있다.  값을 얻으면 그대로 끝이라는 것이다. 무슨 말이냐면, 이 얻은 값을 결과로 다른 연산들을 이어가고 싶어질 시, 같은 코드를 다시 그대로 써야 한다는 것이다. 5가지 정도만의 연산을 이어서 한다고 해도 코드는 길어질대로 길어져 읽기가 불가능해 질 것이다.

 

그렇게 쓰여진 코드는 시간이 지나서 다시 보게 될 때, 이 코드가 무엇을 의미했었는지 다시 생각해나가야 한다. 그러니 표현식을 쓸 때 이 식이 의미하는 게 무엇인지 생각해보고, 그 의미를 이름에 나타내야 한다. 이는 변수를 통해 해결이 가능하다.

 

변수의 정의

: 값(데이터)을 저장하는 메모리 공간. 변수는 이름을 통해 프로그램의 특정 영역에서 처리된다.

(코틀린에서 변수는 var이나 val 을 통해 선언한다.  둘의 차이점은 곧 나온다.)

 

위에 적었던 식은 원의 넓이를 구하는 식이었다. 변수를 사용해서 다시 필요한 식들과 값들을 써보면,

    var radius = 5.0 //원의 반지름
    var height = 3.0 //원기둥의 높이

    var areaOfCircle = PI * pow(radius,2.0)  
    //원의 넓이 구하기 (πr2)
    var sideAreaOfCylinder = 2 * PI * radius * height 
    //원기둥의 옆넓이 구하기 (2πrh)
    var totalSurfaceOfCylinder = 2 * areaOfCircle + sideAreaOfCylinder
    // 원기둥의 넓이 구하기 (2πr2 + 2πrh)

대략 위와 같을 것이다.  표현식의 의미가 분명하니 (변수의 이름을 통해서 인지 가능), 몇달이 지나 코드를 다시 봐도 이해가 가능할 것이다.

2 * PI * pow(5.0,2.0) + 2 * PI * 5.0 * 3.0

만일 원기둥의 넓이를 변수 없이 구한다면 위와 같은 식으로 표현될 것이다. 숫자들의 연산으로만 이루어져 있으니, 5.0이 무슨 값을 의미하는지, 3.0이 반지름을 의미하는지, 가로 세로를 의미하는지 .. 등 알 수가 없게 되어 버린다. 식 자체가 변수에 할당되어 있지가 않다보니, 한 눈에 보고 원기둥의 넓이를 구하는 식이구나.. 하고 알아채기도 힘들어진다.

 

 

 

2. 변수의 종류

val ( Value 의 약자 ) : 불변변수, 읽기만 가능. 변경 불가
var ( Varible의 약자) : 가변변수, 읽기뿐만 아니라 쓰기도 가능.

 

예시

    val number = 5
    number = 30  // 오류! number은 변하지 않는 변수라 재할당 될 수가 없다.

 

    var number = 68 // 가변변수 number에 값 68을 할당
    number = 47 // 재할당

    var string = "날씨가 너무 덥다"
    string = "선풍기가 필요해" // 재할당
    string = 39 // 오류! 39는 Int의 값으로 변수 string의 자료형과 다르니 컴파일러 오류가 뜬다.

 

 

3. 실습

 

부분적으로 채워진 병과 잔이 놓여있다. 병에 있는 물로 잔을 가득 채운다면, 병에 남아있는 물은 얼마인가?

 

실습 문제, 병(왼)과 잔(오른)

 

먼저 각각의 주어진 정보들을 변수 값에 할당해보자. 현재 병이나 잔의 물의 양은 변할 수 있으니 알맞은 자료형이 var일 것이고, 최대로 담기는 물의 양은 변하지 않는 양이니 val 이 적합 할 것이다.

var currentBottleContent = 600
var currentGlassContent = 50

val maxGlassContent = 130

또 필요한 변수는 무엇일까?

잔을 채우는게 목표니 잔을 채우기 위해 채워져야 할 물의 양일 것이다. 채워져야할 양은 현재 상태에서 정해진 값이니 val 이 적합하다.

 val toBeFilled = maxGlassContent - currentGlassContent  //채워져야 할 양

 이제 잔에 채워져야 할 양만큼 물을 추가 시켜주고, 그만큼 병에서 빼주면 되는 일만 남았다.

currentGlassContent += toBeFilled
currentBottleContent -= toBeFilled

//결과 확인해 보기 
println("현재 잔의 물의 양은 $currentGlassContent ml입니다." ) 
println("현재 병의 남은 물의 양은 $currentBottleContent ml입니다." )

결과

 

[ 전체코드 ]

fun main (args : Array <String>) {

    var currentBottleContent = 600
    var currentGlassContent = 50
    val maxGlassContent = 130
 
    val toBeFilled = maxGlassContent - currentGlassContent  //채워져야 할 양
    currentGlassContent += toBeFilled
    currentBottleContent -= toBeFilled

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

}

 

 

 

출처:

내용: 학교 교수님 (Christian Kohls) 강의

 

728x90
반응형