Kotlin

Kotlin 문법 - 입문편

팅리엔 2022. 9. 28. 02:09

이 글에선 헷갈리겠다 싶은 코틀린 문법에 대해서 남겨보려고 한다.

 

 


 

산술 연산의 결과 타입

모든 산술 연산자 +,-,*,/,% 에 대하여,

 

Double/Int 이든 Int/Double 이든 결과 타입은 항상 Double이다.
10.0/5 처럼 계산 결과에 소수점이 없다고 하더라도 결과 타입은 Double이다.
결과 타입이 Int가 되면 계산 결과의 소수점이 손실될 수 있기 때문이다.

 

Int 타입끼리 산술 연산을 하게 되면 결과 타입은 무조건 Int이다.
3/2 (둘 다 Int)의 계산 결과가 1.5일 것 같지만 1이다.
계산 결과에 소수점이 존재하더라도 보존되지 않는다.

 

Int 타입보다 작은 정수 타입들(Byte, Short)끼리 산술 연산을 하면 무조건 Int이다.

 

 

변수 타입 변경

코틀린의 자바보다 타입 체크에 더 엄격하다.
Double 변수에는 Int 값을 저장할 수 없다.

val num1: Double = 1 //error!
val num2: Double = 15.0 - 1 * 2 //error!

변수의 타입을 Int에서 Double로 변경하려면 아래처럼 .toDouble() 메서드를 이용한다.

val num3: Double = num.toDouble() / 2.0 + 0.7

코틀린에도 형변환을 위한 키워드가 존재한다.
하지만 Int와 Double이 서로 상속 관계가 아니라서 캐스팅으로 형변환 할 수 없다.

 

 

비트 연산자

코틀린의 비트 연산자는 기호가 아니라 문자로 되어 있다.

  • 2 and 3
  • 2 or 3
  • 2 xor 3
  • 2.inv() : 비트 단위로 반전 (자바에서 ~2)
  • 8 shl 2 : 8를 왼쪽으로 2칸 시프트 (자바에서 8 << 2)
  • 8 shr 2 : 8을 오른쪽으로 2칸 시프트 (자바에서 8 >> 2)
  • -8 ushr 2 : 부호를 유지한 채 -8을 오른쪽으로 2칸 시프트

 

 

변수 타입

종류 이름 용량 (byte) 저장 가능 범위 / 
소수점 정밀도
정수 Byte 1 -128 ~ 127
Short 2 -3만 2768 ~ 3만 2767
Int 4 -21억 4748만 3648
~ 21억 4748만 3647
Long 8 -922경 3372조 0368억 5477만 5808 
~ 922경 3372조 0386억 5477만 5807
실수 Float 4 1.420-45
~ 3.40282351038
Double 8 4.910-324 
~ 1.797693134862315710308

 

val a: Byte = 125
val b: Short = (100 + 200) * 100
val c: Int = 12_3456_7890
c = 0xFF_88_88 //16진수
c = 0b01010010_01100011_01110101_01000101 //2진수
val d: Long = -543_7847_3984_7238_4723
c = a + b //Byte + Short = Int
d = c + 10L //Int + Long = Long
val e: Float = 67.6f
val f: Double = 658.456
e = (e + f).toFloat() //726.056일 것 같지만 726.0이다! 이 다음 항목 확인!

 

스택이 아닌 힙 영역에 실제 공간이 할당되는 타입을 `참조 타입`이라고 한다.

코틀린에서 Byte, Short, Int, Long, Float, Double, Char, Boolean 타입을 제외한 타입은 모두 참조 타입이다.

 

 

실수 타입의 문제

실수 타입에는 치명적인 문제가 있다.

 

실수 값은 2진수 유효숫자로 표현된다.
예를 들어, 저장하고 싶은 실수의 2진수가 1011.1001일 경우,
10111001(유효 숫자), -3(지수)가 저장되는 것이다.

 

따라서 상황에 따라서 정확한 값이 저장되지 못할 수 있다.

(0.1은 2진수 표현시 무한 소수가 되어 가장 근사한 값을 저장 -> 값의 손실)

 

연산을 거듭할수록 오차가 누적된다.
실수 계산을 할 때는 항상 '대략적인 값'만 나온다는 것을 염두해두고 꼭 실수 값 처리가 필요하지 않은 상황이라면 정수 타입만 사용한다.

 

 

문자열 안에 표현식 값 집어넣기

val a = 10  
val b = 20

println("a: $a") //10  
println("a + b = ${a + b}") //30

 

 

타입에 별명 붙이기 typealias

typealias Number = Int

fun main(args: Array): Unit  
{  
    val a: Number = 10  
    println(a) //10  
}

 

 

비교 연산자

결과 타입은 Boolean이다. Boolean에는 true, false만 저장될 수 있다.
코틀린에서 ==, != 연산자는 자바의 equals 메서드와 같다.
객체의 참조 값끼리 비교하려면 ===, !== 연산자를 사용한다.

 

 

Label

fun main(args: Array) : Unit  
{  
  var x = 0  
  var y = 0

  outer@ while (x <= 20)  
  {  
    y = 0  
    while (y <= 20)  
    {  
      if (x + y == 15 && x - y == 5)  
      break@outer  
      y += 1  
    }  
    x += 1  
  }  
  println("x: $x, y: $y") //x: 10, y: 5  
}

 

 

가변인수 vararg

n개의 인수를 받는 함수를 만들고 싶다면,

fun sum(vararg numbers: Int) : Int  
{  
  val count = numbers.size  
  var i = 0; var sum = 0

  while (i < count)  
  {  
    sum += numbers[i]  
    i += 1  
  }

  return sum  
}

일반인수가 가변인수보다 오른쪽에 있으면 호출시 인수에 매개변수 이름을 붙여야 한다.

fun f(vararg numbers: Int, something: Char) : Int {}  
f(1, 2, 3, something = 'A')

 

 

지역 함수 Local Function

함수 안에 또 다른 함수를 선언할 수 있다.
어떤 함수가 특정 함수 안에서만 사용되는 경우 이렇게 선언해볼 수 있다.

'Kotlin' 카테고리의 다른 글

Kotlin 문법 - 표준 라이브러리편  (0) 2022.10.08
Kotlin 문법 - 중수편  (1) 2022.10.03
Kotlin 문법 - 초보편  (0) 2022.09.29
TypeScript 시작하기  (0) 2021.09.08
Kotlin 시작하기  (0) 2021.05.02