728x90
728x170
자료형과 변수
자료형과 변수
자료형
- Int
- String
- Float
- ...
변수
- val (Value) : 불변형(Immutable)
- var (Variable) : 가변형(Mutable)
변수의 선언
val | username: | String | = | "Kildong" | |
선언 키워드 | 변수 이름 | 자료형 | 값 |
변수 선언 예
val username = "Kildong" // 자료형을 추론하여 String 으로 결정
var username // 자료형을 지정하지 않은 변수는 사용할 수 없음.
val init: Int // 사용 전 혹은 생성자 시점에서 init 변수를 초기화 해야 함.
val number = 10 // number 변수는 Int 형으로 추론
여기서 주의할 점은, var username 과 같이 자료형을 지정하지 않은 변수는 사용할 수 없다는 점이다. 다음과 같이 끊어서도 사용할 수도 없다.
var username
username = "Kildong" // Compile Error!
변수 이름 생성 규칙
- 변수 이름은 123abc 와 같이 숫자로 시작하면 안 된다.
- 변수 이름에는 while, if 와 같이 코틀린에서 사용되는 키워드는 사용할 수 없다.
- 변수 이름은 의미 있는 단어를 사용하여 만드는 것이 좋다.
- 여러 단어를 사용하여 변수 이름을 지을 경우, 카멜 표기법(Camel Expression)을 사용하라.
변수명
- 일반 변수, 함수명 등은 단봉 낙타와 같은 카멜 표기법을 사용한다.
camelCase
numberOfBooks
myFirstNumber
manyVariableCamelCase
myFunction
- 클래스, 인터페이스 등은 쌍봉 낙타 혹은 파스칼 표기법(Pascal Expression)을 사용한다.
AnimalCategory
CarEngine
자료형 알아보기
기본형(Primitive Data Type)
- 가공되지 않은 순수한 자료형으로 프로그래밍 언어에 내장
- int, long, float, double 등
참조형(Reference Type)
- 동적 공간에 데이터를 둔 다음 이것을 참조하는 자료형
- Int, Long, Float, Double 등
당연히 기본형이 성능이 더 좋다! 코틀린에서는 참조형만 사용하도록 하고 있는데, 사용 시 컴파일 과정에서 기본형으로 변환된다. 코틀린에서는 참조형을 선언해서 사용하지만, 컴파일 과정을 거치면 기본형 같이 사용한다.
기본형과 참조형의 동작 원리 이해하기
- 자바의 기본형과 참조형의 원리
int a = 77; // 기본형
Person person = new Person(); // 객체 참조형으로, person 객체를 위해 참조 주소(A12)를 가진다.
기본형 자료형은 스택(Stack) 영역에 쌓이게 되고, 참조형 자료형은 힙(Heap) 영역에 쌓이게 된다.
정적 자료형은 스택에, 동적 자료형은 힙에 쌓인다는 것을 기억하자!
- 코틀린에서는 코딩 시 참조형만 사용되며, 코틀린 컴파일러가 자동적으로 최적화한다.
- 컴파일 과정을 거친 후 기본형이 사용된다.
정수 자료형
- 음수가 사용되는 부호 있는 정수 자료형
형식 | 자료형 | 크기 | 값의 범위 |
정수 자료형 | Long | 8 Bytes (64 Bits) | $-2^{63} ~ 2^{63}-1$ |
Int | 4 Bytes (32 Bits) | $-2^{31} ~ 2^{31}-1$ | |
Short | 2 Bytes (16 Bits) | $-2^{15} ~ 2^{15}-1(-32,768~ 32,767)$ | |
Byte | 1 Byte (8 Bits) | $-2^{7} ~ 2^{7}-1(-128 ~ 127)$ |
- 부호 없는 정수 자료형 (1.3버전 실험적)
형식 | 자료형 | 크기 | 값의 범위 |
부호 없는 정수형 |
ULong | 8 Bytes (64 Bits) | $0 ~ 2^{64}-1$ |
UInt | 4 Bytes (32 Bits) | $0 ~ 2^{32}-1$ | |
UShort | 2 Bytes (16 Bits) | $0 ~ 2^{16}-1(0 ~ 65,535)$ | |
UByte | 1 Byte (8 Bits) | $0 ~2^{8}-1(0 ~ 255)$ |
- 코틀린의 정수 자료형은 부호가 있는 것과 부호가 없는 것으로 나눌 수 있다.
- 숫자 크기에 상관 없이 기본은 모두 Int 형으로 추론된다.
자료형 사용 예
- 자료형 생략
val num05 = 127 // Int 형으로 추론
val num06 = -32768 // Int 형으로 추론
val num07 = 2147483647 // Int 형으로 추론
val num08 = 9223372036854775807 // Long 형으로 추론
- 접미사, 접두사 사용
val exp01 = 123 // Int 형으로 추론
val exp02 = 123L // 접미사 L을 사용해 Long 형으로 추론
val exp03 = 0x0F // 접두사 0x를 사용해 16진 표기가 사용된 Int 형으로 추론
val exp04 = 0b00001011 // 접두사 0b를 사용해 2진 표기가 사용된 Int 형으로 추론
- 작은 값의 사용
val exp08: Byte = 127 // 명시적으로 자료형을 지정 (Byte)
val exp09 = 32767 // 명시적으로 자료형을 지정하지 않으면 Short 형 범위의 값도 Int 형으로 추론
val exp10: Short = 32767 // 명시적으로 자료형을 지정 (Short)
- 부호 없는 정수 자료형
val uint: UInt = 153u
val ushort: UShort = 65535u
val ulong: ULong = 46322342uL
val ubyte: UByte = 255u
- 큰 수를 읽기 쉽게 하는 방법 (가독성 향상)
- 읽기 쉽게 하기 위해 언더 스코어(_)를 포함해 표현
val number = 1_000_000
val cardNum = 1234_1234_1234_1234L
val hexVal = 0xAB_CD_EF_12
val bytes = 0b1101_0010
실수 자료형
형식 | 자료형 | 크기 | 값의 범위 |
실수형 | Double | 8 Bytes (64 Bits) | 약 $4.0E-324 ~ 1.7E+308$ (IEEE754) |
Float | 4 Bytes (32 Bits) | 약 $1.4E-45 ~ 3.4E+38$ (IEEE754) |
val exp01 = 3.14 // Double 형으로 추론 (기본)
val exp02 = 3.14F // 식별자 F에 의해 Float 형으로 추론
- 코틀린은 자료형을 명시하지 않으면 Double 형으로 추론한다.
- 만약 Float 형으로 지정하고 싶으면 간략하게 식별자 F를 실수 옆에 붙이는 방법을 사용하면 된다.
var doubleNum = 0.03 // Double 형으로 추론
var floatNum = 0.03F // Float 형으로 추론
- 실수의 개수는 무한하지만 메모리 공간은 유한하다. 그래서 메모리에 모든 실수를 표현하기는 어렵다.
- 이러한 메모리의 단점을 극복하기 위해 실수를 표현할 때 부동 소수점(Floating-Point) 방식을 사용한다.
- 부동 소수점 방식은 실수를 가수, 지수로 나누어 표현하는 방식이다.
- $3.14 × 10^{16} = 3.14E+16$
- 부동 소수점 방식은 실수를 가수, 지수로 나누어 표현하는 방식이다.
val exp03 = 3.14E-2 // 왼쪽으로 소수점 2칸 이동, 0.0314
val exp04 = 3.14e2 // 오른쪽으로 소수점 2칸 이동, 314
- 컴퓨터는 음수를 표현하기 위해 2의 보수라는 개념을 사용하고 있다.
- 컴퓨터의 연산기는 덧셈 기능의 회로만 있으며, 덧셈 기능을 뺄셈으로 구현하기 위해서 만들어진 규칙이다.
부동 소수점의 이해
- 32비트와 64비트의 부동 소수점 표현
- Float 형
- 1 Bit : 부호
- 8 Bits : 지수
- 23 Bits : 가수
- Double 형
- 1 Bit : 부호
- 11 Bits : 지수
- 52 Bits : 가수
부동 소수점의 표현
- $-12.375_{(10)}$ 의 표현
- 음수 : $-$
- 127 (bias) 기준으로 구분
- 절댓값 : $12.375$
- $1100.011_{2}$
- $1.100011 × 2^{3}$
- 정수부의 1 생략
- $100011$을 가수부에 표현
- $2^{3}$ 은 진수부에 다음과 같이 표현한다.
- $127(bias) + 3 = 130_{(10)} = 10000010$
- 음수 : $-$
소수를 이진법으로 나타내는 방법은 다음과 같다.
IEEE 방식의 부동 소수점 제한
- 공간 제약에 따라 부동 소수점 연산의 단점이 존재한다.
fun main() {
var num: Double = 0.1
for (x in 0..999) {
num += 0.1
}
println(num) // 100.0.9999999999859
}
0.1을 1000번 더하면 100이 나와야 하지만, IEEE 방식의 부동 소수점 방식으로 계산을 할 경우 정확하지 않은 결과값이 출력된다.
정수 자료형과 실수 자료형의 최솟값과 최댓값 출력하기
- MIN_VALUE 또는 MAX_VALUE 자료형 요소를 이용하여 자료형의 최솟값과 최댓값을 확인할 수 있다.
fun main() {
println("Byte min: " + Byte.MIN_VALUE + " max: " + Byte.MAX_VALUE)
println("Short min: " + Short.MIN_VALUE + " max: " + Short.MAX_VALUE)
println("Int min: " + Int.MIN_VALUE + " max: " + Int.MAX_VALUE)
println("Long min: " + Long.MIN_VALUE + " max: " + Long.MAX_VALUE)
println("Float min: " + Float.MIN_VALUE + " max: " + Float.MAX_VALUE)
println("Double min: " + Double.MIN_VALUE + " max: " + Double.MAX_VALUE)
}
Byte min: -128 max: 127
Short min: -32768 max: 32767
Int min: -2147483648 max: 2147483647
Long min: -9223372036854775808 max: 9223372036854775807
Float min: 1.4E-45 max: 3.4028235E38
Double min: 4.9E-324 max: 1.7976931348623157E308
2의 보수란?
자료형의 최소 최대
- 음수는 2의 보수 표현을 사용해 연산된다.
- 절댓값의 이진수에 값을 뒤집고 1을 더한다.
- 예) $-6_{(10)}$
- 6의 2진값 : $0000 0110_{(2)}$
- 값 뒤집기 : $1111 1001_{(2)}$
- 1을 더하기 : $1111 1010_{(2)}$
- 2의 보수를 사용하는 이유?
- 제한된 자료형을 음수/양수로 나누어 최대한 사용하며, 2의 보수는 가산 회로만으로 뺄셈을 표현할 수 있기 때문
그 밖의 자료형
논리 자료형
형식 | 자료형 | 크기 | 값의 범위 |
논리형 | Boolean | 1 Bit | true, false |
val isOpen = true // isOpen은 Boolean으로 추론
val isUploaded: Boolean // 선언만 한 경우 자료형(Boolean) 반드시 명시
문자 자료형
형식 | 자료형 | 크기 | 값의 범위 |
문자 | Char | 2 Bytes (16 Bits) | $0 ∼ 2^{16}-1$ (\u0000 ~ \uFFFF) |
val ch = 'c' // ch는 Char로 추론
val ch2: Char // 선언만 한 경우 자료형(Char) 반드시 명시
문자열 자료형
- String 으로 선언되며 String Pool 이라는 공간에 구성
fun main() {
var str1: String = "Hello"
var str2 = "World"
var str3 = "Hello"
println("str1 === str2: ${str1 === str2}")
println("str1 === str3: ${str1 === str3}")
}
- 코틀린에서 == 는 값만 비교하지만, === 는 '참조'까지 비교한다. - 자바는 == 으로 참조까지 비교할 수 있고, === 연산자는 없다. - var로 선언된 str1의 참조 주소는 가변형으로, 바뀔 수 있다. (다른 것 지정 가능) - 다만, 일단 선언돼 생성된 메모리 공간의 Hello 는 변경되지 않는다. (변경 불가능) |
표현식에서 문자열
- 표현식과 $ 기호를 사용하여 문자열 출력하기
var a = 1
var s1 = "a is $a" // String 자료형의 s1을 선언하고 초기화. 변수 a가 사용됨.
- 사용 예제
fun main() {
var a = 1
val str1 = "a = $a"
val str2 = "a = ${a + 2}" // 문자열에 표현식 사용
println("str1: \"$str1\", str2: \"$str2\"")
}
str1: "a = 1", str2: "a = 3"
참고 사이트
728x90
그리드형(광고전용)
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] 검사와 자료형 변환 (0) | 2022.09.21 |
---|---|
[Kotlin] 널(Null) (0) | 2022.08.28 |
[Kotlin] InteliJ IDEA 살펴보기 & main() 함수 (0) | 2022.08.26 |
[Kotlin] 자바 JDK 설치하기 / 환경 변수 설정하기 (0) | 2022.08.26 |
[Kotlin] 코틀린의 개요 (0) | 2022.08.24 |
[Kotlin] 코틀린 한 눈에 알아보기 (0) | 2022.08.21 |
보일러플레이트(Boilerplate) (0) | 2021.04.05 |
함수에서 다양한 인자의 개수를 전달받기 (vararg 키워드) (0) | 2021.03.15 |