Dev/Kotlin

Kotlin (프로젝트 생성, 변수, 자료형, 데이터타입, const, 형변환, 기본형과 참조형 비교, 스마트캐스트, 자료형검사)

Walker_ 2024. 4. 3. 16:43

1. 프로젝트 생성

 - 코틀린 프로젝트 (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으로 스마트 캐스트되어 조건문이 실행

 


공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.

부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.

읽어주셔서 감사합니다 :)