본문 바로가기
  • 개발하는 곰돌이
Programming Language/Kotlin & Java

Kotlin 기본 문법 1 : 개요 및 변수와 함수

by 개발하는 곰돌이 2022. 11. 18.

목차

    Kotlin이란 무엇인가?

    Kotlin은 IntelliJ IDEA의 개발사인 JetBrains에서 2011년에 공개한 크로스 플랫폼 프로그래밍 언어이다. 기본적으로 Java와 100% 호환이 되기 때문에 Java를 사용하는 Android, Web Application 등의 개발에 사용할 수 있다는 특징이 있으며, 이러한 호환성 덕에 Java로 작성된 라이브러리 또한 그대로 사용할 수 있다.

    이번 포스팅 시리즈에서는 Kotlin의 기본 문법에 대해 Java와 비교해가며 작성하고자 한다.


    Kotlin의 기본 문법

    Kotlin은 Java에 비해 비교적 간결한 문법을 제공한다. Kotlin은 모든 소스 파일에 반드시 클래스를 선언할 필요가 없다. Java에서는 모든 소스파일에 파일명과 동일한 이름의 public 클래스를 작성해야 하고, main() 함수를 실행하려고 해도 반드시 클래스를 작성하고 그 내부에 public static void 메소드로 main() 함수를 작성해야했지만, Kotlin에서는 소스파일에 클래스가 반드시 존재할 필요가 없으며, 단독으로 main() 함수만 작성할 수도 있다.

    // Kotlin 1.3부터 args: Array<String>는 생략 가능
    fun main(args: Array<String>) {
        println("Hello World!")
    }

     

    위 코드를 Java로 표현하면 다음과 같다.

    public class Test {
        public static void main(String[] args) {
            System.out.println("Hello World!");
        }
    }

    Kotlin에서는 Java와 달리 자료형을 변수의 이름 뒤에 콜론(:)을 사용하여 선언한다. 변수를 선언함과 동시에 초기화를 하게 되면 초기화된 값을 토대로 자동으로 자료형을 추론하기 때문에 이 경우에는 자료형을 생략할 수 있다. 다만, 자료형을 선언하였을 경우, 해당 자료형과 일치하지 않는 타입을 대입하려고 하면 컴파일 에러가 발생한다.

     

    또한 각 문장의 끝에 세미콜론(;)을 생략할 수 있다.

    val a: Int = 50		// 세미콜론 생략 가능
    val b: String = "안녕하세요";	// 세미콜론을 붙여도 에러가 발생하진 않음
    val c = 12.5	// 실수형인 12.5로 초기화하였으므로 자동으로 Double형으로 추론하여 선언됨
    val d: Int = 3.14	// 정수형인 Int로 선언하였으나 실수형인 3.14로 초기화를 시도하여 컴파일 에러 발생

    Kotlin이 Java와 차별화되는 것 중 하나는 예약어나 특수문자 또한 그레이브(`)로 감싸기만 하면 변수나 함수 이름으로 사용할 수 있다는 점이다. 다만 퍼센트 기호(%)가 포함된 특수문자를 변수나 함수 이름으로 사용하는 것은 권장되지 않는다.

    이름에 퍼센트 기호가 포함되면 윈도우에서 문제를 야기할 수 있다는 경고가 뜬다.

    fun main() {
        val `val` = 123	// 예약어인 val을 그레이브(`)로 감싸서 변수 이름으로 사용
        val `!@#$^&` = 456	// 특수문자를 그레이브로 감싸서 변수 이름으로 사용
    
        println(`val`)	// 123
        println(`!@#$^&`)	// 456
        `!$#@`()    // "이름이 특수문자인 함수"
    }
    
    fun `!$#@`() = println("이름이 특수문자인 함수")

    주의할 점은 특수문자나 예약어를 변수 이름으로 작성할 경우엔 선언할 때와 사용할 때 모두 그레이브(`)로 감싸서 해당 이름이 예약어가 아니라는 것을 명시해야 한다는 것이다. 그렇지 않을 경우에는 컴파일 에러가 발생한다.


    Kotlin의 변수 - val, var

    Kotlin에서는 Java와는 달리 자료형 대신 val과 var라는 키워드로 변수를 선언한다. 

     

    val과 var는 다음과 같은 차이가 있다.

    • val  : 읽기 전용의 변수
    • var : 읽고 쓰기가 가능한 변수

    val

    val은 value의 약자로, 한 번 초기화를 하면 수정이 불가능한 타입의 변수이다. 즉, C/C++의 const나 Java의 final과 같이 상수처럼 사용할 수 있다.

    val a: Int = 100
    a = 55	// 이미 초기화 된 a값을 변경하려고 시도하여 컴파일 에러 발생

     

    위 코드를 Java로 표현하면 다음과 같다.

    final int a = 100;
    a = 55;	// 컴파일 에러 발생

    val은 Java의 final과는 달리 선언과 동시에 초기화를 하지 않아도 에러가 발생하지 않는다.

    Kotlin의 val과 Java의 final 모두 전역 변수로 사용할 때는 선언과 동시에 값을 초기화해야 하지만, 지역 변수로 사용할 때는 선언 후에 따로 초기화가 가능하다고 한다.

    class Test {
        val a: Int	// 컴파일 에러 발생
        a = 10
        
        fun foo() {
            val b: Int
            b = 10	// OK
            ...
        }
    }

     

    var

    var는 variable의 약자로, 값을 변경할 수 있는 일반적인 변수이다.

    var a = 10
    a += 5	// a에 5를 더하여 15가 됨

     

    위 코드를 Java로 표현하면 다음과 같다.

    int a = 10;
    a += 5;

    Kotlin의 함수

    Kotlin에서는 모든 함수를 fun 키워드로 선언하고, 함수의 선언 뒤에 콜론(:)을 붙여 함수의 반환 타입을 지정한다. 반환 타입을 선언하지 않을 경우엔, 반환값을 갖지 않는 Java의 void에 해당하는 Unit 타입으로 선언된다.

     

     

    Kotlin의 함수에서는 파라미터를 지정할 때도, 파라미터로 받을 변수의 이름 뒤에 콜론(:)으로 자료형을 지정한다.

    fun test() {	// 반환값이 없는 Unit 타입으로 자동 추론
        println("테스트 함수")
    }
    
    fun add(a: Int, b: Int): Int {	// Int 타입을 선언하였기 때문에 반드시 Int값을 반환해야 함
        return a + b
    }

     

    위 코드를 Java로 표현하면 다음과 같다.

    void test() {
        System.out.println("테스트 함수");
    }
    
    int add(int a, int b) {
        return a + b;
    }

    Kotlin에서는 단순한 함수의 경우에는 표현식으로 간단하게 작성이 가능하다.

     

    예를 들어, 위 함수들을 표현식으로 나타낸다면

    fun test() = println("테스트 함수")
    
    fun add(a: Int, b: Int) = a + b	// 반환 자료형 생략 가능

     

    이렇게 한 줄로 간단하게 나타낼 수 있다. 이 경우에는 선언과 동시에 초기화를 한 변수와 비슷하게 자료형을 생략할 수 있으며, 등호가 return을 의미하기도 하므로 return은 작성하지 않는다. return을 작성하게 되면 컴파일 에러가 발생한다.


    함수의 파라미터

    Kotlin에서의 함수가 받는 파라미터는 모두 val 타입이므로 파라미터의 값을 직접 변경할 수 없다.

    int add(int a, int b) {
        a += 10;
        return a + b;
    }

    Java에서는 위와 같은 함수에 전혀 문제가 없지만

    fun add(a: Int, b: Int): Int {
        a += 10	// 컴파일 에러 발생
        return a + b
    }

    Kotlin에서는 위와 같이 함수를 작성하게 되면 val 타입인 a 값을 변경하려고 시도하였으므로 컴파일 에러가 발생한다. 따라서, Kotlin에서 위의 Java 코드와 같은 결과를 갖는 함수는 아래와 같다.

    fun add(a: Int, b: Int): Int {
        var c = a	// 별도의 var타입 변수를 선언하여 파라미터값을 저장해야함
        c += 10
        return c + b
    }

    Kotlin은 함수의 파라미터에 기본값을 지정할 수 있다. 함수를 호출할 때 기본값을 지정한 파라미터는 값을 전달하지 않을 경우 기본값을 사용하여 함수를 실행한다.

    fun add(a: Int, b: Int = 10) = a + b
    
    println(add(10, 20))	// 30
    println(add(10))	// 20

    마무리

    Kotlin의 기본 문법 중 변수와 함수에 대해 정리해보았다.

     

    다음 포스트에서는 Kotlin의 자료형과 null-safe 특성에 대해 정리하고자 한다.

     

    댓글 피드백은 언제나 환영합니다.

     

     

    댓글