코틀린을 공부하기 전 자바(JAVA)의 변수와 연산자를 먼저 공부합시다.
자료형
변수의 선언과 초기화
val(var) 변수명 : 자료형 = 값
val(var) 변수명 = 값
var : 읽고 쓸 수 있는 변수
val : 읽기 전용 변수
코틀린에서는 값을 통해 자료형을 추론해 주기 때문에 자료형을 생략할 수 있습니다. 단, 반드시 값을 할당해 주어야 사용할 수 있습니다.
코틀린에서는 변수를 기본형과 참조형으로 구분하지 않고 참조형만 사용합니다. 참조형으로 선언한 변수는 성능 최적화를 위해 코틀린 컴파일러를 통해 다시 기본형으로 대체됩니다.
지연 초기화
말 그대로 변수 선언 시에 초기화하지 않고 지연하는 방법입니다.
lateinit
lateinit var 변수명 : 자료형
var 키워드만 사용할 수 있습니다.
Int, Long, Short, Double, Float, Boolean, Byte 자료형은 사용할 수 없습니다.
lazy
val 변수명: 자료형 by lazy {
...
}
val 키워드 만 사용할 수 있습니다.
변수가 처음으로 사용될 때 by lazy 블록 {} 이 실행되며 리턴값이 초기값으로 할당됩니다.
기본 자료형 객체 (참조형)
자봐와 달리 앞글자를 대문자로 표시합니다.
|
타입
|
메모리 사용 크기
|
저장되는 값의 허용 범위
|
|
|
정수 타입
(숫자) |
Byte
|
1byte
|
8bit
|
-(2의 7제곱) ~ (2의 7제곱 - 1)
|
|
Short
|
2byte
|
16bit
|
-(2의 15제곱) ~ (2의 15제곱 - 1)
|
|
|
Char
|
2byte
|
16bit
|
0 ~ 65535(유니코드)
|
char은 'a', 'Z' 와 같은 하나의 문자,
하지만 유니코드로 변환 시 숫자값을 가짐 ['] 작은따옴표로 감싸서 표현 |
|
Int
|
4byte
|
32bit
|
-(2의 31제곱) ~ (2의 31제곱 - 1)
|
가장 많이 사용됨
2의 31제곱은 약 21억 |
|
Long
|
8byte
|
64bit
|
-(2의 63제곱) ~ (2의 63제곱 - 1)
|
어미에 대소문자 L
|
|
실수 타입
(소수점이 있는 숫자) |
Float
|
4byte
|
32bit
|
(1.4 * 10의 -45제곱) ~ (3.4 * 10의 38제곱)
|
어미에 대소문자 F
정밀도 : 7자리 |
Double
|
8byte
|
64bit
|
(4.9 * 10의 -324제곱) ~ (1.8 * 10의 308제곱)
|
float보다 많이 사용됨
어미에 대소문자 D (생략가능) 정밀도 : 15자리 |
|
논리 타입
(true / false) |
Boolean
|
1byte
|
8bit
|
true(1), false(0)
|
|
정수 자료형
정수 자료형에 부호 없는 자료형이 추가됩니다.
자료형 | 메모리 사용 크기 | 저장되는 값의 허용범위 | 사용 형식 | |
UByte | 1 byte | 8 bit | 0 ~ 2의 8제곱 - 1 | 어미에 대소문자 u |
UShort | 2 byte | 16 bit | 0 ~ 2의 16제곱 - 1 | 어미에 대소문자 u |
UInt | 4 byte | 32 bit | 0 ~ 2의 32제곱 - 1 | 어미에 대소문자 u |
ULong | 8 byte | 64 bit | 0 ~ 2의 64제곱 - 1 | 어미에 대소문자 uL |
실수 자료형, 논리 자료형, 문자 자료형
자바의 자료형과 동일한 특징을 갖습니다.
자료형의 최솟값, 최댓값확인
자료형.MIN_VALUE : 최솟값
자료형.MAX_VALUE : 최댓값
문자열 자료형
문자열 자료형의 출력 (String Template)
var a = 1
val str1= "a is $a" // $변수명을 통해 문자열 내에서 변수의 값 출력
println(str1)
// a is 1
val str2 = "a is ${a + 1}" // ${표현식}을 통해 문자열 내에서 표현식의 값 출력
println(str2)
// a is 2
- 이스케이프 문자 \ 나 ${' '}를 사용하여 기호를 표현할 수 있습니다.
- 문자열을 있는 그대로 출력하려면 """을 문자열 양쪽 끝에 입력합니다.
널 허용 자료형 / 비허용 자료형
val str1 : String = "Hello Kotlin"
str1 = null // 불가능
val str2 : String? = "Hello Kotlin"
str2 = null // 가능
코틀린에서는 널이 허용되는 ? 자료형과 허용되지 않는 자료형을 구분합니다.
널이 허용되는 ? 자료형이 허용되지 않는 자료형의 상위 자료형입니다.
자료형에 별명 붙이기
변수의 자료형이 복잡한 구조를 가지면 자료형에 별명을 붙일 수 있습니다.
typealias 별명 = 자료형
자료형 검사
널 허용 자료형의 세이프콜(?.) / not null 단정기호(!!.) / 엘비스 연산자(?:)
세이프콜(?.) : 변수가 null 이 아닐 경우 멤버에 접근하도록 합니다. null일 경우 null을 반환합니다.
not null 단정기호(!!.) : null 여부를 검사하지 않습니다. 변수가 null 일 경우 컴파일은 진행되지만 실행 시 널 포인터 예외가 발생합니다.
엘비스 연산자(?:) : null이 아닌 경우 왼쪽 값을, null인 경우 오른쪽 값을 반환합니다.
세이프콜과 엘비스 연산자 동시 활용
변수?.멤버 ?: (null일 경우 반환될 값)
is, !is
is 키워드로 자료형을 검사할 수 있습니다. 결과는 boolean형으로 반환되며, 검사 결과가 참일 경우 검사한 자료형으로 형변환됩니다.
if (num is Int) // num이 Int형이면
if (num !is Int) // num이 Int형이 아니면
val x: Any
x = "Kotlin" // 아직 x는 Any형
if ( x is String ) {
print(x.length) // x가 String으로 형변환
}
as, as?
as 키워드로 형변환할 수 있습니다. 형변환이 불가능할 경우 예외가 발생합니다. as?를 사용하면 null인 경우 null을 반환합니다.
val x: String = y as String
// y가 null이 아니면 String으로 형변환되어 x에 할당
// y가 null이면 형 변환할 수 없으므로 예외 발생
val x: String? = y as? String
// null 예외를 피하기 위해서 as? 사용 가능
자료형 변환
자동 형변환
표현 범위가 더 큰 자료형과 연산하면 큰 자료형으로 자동 형변환됩니다.
스마트 캐스트
대입되는 값에 따라 자료형이 자동으로 변환됩니다.
Number형으로 지정할 경우 값에 따라 적절한 숫자 자료형으로 변환됩니다.
Any형으로 지정할 경우 어떤 자료형으로든 변환될 수 있습니다.
강제 형변환
to자료형()으로 형변환이 가능합니다. 자료형의 첫 글자는 대문자로 합니다.
예시 ) toInt()
형변환 될 수 없는 경우 예외가 발생합니다.
비교
== : 값 비교
=== : 참조 주소 비교
❗ 변수의 값이 -128~127 범위에 있으면 캐시에 그 값을 저장하고 변수는 캐시의 주소를 가리키기 때문에 값이 같을 때 참조 주소까지 같아집니다.
연산자
종류 | 연산자 |
부호 연산자 | + - |
증감 연산자 | ++ -- |
논리 부정 연산자 | ! |
비트 부정 연산자 | ~ |
산술 연산자 | + - * / % |
쉬프트 연산자 | << >> |
비교 연산자 | > < >= <= == != |
비트 연산자 | | & ^ |
논리 연산자 | && || |
조건 연산자 | ? : |
대입 연산자 | = |
부호 연산자, 증감 연산자, 논리 부정 연산자, 비트 부정 연산자, 산술 연산자, 비교 연산자, 논리 연산자, 대입 연산자
자바의 연산자와 같습니다.
쉬프트 연산자 & 비트 연산자
쉬프트 연산 메서드
n.shl(bits) : n을 표현하는 비트를 bits만큼 왼쪽으로 이동(부호 있음)
n.shr(bits) : n을 표현하는 비트를 bits만큼 오른쪽으로 이동(부호 있음)
n.ushr(bits) : n을 표현하는 비트를 bits만큼 오른쪽으로 이동(부호 없음)
비트 논리합 연산자, 논리곱 연산자, 배타적합 연산자
자바 | 코틀린 | 설명 |
| | or | 하나라도 1이면 1 |
& | and | 하나라도 0이면 0 |
^ | xor | 같으면 0 다르면 1 |
n.inv(bits) : n를 표현하는 비트를 모두 뒤집음
조건 연산자 (삼항 연산자)
자바에서 유용하게 쓰였던 조건 연산자 ? : 는 아쉽게도 코틀린에 없습니다.
코틀린과 자바는 비슷하면서도 다릅니다. 자료형과 연산자에서 가장 큰 차이점은 아마 null 허용, 비허용 자료형으로 구분된다는 점이겠죠? 자료형을 선언할 때 var나 val 키워드를 사용하는 점도 새로우실 겁니다. 개인적으로는 자바보다 코틀린 언어를 더 선호하는데요. 간결한 코드에서 오는 매력이 크다고 생각합니다. 다음글은 조건문과 반복문에 대해 다룹니다.
'개발공부 > Kotlin : 코틀린' 카테고리의 다른 글
코틀린 익히기 6 - 프로퍼티와 object (0) | 2023.09.25 |
---|---|
코틀릭 익히기 5 - 클래스와 객체 (0) | 2023.09.21 |
코틀린 익히기 4 - 함수형 프로그래밍 (0) | 2023.09.20 |
코틀린 익히기 3 - 조건문과 반복문 (1) | 2023.09.19 |
코틀린 익히기 1 - 코틀린이란 무엇인가? (0) | 2023.02.25 |