Learn & Record
Kotlin (프로젝트 생성, 변수, 자료형, 데이터타입, const, 형변환, 기본형과 참조형 비교, 스마트캐스트, 자료형검사) 본문
Kotlin (프로젝트 생성, 변수, 자료형, 데이터타입, const, 형변환, 기본형과 참조형 비교, 스마트캐스트, 자료형검사)
Walker_ 2024. 4. 3. 16:431. 프로젝트 생성
- 코틀린 프로젝트 (JDK 17) 생성
- 패키지 생성 후 > 코틀린 파일 생성
2. 코틀린
- Kotlin 코틀린은 2017년 안드로이드 공식 개발 언어로 지정
- 안드로이드의 개발 환경은 Java 언어를 중심으로 확장되어 왔는데, 새로운 개발 언어들 도입함
- 구글이 코틀린을 안드로이드 공식 언어로 지정한 이유는 코틀린이 현대적인 언어로서 갖는 장점들 때문
- 코틀린의 장점
- 코틀린은 자바와 100% 상호 호환되면서도 더 현대적이고 간결. 때문에 자바와 코틀린 코드를 같이 사용가능
- 코틀린은 Null Pointer Exception이 발생할 수 있는 코드를 금지하고 Null에 대해 안전한 코드를 간결하게 표현 지원
- 코틀린은 '타입추론'을 지원. 때문에 저적 타입 지정 언어가 가진 정확성과 성능을 보장하면서도 동적 타입처럼 간결함
- "람다 표현식"을 지원. 코틀린의 람다 표현식은 자바8부터 지원도는 람다 표현식보다 더 간결
- "객체 지향" 프로그래밍과 "함수형" 프로그래밍 스타일 모두 지원
- "확장 함수"는 기존클래스의 변경없이 클랫의 기능을 추가하는 것이 가능
- 이미 널리 쓰이는 "코드 패턴을 간결화 할 수 있도록 설계".
- 예를 들면 "getter", "setter"를 묵시적으로 제공하고 자주 쓰이는 "Singleton 패턴"은 "object"로서 지원
- 코틀린 함수는 "일급 객체"로서 다른 함수의 파라미터로 전달 가능하고 함수의 반환값을 함수 형태로 반환할 수 있어
- "높은 추상화"가 가능
- 코틀린은 "불변성을 보장하는 변수"와 "변경이 가능한 변수"를 언어 차원에서 분리
- 불변값을 갖는 변수의 사용은 "다중 쓰레드 애플리케이션 개발"에 보다 유용
- 코틀린은 유명 IDE 제작사인 JetBrain이 만든 언어로, 같은 회사에서 만든 IntelliJ와 Android Studio IDE에서 잘 지원됨
- 코틀린은 이와 같은 장점들을 이유로 빠르게 기존 Java 언어 중심의 안드로이드 개발 환경을 대체해 가고 있음
- 나열된 장점 중에서 특히 코틀린이 빠르게 개발자들을 확보하게 된 주요특징 중 하나는 Java 언어와 100% 상호 지원됨
- 코틀린은 기존 Java 환경과 100% 호환되도록 설계되어 기존의 방대한 라이브러리를 그대로 사용가능
- 또한 안드로이드를 공식적으로 지원하므로, 특히 안드로이드 환경에서 사용하기 편하도록 확장 기능을 제공
- 때문에 안드로이드에서 불필요하게 반복되는 코드를 획기적으로 줄일 수 있음
fun main() {
print("Hello Kotlin")
}
3. 변수
- 코틀린에서 값을 변경할 수 있는 변수는 variable는 var로, 값을 변경할 수 없는 변수값 value는 val로 선언
val pi:Double = 3.14 // val 변수명: 자료형 = 값
- 자료형을 앞에 쓰던 자바와는 다르게 코틀린은 변수명을 먼저 쓰고, 클론 : 을 쓴 후 자료형을 명시
- 문맥상 추론이 가능하다면 자료형을 생략할 수 있음. 이를 코틀린의 형추론이라고 함
val name = "tom" // String 으로 형 추론
- val은 값을 변경할 수 없는 변수이므로 값을 재할당을 하면 다음과 같은 컴파일 오류가 남
- pi = 3.141593 // 오류 Val coonot be reassingned
- 값을 변경하고 싶을 때는 var을 사용해야 됨. var로 정의된 변수는 값을 바꿀 수 있음
var age = 21 // 형추론 Int
println(age) // 21
age = 25 // 재할당
print(age) // 25
4. 변수와 자료형
- val로 변수를 선언하면 최초로 지정한 변수의 값으로 초기화하고 더 이상 바꿀 수 없는 '읽기 전용 변수'가 됨
- var로 변수를 선언하면 최초로 지정한 벼수의 초깃값이 있더라도 '값을 바꿀 수 있음'
- 변수를 선언한 예:
- val username : String = "kildong"
- 변경되지 않는 변수 username이 String 자료형으로 선언되었고 "kildong"이 값으로 할당
- 그런데 코틀린은 자료형을 지정하지 않고 변수를 선언하면 변수에 할당된 값을 보고
- 알아서 자료형을 지정할 수 있음
- 이것을 '자료형 추론'이라고 함
- 즉 다음과 같이 username 변수에 "kildong"이라는 값만 할당해도 됨
- 코틀린이 알아서 이 변수의 자료형을 String으로 지정
- val username = "kildong"
- 단 자료형을 지정하지 않은 변수는 반드시 자료형을 추론할 값을 지정해야 함
- 선언만 하고 초기화를 하지 않을 때는 반드시 자료형을 적어줘야 함
fun main() {
val number = 10 // number 변수는 Int형으로 추론
var language = "Korean" // language변수는 String으로 추론
language = "English" // var 키워드로 선언한 변수는 값을 다시 할당할 수 있음
// language = 10 // 파이썬 처럼 다른 데이터 타입의 데이터는 저장할 수 없음
val secondNumber: Int = 20 // secondNumber 변수는 자료형을 Int로 명싲거으로 지정
// secondNumber = 30 // val로 선언한 변수를 값으로 다시 할당할 수 없음
println("number: $number")
println("language: $language")
println("secondNumber: $secondNumber")
}
5. 데이터 타입
- 기본 자료형
- 자료형은 크게 기본 자료형 primitive data type과 참조 자료형 reference data type으로 나누어 짐
- 기본형은 순순하게 값을 저장하는 자료형이고 자바에서는 int, byte, boolean등이 해당
- 참조형은 객체를 만들고 변수에는 객체의 참조값을 저장하고 자바에서는 String, Array 등이 해당
- 코틀린은 자료형은 모두 참조형. 즉 모든 자료형이 객체 형태
- [1] 정수 자료형
- Byte, Short, Int, Long
- 코틀린은 형추론을 통해서 자료형을 명시하지 않아도 알아서 추론
- 정수의 경우에는 숫자가 작아도 Int형으로 추론하기 때문에 Byte나 Short같은 작은 범위를 사용할 땐 자료형 지정해야 함
val num1 = 10
- 1) Int : 정수
- 소수점이 없는 정수값을 저장할 때 사용
- 가독성을 높이기 위해 언더바(_)로 자릿수를 구분할 수 있음
- 다만, 언더바는 개발자가 읽기 쉽게 하기 위한 것으로 컴퓨터는 동일하게 인식
var intValue: Int
intValue = 3
intValue = 2_147_483_435
- 2) Long : 정수
- Int보다 큰 범위의 정수를 저장할 수 있음
- Double과 Float의 관계처럼 Int와 구분하기 위해서 숫자의 끝에 L을 부여줌
- Long 타입의 경우에는 설정한 글꼴에 따라 숫자 1과 구분이 어려울 수 있기 때문에 대문자를 사용
// Long
var longValue = 3_141592L
- 3) Short와 Byte : 정수
- 역시 정숫값으 저장할 때 사용하는데 입력할 수 있는 값의 크기가 Int보다 작음
// Short와 Byte
var shortValue: Short = 32_767
var byteValue: Byte = 127
- [2] 실수 자료형
- Double, Float
- 실수의 경우 자료형을 명시하지 않으면 Double 형이 됨. Float형으로 지정하고 싶다면 값뒤에 F를 추가로 붙여줌
// Double, Float
val numFloat: Float = 100.0F // 자료형 생략 가능
val numDouble: Double = 100.0 // 자료형 생략 가능
- 1) Double : 실수
- 소수점에 있는 값을 저장할 때 사용
// Double
var doubleValue: Double
doubleValue = 3.141592
- 2) Float : 실수
- Double과 동일한 용도이지만 더 작은 범위의 숫자를 저장할 때 사용
- Double과 구분하기 위해 Float의 경우 숫자 끝에 'F'를 붙여줌
// Float
var floatValue: Float
floatValue = 3.141592F
- [3] 문자 자료형
- 문자 자료형은 문자하나를 표현하는 Char형과 문자열을 표현하는 String형으로 나눌 수 있음
- Char형은 문자열을 작은 따옴표로 감싸고, String형은 문자열을 큰 따옴표로 감쌈
val char: Char = 'a' // 자료형 생략 가능
val string: String = "abc" // 자료형 생략 가능
- 1) Char : 문자형
- 하나의 글자만 외따옴표(')로 감싸서 저장할 수 있음
- Char는 타입을 특정하지 않아도 외따옴표 안에 하나의 문자를 지정 가능
val char: Char = 'a' // 자료형 생략 가능
- 2) String : 문자열
- 여러개의 문자를 지정
- 거의 모든 컴퓨터 언어에서 가장 많이 사용되는 타입
val string: String = "abc" // 자료형 생략 가능
- [4] 논리 자료형
- 참, 거짓을 표현하는 true, false를 사용하고 주로 조건 검사에 사용
val isTrue: Boolean = true // 자료형 생략 가능
6. 상수 const
- 상수는 주로 기준이 되는 변하지 않는 값을 입력해둘 때 사용하며, 읽기 전용 변수인 val 앞에 const 키워드 붙여서 만듬
- 전역으로만 사용가능
fun main() {
}
const val PI = 3.1415925252142;
- val과 같이 읽기 전용인 것은 동일하지만, 컴파일 시에 값이 결정되기 때문에 Int, Long과 같은 기본형과 문자열인 String만 입력할 수 있음
7. 형변환
- 자료형을 비교하고 검사하고 변환하기
- 코틀린의 자료형은 모두 참조형으로 선언
- 1) 자료형 변환
- 코틀린에서는 자료형이 다른 변수에 재할당하면 자동 형 변환이 되지 않고 자료형 불일치 오류 Type Mismatch 발생
- 의도하지 않게 자료형이 변하는 것을 방지하기 위한 것
val a : Int = 1
// val b : Double = a // 자료형 불일치 오류 발생. 자바와 차이점
// val c: Int = 1.1 // 자료형 불일치 오류 발생
- 변수 a는 Int형이므로 Double형 변수 b에 다시 할당할 수 없음
- 만일 자료형을 변환해 할당하고 싶다면 코틀린에서는 자료형 변환 메서드를 이용해야 함
- Int형 변수 a에 명시적으로 Double형으로 변환하는 toDouble() 메서드를 사용
val b: Double = a.toDouble()
print("a = $a, b= $b") // a =1 , b = 1.0
- 표현식에서 자료형이 서로 다른 값을 연산하면, 자료형이 표현할 수 있는 범위가 큰 자료형으로 자동 형변환하여 연산
val result = b + a
println("result = $result") // result = 2.0
- 코틀린에서 사용하는 형변환 메서드
- toByte : Byte
- toLong : Long
- 등등 to + 원하는 타입
8. 기본형과 참조형 비교
- 자료형을 비교할 때는 단순히 값만 비교하는 방법과 참조 주소까지 비교하는 방법이 있음
- (자바에서는 기본 자료형은 값을 비교, 참조 자료형은 주소 비교)
- 단순히 값만 비교할 때는 이중 등호(==)를 사용하고, 참조 주소를 비교하려면 삼중 등호(===)를 사용
- 이중 등호는 참조와 상관없이 값이 동일하면 true를, 값이 다르면 false를 반환
- 삼중 등호는 값과 상관없이 참조가 동일하면 true를 반환, 값이 동일하더라도 참조 주소가 다르면 false를 반환
- 다음은 Int형으로 선언한 변수 a, b에 128을 대입하고 이중 등호와 삼중 등호로 비교한 것
- 비교 결과는 모두 true. 이 때 참조형으로 선언된 a와 b는 코틀린 컴파일러가 기본형으로 변환하여 저장한다는 점 주의
- 즉, 여기서는 삼중 등호가 비교하는 값도 저장된 값인 128.
val a:Int = 128
val b:Int = 128
println(a == b) // true
println(a === b) // true
- 참조 주소가 달라지는 경우는 null을 허용한 변수
- null을 혀용한 변수는 같은 값을 지정해도 이중 등호와 삼중 등호를 사용한 결과값이 다름
val c: Int? = 128
val d: Int? = 128
println(c == d) // true
println(c === d) // false
9. 스마트캐스트
- 스마트 캐스트 알아보기
- 만약 어떤 값이 정수일 수도 있고 실수일 수도 있는 경우에는 그때마다 자료형을 반환해도 되지만
- 스마트 캐스트를 사용할 수도 있음
- 스마트 캐스트 Smart Cast는 컴파일러가 자동으로 형변환
- 대표적으로 스마트 캐스트가 적용되는 자료형은 Number형이 있음
- Number형을 사용하면 숫자를 저장하기 위한 특수한 자료형 객체를 만듬
- Number형으로 정의된 변수에는 저장되는 값에 따라 정수형이나 실수형 등으로 자료형이 변환됨.
fun main() {
var test: Number = 12.2 // 12.2에 의해 test는 Float형으로 스마트 캐스트
println("$test") // 12.2
test = 12 // Int형으로 스마트 캐스트
println("$test") // 12
test = 120L // Long형으로 스마트 캐스트
println("$test") // 120
test += 12.0f // Float형으로 스마트 캐스트
println("$test")
}
10. 자료형 검사하기
- 변수의 자료형을 알아낼때는 is 키워드를 사용
- is는 왼쪽 항의 변수가 오른쪽 항의 자료형과 같으면 true를, 아니면 false를 반환
var num = 256
if (num is Int) { // num의 자료형이 Int라면 실행
println(num)
} else if (num !is Int) {
println("Not an Int")
}
- is는 변수의 자료형을 검사한 다음 그 변수를 해당 자료형으로 변환하는 기능도 있음
- Any형을 사용하면 자료형을 결정하지 않은 채로 변수를 선언할 수도 있음
- Any형은 코틀린의 최상위 기본 클래스로 어떤 자료형이라도 될 수 있는 특수한 자료형
- 이때 is를 사용하여 자료형을 검사하면 검사한 자료형으로 스마트 캐스트
val x: Any
x = "Hello"
if (x is String) {
println(x.length) // 5
}
- 변수 x는 Any형으로 선언. 그 후에 "Hello"라는 값을 대입. 아직 x의 자료형은 Any형
- 이후 if문으로 is로 x의 자료형을 검사할 때 String으로 스마트 캐스트되어 조건문이 실행
공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.
부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.
읽어주셔서 감사합니다 :)
'Dev > Kotlin' 카테고리의 다른 글
Kotlin (클래스 기본 구조, 클래스 코드 작성, 프라이머리 생성자, 세컨더리 생성자, Default 생성자, 클래스의 사용, Object) (0) | 2024.04.16 |
---|---|
Kotlin (컬렉션, 리스트 List, 셋 Set, 맵 Map) (2) | 2024.04.12 |
Kotlin (함수, 함수의 사용, 함수 파라미터의 정의, login, 배열 문제, 점수 프로그램 함수화) (0) | 2024.04.09 |
Kotlin (연습문제, while, doWhile, while_doW 차이, break, continue, 연습문제~5, 배열) (0) | 2024.04.08 |
Kotlin (묵시적변환, 제어문, 연습문제, when, 범위클래스, for반복문, 연습문제) (0) | 2024.04.04 |