본문 바로가기

프로그래밍 언어/코틀린_Kotlin_더파기

Kotlin더파기_01_변상수 타입

코틀린 쌩초보 기초에서 기본 개념을 익혔고 어려운 부분은 대충 수박 겉핧기 식으로 훓어보았다.

'코틀린 더파기'에서는 조금 더 깊숙하게 들어가 본다.

더파기 과정은 Kotlin Programming: The Big Nerd Ranch Guide(2018)을 참고하여 작성한다.

기본 개념은 쌩초보 기초를 참고하면서 코틀린의 세계에 더 깊이 빠져보자.

 

여기서 사용한 편집기는 코틀린을 만든 젯브레인사의 통합개발도구(IDEA)인 IntelliJ(인텔리제이)를 사용한다.

먼저 '인텔리제이&JDK설치' 글을 참고하여 설치하고 기본 사용법을 익히도록 한다.

 

Variable & Constant and Type (변수와 상수 그리고 타입)

 

변수는 변할 수 있는 값이고 상수는 고정된 값이다.

변수와 상수의 역할은 값을 저장하고 데이터를 전달한다.

변수와 상수에 넣을 수 있는 값을 data(데이터 또는 자료)라고 한다.

 

데이터는 숫자, 문자, 배열 등 다양한 자료가 있으며 이것을 데이터의 Type(타입, 유형)이라고 한다.

변수와 상수는 타입을 정해줘야 한다.

코틀린은 변수의 값을 보고 타입을 자동으로 처리하는 똑똑한 기능이 있다.

 

근데 타입(Type)은 왜 필요한가?

다른 글에서 한번 언급했듯이 각각의 데이터는 자신만의 특성이 있다.

숫자는 사칙연산을 하거나 문자는 글자와 관련된 특성을 가진다.

그래서 이런 특성에 맞춰 그 데이터의 크기에 맞는 작업 공간(메모리 공간)을 준비해야 하기 때문이다.

 

변수 선언(Variable Declaration)

 

IntelliJ를 실행한다.

File > New > Project를 눌러서 새 프로젝트를 만든다.

프로젝트 이름은 Playground로 한다.

만약 인텔리제이&JDK 설치에서 이미 만들었다면 해당 파일을 불러온다.

 

main()함수를 만든다.

자동완성 기능을 활용하여 main을 입력하고 엔터키를 친다.

 

 

main()함수가 자동으로 만들어 진다.

 

 

게임을 만들 때 변하는 숫자가 있다면 그것은 변수로 만들어야 할 것이다.

대표적으로 Score(점수)가 있다.

이제 Score라는 변수를 선언해 보자.

 

간단한 코드이므로 REPL에 넣어서 확인해 보자.

REPL 사용법은 '인텔리제이&JDK설치' 글에서 설명했다.

REPL창을 띄울려면 메뉴에서 Tools > Kotlin > Kotlin REPL을 클릭한다.

코드를 선택 후 복붙으로 넣고  Ctrl+Enter를 누른다.

 

 

 

코틀린에서 변수를 선언하고 값을 넣는 기본적인 형식이다.

 

var 은 변수를 정의하는 키워드이다.

score 은 변수의 이름(변수명)이다.

콜론 : 은 연결 부호이다.

Int 는 정수 타입이다.

= 은 '저장하라'는 명령 부호(대입 연산자)이다.

0 은 변수 값(value)이다.

 

이번에는 변수값 0을 문자열로 바꿔보자.

 

 

문자열에 빨간줄이 나타나면서 경고를 나타낸다.

변수의 타입을 Int(정수)로 정했는데 값에 문자열을 넣었기 때문에 에러가 난 것이다.

이렇게 코드에 타입 에러가 없는지를 확인하는 이유는 코틀린이 static type system(정적 타입 시스템)을 사용하기 때문이다.

 

static은 '고정된'이라는 말이다.

즉, 고정된 변수 타입을 사용한다는 말이다.

static type system은 프로그램 실행 전에 변수를 타입에 맞게 메모리에 미리 고정적으로 공간을 정하는 시스템이다. 

반대 개념은 프로그램 실행 후에 메모리를 필요할 때 마다 사용하는 dynamic type system(동적 타입 시스템)이다. 

 

내장 타입(built-in Type)

 

코틀린은 다양한 변수의 값을 처리할 수 있는 타입을 가지고 있다.

이것을 내장(빌트인) 타입이라고 한다.

내장 타입의 종류는 다음과 같다.

 

Char

String

Boolean

Int

Double

List

Set

Map

 

자세한 내용은 다음에 배우자.

 

변수의 값을 바꿀 수 있다.

 

3번줄을 입력하고 main왼쪽의 녹색 삼각형을 누른 후 Run을 눌러서 실행하자.

 

 

REPL 창과 콘솔창이 함께 나타난다.

 

변수 선언 키워드 var, val

 

변수를 선언할 때 변수명 앞에 붙이는 키워드는 2가지이다.

var

val

 

두 키워드의 차이점은

var은 설정한 변수값이 변할 수 있고

val은 지정한 변수값이 변할 수 없다.(읽기 전용)

 

고정된 값으로 사용할 변수를 만들어 보자.

2번줄, 3번줄, 7번줄을 순서대로 코딩하자.

2번줄을 입력하면 playerName에 빨간줄 에러가 생긴다. 

 

실행해 보면 메시지 창에 Build탭이 생기고 'Val은 다시 설정할 수 없다' 에러가 뜬다.

 

메시지 창의 Build탭을 닫으려면 x 클릭하고

숨겨놓으려면 오른쪽 숨김 클릭한다.

 

3번줄을 지우고 playerName을 var로 바꾼다.

그러면 var 에 노란색 박스가 입혀진다.

이것은 치명적인 에러는 아니지만 제안이나 추천할 내용이 있다는 것을 나타낸다.

마우스 포인트를 그 위로 가져가면 내용을 알 수 있다.

 

내용은 다음과 같다.

'변수가 변경되지 않는다면 val을 사용하여 불변(immutable)으로 선언할 수 있다'

val로 바꾸려면 Change to val (val로 바꾸기)을 클릭하거나 단축키(Alt+Shift+Enter)를 누르면 된다.

코틀린이 자동으로 바꿔준다.

 

참고로 방금 했던 작업을 취소하고 싶으면 Ctrl+Z 키를 누르면 된다.

누를 때 마다 작업을 하나씩 뒤돌아가면서 취소한다.

이 키는 안드로이드 스튜디오에서도 같이 적용된다.

 

현재 String의 글자색은 회색이다.

이번에는 마우스 포인터를 String 위로 옮겨보자.

 

 

메시지 내용은 다음과 같다.

'명확하게 적혀 있는 타입은 여기서는 없어도 된다'

 

아래 Remove ~를 클릭해서 제거해보자.

 

타입과 콜론이 함께 삭제된다.

결국 콜론은 변수명과 타입을 구분하기 위해 사용한 것이다.

 

변수 타입을 명시하지 않았을 때  타입이 무엇인지 알고 싶으면 커서를 변수에 두고 Ctrl+Shift+P를 누르면 된다.

 

 

상수(constant)

 

val로 선언한 변수는 변하지 않는 변수라고 했지만 절대 변하지 않는 것이 아니라 예외가 있다.

예외 경우는 다음에 배우기로 한다.

어쨌든 val도 절대 불변은 아니고 예외가 있으므로 절대 불변에 사용할 키워드가 필요하다.

그것이 const 이다.

 

const

 

이 키워드를 val 앞에 붙이면 '절대 불변'이 된다.

 

const val 

 

변수 키워드 const는 수학에서 변하지 않는 값을 나타내는 constant(상수)의 줄임말을 사용한다.

이것을 compile-time constant (컴파일 타임 상수)라고 한다.

프로그램을 실행하면 컴파일을 거치는데 그때 상수로 고정 시켜버린다는 뜻이다.

 

다른 글에서 프로그램이 처음 실행할 때 시작하는 곳(entry point)이 main()함수라고 말했다.

그러므로 const (상수)는 main()함수 이전에 선언되어야 한다.

또한 선언할 수 있는 타입의 종류는 컴파일러가 기본으로 알고 있는 타입(내장 타입)만 가능할 것이다.

 

게임에서 점수의 최대치를 절대 불변으로 정한다고 하면 main()함수 위에 다음과 같이 선언하면 된다.

 

 

변수명을 대문자로 하고 밑줄로 단어를 서로 연결한 것은 이 변수가 상수라는 것을 다른 변수와 구분하기 위해 임의로 표현한 것이다.

 

score의 타입도 삭제해 보자.

그런데 MAX_SCORE의 타입은 회색이 아니다.

코틀린이 삭제를 추천하지 않는다.

이렇게 타입을 생략하면 컴파일될 때 어떤 상태가 되는지 알아보자.

 

코틀린 프로그램은 실행할 때 JVM(자바 가상 머신)을 사용하므로 컴파일할 때 자바 bytecode로 변환한 후 실행하게 된다. 자바 바이트코드로 어떻게 변환되는지 알수 있는 방법이 있다.

 

바이트코드를 보려면 메뉴에서 Tools > Kotlin > Show Kotlin Bytecode를 누르면 된다.

여기서는 검색창을 이용한 방법을 사용해 본다.

 

Shift키를 연속으로 두번 클릭해 보자.

위쪽에 검색창이 나타난다.

 

 

'showk'를 입력한 후 옵션이 나타나면 Show Kotlin Bytecode가 선택((파란색)된 상태에서 엔터키를 친다.

 

 

오른쪽에 코틀린 바이트코드 창이 나타난다.

 

왼쪽위에 Decompile 버튼을 클릭해 보자.

decompiled.java 탭이 새로 생기고 자바  바이트코드를 보여준다.

 

 

자바 바이트코드에는 생략했던 변수의 타입이 나타나는 것을 볼 수 있다.

 

그런데 자바에서는 정수 타입은 소문자로 시작하는 int

문자열 타입은 대문자로 시작하여 String 으로 표현했다.

코틀린에서는 모든 타입을 대문자로 시작한다.

 

자바에서

타입이 소문자로 시작하면 기본 타입(primitive Type)을 나타내고

타입이 대문자로 시작하면 참조 타입(reference Type)을 나타낸다.

 

기본 타입은 앞에서 언급한 언어 내부에 이미 지정되어 있는 내장 타입이다.

자바의 모든 기본 타입은 각각 참조용 타입을 가지고 있다.

참조 타입이 생긴 것은 객체지향의 특성을 활용하기 위해 생겼다.

참조 타입에 대해서는 다음에 객체지향 부분에서 자세히 알아보기로 한다.

 

끝.

 

Wraven...