본문 바로가기
공부/kotlin

코틀린: 코틀린의 기본 문법

by 샤샤샤샤 2023. 3. 19.

코틀린

인텔리제이, 파이참과 같은 IDE 제작사 젯브레인스에서 개발한 언어로, 자바(JAVA)를 기반언어로 두고 있기 때문에 100% 호환이 가능하며 컴파일시 자바 바이트 파일(.class)이 생성된다.

주로 안드로이드 앱, 스프링부트 앱에서 사용되어 앱 전용 언어로 오해받곤 하지만, 실제로는 다양한 용도로 사용할수 있는 언어다.

 

특징

1. 타입 확장형언어이나, 원한다면 JS처럼 비확정형 언어처럼 사용할수 있다.

   (비확정형 언어의 경우, 변수의 타입이 코드의 중간에 바뀔 위험이 존재한다. (예: String -> Number))

2. 오버헤드 없는 NULL 안정성을 제공한다.

  *오버헤드: 어떤 프로그램을 실행할 시, 다른 위치의 코드를 실행시켜야 할 때가 있다. 이 코드를 실행시키기 위해 시간, 메모리 등의 자원이 간접적으로 사용되는 현상을 오버헤드라고 한다.

3. 간결하고 효율적이다.

4. 함수형, 객체지향형 언어 모두를 지원한다.

5. 모든 함수가 반환값을 가진다.

6. 예외처리를 강제하지 않는다.

 

기본 문법

fun main() {
    println( "Hello Kotlin!" )
}

자바와 달리, 함수가 실행되기 위한 기반 클래스가 없이도 함수를 실행할수 있다.

fun: 함수(function)를 의미한다.

main(): 자바기반의 언어인 만큼, 모든 실행 코드들은 main함수 아래에서 실행된다. 

println(): system.out.println()과 같은 역할을 한다. 문자열 콘솔 출력 함수이며, 실행 이후 줄바꿈이 된다.

 

메인함수(프로그램 시작점)의 매개변수

코틀린은 main함수에 매개변수를 부여할수 있다.

fun main(args: Array<String>) {
    println(args[0])
    println(args[1])
    println(args[2])
}
// 결과: This
//       is
//       Test!

매개변수를 설정하는 방법은 다음과 같다.

1. 커맨드창에서 구성편집을 선택한다.

2. 새 실행 구성 추가를 클릭하여 애플리케이션을 선택한다.

3. 실행 파일을 선택한 뒤, 매개변수를 적어 넣는다. 띄어쓰기를 기준으로 배열로 나눠진다.

4. 결과

 

변수와 상수

fun main() {
    val valInt = 10  // int타입 추론
    var varInt = 20
    }

val: 상수를 의미하며 재할당이 불가능하다.

var: 변수를 의미한다.

 

타입의 종류

자바와 동일하나, 숫자타입의 경우 U를 앞에 붙여 양수(+)값만 표현할수 있다. 이경우 표현범위가 2배가 된다.

정수형: Int, Float, Long Double, Short, Byte (숫자를 표현할때 원하는 곳에  _를 써넣을수 있으며, 이는 사용자의 가독성 향상을 위해 지원하는 문법이기 때문에 값에는 영향이 생기지 않는다.)

자료형: Char, String

 

 

타입추론과 타입확정
앞서 말했듯 Kotlin은 타입을 확정시킬수도 있으며, JS처럼 타입추론 역시 가능하다.

타입은 변수(상수)명 뒤에 :(타입)을 적는 것을 통해 확정시킬수 있다.

fun main() {
    var str: String = "This is String!"
    var int: Int =10;
    var long : Long = 20L;
    }

 

문자열 풀(Pool)을 이용한 문자열 저장

코틀린은 자바와 달리 문자열을 문자열 풀(Pool)라는 공간에 따로 저장을 한다. 그리고 해당 풀에 저장된 값과 같은 값을 가진 데이터가 다시 선언될 경우, 동일한 메모리 주소를 부여하게 된다.(자바의 경우, 데이터 값이 같더라도 각기 다른 두개의 메모리 주소에 같은 값을 저장한다.)

 fun main() {
        //문자열 풀(Pool)을 이용한 문자열 저장
        var str1 = "Hello"
        var str2 = "Hello" //스트링풀에 str1과 동일한 주소를 부여받음

        println( "str1 == str2: ${ str1 == str2 }")
        println( "str1 === str2: ${ str1 === str2 }")

        println( str1.hashCode() ) //69609650 주소값이 동일
        println( str2.hashCode() ) //69609650
    }

결과:

== : 내부의 데이터 값이 같은지 비교한다.

=== : 주소값이 같은지 비교한다.

.hashCode(): 데이터가 저장된 메모리 주소값을 가져온다.

 

문자열의 보간(문자열과 변수 연결)

자바와 동일하게 ""(쌍따옴표)와 + 연산자를 사용해서 표현할수 있으나, 코틀린만의 $표시를 사용한 표현이 존재한다.

또한 \(백 슬래시)를 사용하지 않고도 ${' '}를 통해 표현이 가능하다. 참고로 $문법은 문자열을 의미함으로 무조건 " "안에서 표현이 되어야만 한다

    fun main() {
        var varStr = "String"
        println("varStr : " + varStr)
        println("varStr : $varStr")
        println("\"")
        println("${'"'}")
    }

결과:

 

널 안정성 문법

코틀린은 null 안정성을 보장하는 문법을 제공하며, null값의 변수 선언이 불가능하다. 만약 null로 선언된 변수가 존재한다면 대부분의 경우 코드가 실행되지 않고 컴파일 오류가 발생하게 된다.

 

(변수명): (타입)?    : 변수를 null 허용으로 만든다.

(변수명): (타입)?.(함수)  : 세이프콜. 변수를 널 허용으로 만들며, 널이 아니면 함수를 실행시킨다.

(변수명): (타입)?:   : 엘비스 연산자. 널일때 기본값을 설정한다.

(변수명): (타입)!!    : non-null 단정 기호. 변수값이 널이 아님을 명시한다. 그럼에도 null값이 들어온다면 NPE가 발생한다.

 

자료형, 객체형 변환과 확인

1. 자료형 to 변환

toInt, toByte, toLong, toShort

toShort, toDouble

toChar, toString

    fun main() {
        var myInt: Int = 10
        var myLong = myInt.toLong()
        println(myLong)
    }

 

2. 객체 타입 변환

자바의 최상위 객체 Object와 비슷한 역할을 하는 Any 객체가 존재한다. Any는 어떤 타입이든 담을수 있는 객체로, 기본형의 경우는 코틀린이 스스로 내부값을 참조해 자동변환이 이뤄진다.

    fun main() {
        var myAny: Any
        myAny = "문자열" //String타입으로 변경됨. 스마트 캐스트
        println( myAny is String )
        myAny = 10              //스마트 캐스트
        println( myAny is Int )
    }

결과:

is: 변수가 타입(형식)과 동일한지 비교하는 문법

 

객체 타입 변환 as

(객체) as (타입) : 객체를 타입으로 변환한다. 만약 변환할수 없다면 예외가 발생한다.

(객체) as? (타입) : as와 똑같은 기능을 하나, 변환이 불가능할 경우 예외를 일으키지 않고 null값을 반환한다.

**Any는 최상의 객체임으로 형변환을 하더라도 Any여전히 Any객체이기도 하다.

    fun main() {
        var myAny: Any = 10L;
       // var myLong2 = myAny as Long //as 형변환이 불가할때 예외발생 왜? Any -> Long불가
        var myLong3 = myAny as? Long //as? 형변환 불가할때 null 반환
            println(myLong3)
            println(myLong3 is Long)
            println(myLong3 is Any)
            println(myLong3 ?.javaClass)
    }

결과:

.javaClass: 자바 클래스 타입을 출력한다.

 

Any타입 매개변수로 함수 출력

    fun main() {
        myFun(10)
        myFun("문자열")
    }
    
    fun myFun(param: Any){
        if( param is String) {
            println("param is String : $param")
        }
        if( param is Int) {
            println("param is Int : $param")
        }
    }

결과:

 

 

Kotlin 코드를 Java문법으로 보는 법

코틀린은 자바와 100%호환이됨으로 자바의 문법을 사용하더라도 문제없이 작동한다. 둘 모두 컴퓨터가 이해할수 있도록 컴파일하면 .class파일이 나오기 때문이다. 따라서 kotlin문법을 java코드로 변환하는 것 역시 가능하다.

인텔리제이의 경우, 다음의 과정을 통해 확인할수 있다.

 

1. 상단바에서 [도구] -> [kotlin] -> [Kotlin 바이트코드 표시] 를 선택한다.

2. 디컴파일을 누른다.

3. 변환된 코드를 확인한다.

'공부 > kotlin' 카테고리의 다른 글

코틀린의 클래스  (0) 2023.03.21
코틀린: 코틀린 함수  (1) 2023.03.20