코틀린 독학 6 상수 및 val 변수

Table of Contents

코틀린 독학 6 번째 : 상수 및 val 변수

Hyperskill 사이트 독학하기

프로그램 실행 중에 수정하면 안 되는 변수를 사용해야 하는 경우가 있습니다. 이러한 변수는 Kotlin에서 상수 또는 val 변수 로 알려져 있으며 , 여기서 키워드로 선언됩니다 valvar변수와 변수 의 차이점은 일단 할당된 변수 val의 값을 수정할 수 없다는 것입니다 .val

Val 변수

다음 코드에서는 두 개의 val변수, pi즉 잘 알려진 수학 상수를 나타내는 와 helloMsg문자열 텍스트를 나타내는 를 소개합니다.

val pi = 3.1415
val helloMsg = "Hello"

println(pi)       // 3.1415
println(helloMsg) // Hello

두 변수 모두 수정할 수는 없지만 필요한 만큼 여러 번 액세스할 수 있습니다.

변수 값을 수정하려고 하면 컴파일러에서 오류가 발생 val하므로 아래 코드를 컴파일하려고 하면 오류가 발생합니다 Val cannot be reassigned.

val pi = 3.1415
pi = 3.1416 // error line

값이 할당되기 전에 변수 val를 사용하면 컴파일러에서도 오류가 발생합니다.

val boolFalse: Boolean
println(boolFalse) // error line

위의 코드를 사용하면 오류가 발생합니다 Variable 'boolFalse' must be initialized. 이 문제를 해결하려면 변수에 액세스하기 전에 값을 할당하세요.

val boolFalse: Boolean // not initialized
boolFalse = false      // initialized
println(boolFalse)     // no errors here

변수 의 값은 제한 없이 변수 val에 재할당될 수 var있으며 일반 변수의 값은 필요한 만큼 여러 번 변경될 수 있습니다.

val count = 10
var cnt = count
cnt = 20 // no errors here, cnt is not a constant

Val 변수 및 가변성

val불변의 동의어가 아니라는 점에 유의하는 것이 중요합니다 . 다음 예에서는 동일한 유형의 순서가 지정된 요소 집합인 MutableList를 사용합니다. MutableList에 대해 더 자세히 알아보고 싶다면 해당 주제를 사용할 수 있지만 지금은 꼭 필요한 것은 아닙니다.

// list creation
val myMutableList = mutableListOf(1, 2, 3, 4, 5)
// trying to update the list
myMutableList = mutableListOf(1, 2, 3, 4, 5, 6) // error line

두 번째 줄은 변수를 재할당하려고 하기 때문에 컴파일되지 않습니다 val. 그러나 기억해야 할 한 가지 중요한 사항이 있습니다.변수 의 내부 상태를 변경하는 것은 항상 가능합니다 

val. 변수를 다시 할당하는 것은 금지되어 있지만 해당 내용은 다른 방법으로 수정할 수 있습니다.

따라서 다음 코드는 정확합니다.

// list creation
val myMutableList = mutableListOf(1, 2, 3, 4, 5)
// adding a new element
myMutableList.add(6)   // it works
// printing the list
println(myMutableList) // [1, 2, 3, 4, 5, 6]

보시다시피 이 코드는 myMutableList다른 정수를 추가하여 내부 상태를 변경했습니다. 함수 를 호출했을 때 add()변수 자체가 아니라 변수가 나타내는 목록이 변경되었습니다.Java 프로그래밍 언어에 익숙하다면 Kotlin 

val변수를 Java 

final변수로 생각하는 것이 더 쉬울 수 있습니다. 둘 다 매우 유사합니다. 둘 다 변수에 값을 다시 할당하는 것을 금지하지만 개체의 내부 상태를 변경할 수 있습니다.

상수 변수

Kotlin에는 컴파일 타임 상수를 선언하기 위해 키워드 const앞에 사용되는 수정 자도 있습니다 . val변수 의 값은 const컴파일 타임에 알려지며 런타임에 변경되지 않습니다.

const val MY_STRING = "This is a constant string"

다음 코드는 프로그램 실행 전에는 값을 알 수 없고 상수가 아니기 때문에 오류를 발생시킵니다.

const val MY_STRING = readln() // not a constant String!!!

const수정자를 적용할 수 있는 경우에는 몇 가지 제한 사항이 있습니다 . String첫째, 기본 유형 변수 와 함께만 사용할 수 있습니다 .

const val CONST_INT = 127
const val CONST_DOUBLE = 3.14
const val CONST_CHAR = 'c'
const val CONST_STRING = "I am constant"
const val CONST_ARRAY = arrayOf(1, 2, 3) // error: only primitives and strings are allowed

게다가 const변수는 함수 외부의 최상위 수준에서 선언되어야 합니다.

const val MY_INT_1 = 1024 // correct line

fun main() {
    const val MY_INT_2 = 2048 // error: Modifier 'const' is not applicable to 'local variable'
}

Val 변수를 사용하는 경우

이제 키워드가 변수에 대해 어떻게 작동하는지 이해하시기 바랍니다 val. 이제 언제 사용해야 하는지 알아보아야 할 때입니다.

좋은 방법은 val기본적으로 변수를 사용하는 것입니다. 그런 다음 코드에 필요한 것으로 나타나면 var변수로 변경합니다.

var a = 1024
val b = 256
val c = 128
a += b * c

이 접근 방식을 사용하면 변경 가능한 변수 수를 최소화하여 프로그램을 작성할 수 있으므로 오류가 줄어듭니다.

결론

  • Kotlin에서는 상수 변수가 val키워드로 선언됩니다.
  • val값 재할당을 제외하고 변수를 일반 변수처럼 처리할 수 있습니다 .
  • 키워드 val는 변수 값 변경을 금지하지만 변수가 나타내는 내부 상태는 변경할 수 있습니다.
  • 컴파일 시간 최상위 상수의 경우 const수정자를 사용할 수 있습니다.
  • 가능할 때마다 변수를 사용하는 val것은 오류를 방지하는 좋은 습관입니다.

20240112 132846 1

이번엔 상수 및 val 변수입니다.

20240112 132846 2

const val은 대문자 스네이크 케이스(UPPER_CASE_WITH_UNDERSCORES)를 사용하는 것이 일반적입니다. 따라서 상수의 이름은 모든 단어를 대문자로 쓰고 각 단어 사이에 언더스코어를 사용하는 형태여야 합니다. 이게 kotlin 에서의 관례라고 합니다. 코드의 가독성을 높이고 상수임을 명확하게 구분하기 위한 것이라고 합니다

20240112 132846 3

코드는 순서대로 진행됩니다. 먼저 numberOfApples 가 numberOfOranges가 되었지만 그 다음에 다시 numberOfApples가 2000으로 다시 되었으니 값은 가장 마지막으로 결정된 2000이 답이 됩니다.

20240112 132846 4

이제 어느정도 익숙해졌을거라 생각됩니다. val이 가장 먼져 나오고 그다음 이름 : String(문자) = “Hello” 같은 표현 순서로 되는것이 말이죠!

그리고 println()은 출력하라는 것입니다. 보통 맨 뒤에 나오게 됩니다.

20240112 132846 5

Float은 소숫점을 나타낼때 사용해요

20240112 132846 6


코드에서 numberLists 변수는 val 키워드로 선언되어 있지만, 해당 변수가 가리키는 mutableListOf 객체는 val로 선언된 변수라도 변경 가능한(mutabale) 객체입니다. 따라서 numberLists가 가리키는 리스트에 대한 내용을 변경할 수 있습니다. 그러나

그러나, 코드에서 다음과 같은 부분이 문제를 일으키고 있습니다:

kotlinCopy codenumberLists = mutableListOf<Int>()

이 부분에서 numberLists에 다시 새로운 mutableListOf 객체를 할당하고 있습니다. val 키워드로 선언된 변수는 한 번 초기화되면 다른 객체로 재할당할 수 없습니다. 이는 변수가 가리키는 객체가 변경되는 것이 아니라 변수 자체가 다른 객체를 참조하도록 변경되는 것을 의미합니다.

20240112 132846 7

그래서 답은 compile 에러가 납니다

“Compile error”는 컴파일러가 소스 코드를 해석하고 실행 가능한 코드로 변환하는 과정에서 발생하는 오류를 나타냅니다. 컴파일러는 코드의 구문과 의미를 분석하고, 이해하지 못하는 코드나 잘못된 문법, 타입 오류 등을 발견할 경우 컴파일 에러를 생성합니다.

컴파일 에러는 코드의 실행 이전에 발생하며, 프로그램이 실행되기 전에 코드를 수정하여 해결해야 합니다. 일반적으로 코드의 구문 오류, 변수 미정의, 타입 불일치 등이 컴파일 에러의 일반적인 원인이 됩니다.

컴파일 에러가 발생하면 프로그램이 실행되지 않으며, 에러 메시지를 통해 어떤 부분에서 문제가 발생했는지를 알려줍니다. 이 메시지를 통해 오류의 원인을 파악하고 수정할 수 있습니다. 따라서 컴파일 에러는 프로그래머에게 코드의 오류를 알려주는 중요한 피드백 도구입니다.

20240112 132846 8

val은 한번만 지정 가능하고 println은 값이 있어야 합니다

20240112 132846 9

이 문제는 두가지 방법이 있습니다. const를 없애버리거나

20240112 132846 10

아니면 fun main() 바깥으로 옮겨주는 것입니다. 그리고 값인 100을 넣어주어야 합니다.


const val
로 선언된 상수는 컴파일 타임에 값을 가져야 하며, 따라서 클래스의 멤버 변수나 최상위 수준에서 선언되어야 합니다. fun main() 안에서는 const val을 사용할 수 없습니다.

한편 solution에서는 아래의 답을 제시했습니다

코틀린 독학 6

우리가 아직 안배운 방식의 코딩이네요. 그냥 참고만 하면 되겠습니다.