Android 앱/Kotlin Language

kotlin 코틀린 - 변수와 자료형

arvigoes 2020. 2. 27. 23:17

변수와 자료형

이번 장에서는 프로그래밍의 기본인 변수와 자료형에 대해 알아보도록 하겠습니다.

변수는 말 그대로 변하는 수 입니다.

특정한 형식을 가진 값을 저장하는 공간을 의미 합니다.

변수의 이름은 이공간을 지칭하는 것 입니다.

자료형은 변수의 모양을 나타내느 말입니다.

변수가 특정한 형식(자료형) 으로 공간을 가지는 것 입니다.

 

변수의 선언

var(mutable:가변) -일반적으로 통용되는 변수 - 언제든지 읽기 쓰기가 가능

val(immutalble : 불변) - 선언시에만 초기화 가능 - 중간에 값을 변경할 수 없다

 

보통은 var 형태의 변수를 많이 사용하고 val 은 실행중에 변화되어서는 안되는 값을 저장할때 많이 사용 합니다.

 

선언위치에 따라서 

클래스에 선언된 변수는 property (속성)이라 부르고

특정 scope ({} : 중괄호)  내에 선언된 변수를 Local Variable( 로컬변수)  라 부릅니다.

 

변수를 선언해 보도록 하겠습니다.

fun main() {
	var number: Int			// warning
}

 

Variable 'number' is never used 라는 warning 이 발생합니다. (주황색 전구)

warning 은 불필요한 구문이 있거나 잠재적으로 문제가 발생할 요지가 있음을 나타냅니다.

실행에는 아무 문제 없이 실행이 되는 것을 확인 할 수 있습니다.

실행결과

불필요한 구문은 컴파일 속도를 늦추거나 실행에 불필요한 오버해드를 발생 할 수 있고,

잠재적인 문제가 될 소지가 있는 구문은 나중에 해결하기 힘들지도 모르니 warning 이 생길 때마다 해결해 주는 습관을 가지도록 합시다.

 

ner used warning 을 해결하기 위해서는 변수를 사용하면 됩니다.

변수를 사용하기위해 지난번에 사용했던 화면에 출력하는 println 을 통해 변수를 화면에 출력 해보도록 합니다.

error

이번에는 Error 와 함께 실행이 실패 합니다.

실행을 해 보지 않아도 우측 상단에 있는 빨간 느낌표 와 붉은줄로 Error 가 발생을 한다는 것을 알려주고 있습니다.

Error 내용을 보니 Variable 'number' must be initialized 라고 나옵니다.

number 는 must!!! 반드시 초기화 된 상태로 사용해야 한다고 합니다.

이부분이 kotlin 언어가 가지는 특징중에 하나입니다.

일반적인 언어에서는 변수가 선언이 되면 기본값으로 초기값을 가지거나, 객체가 할당되지 않았다는 의미로 null 값을 가지는데, kotlin 은 기본변수 에는 null 을 허용하지 않고,

변수에 값을 할당하지 않고 사용한다면 지금 처럼 문법에러로 표시하고 컴파일 실패로 처리 합니다.

이로써 null point exception 등의 예외상황을 원천적으로 차단할 수 있습니다.

지금의 eror 상황을 해결 하기 위해서는 어떻게 하면 될까요?

간단합니다. number 라는 변수에 값을 할당 해 주기만 하면 됩니다.

붉은줄 도 사라졌습니다.

실행도 잘 됩니다.

 

이렇게 Int 같이 크기가 작은 변수는 항상 값을 가질 수 있고 필요에 따라 변경이 가능 하지만

object 같이 크기가 얼마나 될지 모르는 변수의 경우는 초기화 해서 항상 초기화 해서 사용하기가 부담 스럽습니다.

필요할때 다른 곳에서 만들어서 넘겨 받는 경우도 많이 있구요

 

이럴때를 위해 nullable 변수를 선언 할 수 있습니다. (물론 lateinit 등으로도 가능하나 이 부분은 클래스 에서 다루도록 하겠습니다.)

nullable 변수를 사용하게 되면 몇가지 이점이 있습니다.

위에서 처럼 불필요한 객체 생성이 줄어든다는 점으로 인한 공간, 속도의 향상과,

객체가 할당이 된 것 자체를 정보로 사용하여 boolean 정보 (true, false) 로 사용 할 수도 있습니다.

그렇지만 nullable 변수를 사용하게 되면 null 상태일때 연산에 사용하게 되면,

어플리케이션 구동에 치명적인 null point exception 이 발생 할 수있으므로 꼭 필요한 경우에 한해 사용해야 합니다.

 

nullable 변수의 선언은 아래 와 같이 하시면 됩니다.

    var numberNullable: Int? = null

자료형에 ? 를 붙여주면 됩니다.

 

기본 자료형(primitive type)

코틀린은 자바와의 호환을 위해 기본자료형 또한 자바와 거의 동일합니다.

정수형 (4종류)

Byte   (1byte)

Short  (2byte)

Int     (4Byte)

Long  (8Byte)

실수형 (실수의 기본형은 double) (2종류)

float   (4Byte)

double (8Byte) 

정수형 4종과 실수형 2종을 나누는 이유는 각 자료형별 사용하는 메모리공간 크기의 차이입니다.

크기의 차이로 인해 표현할 수 있는 수의 범위가 다르므로 상황에 맞게 적절히 사용 하시면 됩니다.

 

각 자료형 별 선언 형태 입니다.

    var valueInt:Int = 100
    var valueLong:Long = 100L
    
    var valueDouble:Double = 100.1
    var valueExpDouble = 100.5e10
    var valueFloat:Float = 100.1f

Long 타입의 경우 대문자 L 을 붙여주어야 합니다.

100L 대신 100 만 써도 위 코드에서는 문제가 없으나 항상 L 을 붙여주어서 8Byte 값이라는것을 명시하는 습관을 가지도록 합니다. 단순한 할당에는 문제느 없으나 명시적인 타입이 지정되지 않은 경우에는 문제가 될 수도 있습니다.

 

float 값에도 f 를 붙여 주어야 하는데 실수형값에 f 를 안붙이고 그냥사용하면 8byte 인 Double 값이 되므로 이 부분도 항상 주의 해서 사용하도록 합니다.

 

문자형

Char 문자 한글자를 담을 수 있는 자료형

코틀린은 문자열을 다룰때 내부적으로 UTF-16 BE 를 사용하고 있습니다.

이 형식은 한글자당 2byte 를 사용하고 있습니다.

그러므로 Char 도 2byte 를 사용 하고 있습니다.

var valueChar:Char = 'a'
var valueCharKor:Char = '아'
var valueCharNum:Char = '1'

Char 타입의 변수에 한 문자를 할당할때에는 작은 따옴표로 한 문자를 감싸서 값을 넣어주도록 합니다.

 

Boolean 형

true & false 만을 값으로 가지는 논리형 변수 입니다.

var valueBool:Boolean = true

 

자료형과 변수는 프로그래밍의 기본이 되는 내용입니다.

이 내용을 바탕으로 많이 사용해 보시고 익숙해 지시길 바랍니다.

 

형변환

하나의 변수에 지정된 자료형을 호환되는 다른 자료형으로 변경 하는 행위를 말합니다.

코틀린에서는 형변환시 발생할 수 있는 많은 문제들을 막기위해서,

다른 언어에서 제공하는 묵시적 형변환을 지원 하지 않습니다. 

정확하게 사용할 수있고 형변환 실수를 하더라도,

컴파일단계에서 에러 처리 가능한 명시적 형변환만을 사용합니다.

그래서 기본자료형에서도 형변환을 위해 형변환 함수(Type casting function)  를 제공하고 있습니다.

toByte() , toShort(), toInt(), toLong(), toFloat(), toDouble(), toChar()

type mismatch error

 

같은 정수형이라고 하더라도 자동으로 캐스팅이 되지 않습니다.

위의 경우에서도 type mismatch error 가 발생하여 컴파일 실패가 되는 것을 확인 할 수 있습니다.

아래처럼 명시적으로 캐스팅 할 타입의 함수를 호출 해 주어야 합니다.

type mismatch 해결

타입 추론(type inference)

변수나 함수들을 선언할때, 연산이 이뤄질때 자료형을 명시하지 않아도 자동으로 자료형을 유추하여 적용해 주는 기능입니다.

    var number = 10
//    var number:Int = 10
    var numberLong = 10L
    println(number)
    println(numberLong)

var number = 10 에서 10 으로 10은 Int 값이므로 이를 통해 number 의 타입은 Int 로 유추하여 number 변수의 타입을 Int 로 결정하게 됩니다.

numberLong 처럼 Long 타입을 사용하고 싶은데 10L 을 쓰지 않고 10을 설정하게 되면 명시적인 타입을 적지 않는다면 타입추론에서 numberLong 은 Int 타입으로 설정이 될 것 입니다.

이 타입추론은 Int 같은 기본타입 이외에서도 사용 될 수 있습니다.

타입추론을 이용해서 변수를 선언할때 명시적인 값을 사용할 수 있다면 타입을 생략하여 코딩량을 줄일 수 있습니다.