JuBin's personal study blog

[Kotlin] Kotlin in Action, 2장 코틀린 기초 본문

Kotlin

[Kotlin] Kotlin in Action, 2장 코틀린 기초

JuBin 2021. 9. 6. 17:15
반응형

- 2장 목차 -

 

2.1 기본요소 : 함수와 변수

2.2 클래스와 프로퍼티

2.3 선택 표현과 처리 : enum과 when

2.4 대상을 이터레이션 : while과 for 루프

2.5 코틀린의 예외처리

 


2.1 기본 요소 : 함수와 변수

 

  • 함수를 선언할 떄 fun 키워드를 사용하고 파라미터 이름 뒤에 해당 파라미터의 타입을 씁니다.

  • 코틀린 함수의 기본 구조
    코틀린에서 if는 식이지 문이 아닙니다. 식은 값을 만들어 내는 역할이고 문은 아무런 값을 만들어내지 않는다는 차이가 있습니다.
    자바에서 모든 제어 구조가 문인 반면, 코틀린에서는 루프를 제외한 대부분의 제어 구조가 식입니다.
    /*
    * 코틀린 함수의 기본 구조
    * 블록이 본문인 함수
    */
    fun max(a: Int, b:Int): Int {
    	return if (a>b) a else b
    }

    /*
    * 식이 본문인 함수
    */
    fun max(a: Int, b: Int) = if (a>b) a else b​
    식이 본문인 함수에서 반환 타입을 생략할 수 있는 이유는 코틀린은 정적 타입 지정 언어이므로 컴파일 시점에 함수 본문 식을 분석하여 타입추론이 가능합니다.
    식이 본문인 함수만 반환 타입이 생략 가능합니다.

  • 코틀린 변수선언 기본구조
    - val(value) - 변경 불가능한 참조 변수, 초기화하고 나면 재대입이 불가능, 자바의 final 변수에 해당됨.
                      블록을 실행할때 정확히 한번만 초기화 되야됨.
    - var(variable) - 변경 가능한 참조 변수, 자바의 일반 변수에 해당됨.
    // 변수선연 예시
    val question = "안녕하세요"
    val answer = 42
    val intValue: Int = 42
    val yearsToCompute = 7.5e6 // 7.5 x 10의6승
    
    val test: Int
    test = 42 // 초기화 식을 사용하지 않고 변수를 선언하려면 변수타입을 반드시 명시해야 된다.
    
    var test2 = 42
    test2 = "test" // 컴파일 과정에서 type mismatch 오류 발생​
  • 문자열 템플릿
    fun main(args: Array<String>) {
       val name = if (args.size > 0) args[0] else "Kotlin"
       println("Hello, $name!!")  // 자바의 ("Hello,"+name+"!!")과 같다
       
       println("Hello, ${args[0]}")  // ${} 중괄호 사용
       println("Hello, ${if (args.size > 0) args[0] else "Kotlin"}!!") // 복잡한 식도 가능하다
    }​
    문자열 템플릿 안에서 변수 이름만 사용하는 경우라도 ${name}처럼 중괄호로 변수명을 감싸는 습관을 들이면 좋습니다.

2.2 클래스와 프로퍼티

  • Java와 달리 Kotlin의 기본 접근자는 public 입니다.
    /*
    * JAVA Class
    */
    public class Person {
    	private final String name;
        
        public Persion(String name) {
        	this.name = name;
        }
        
        public String getName() {
        	return name;
        }
    }
    
    // Java -> Kotlin으로 변환
    
    /*
    * Kotlin Class
    */
    class Person(val name: String)​


  • Java에서는 필드와 접근자를 묶어 프로퍼티라고 부르며 Kotlin 프로퍼티는 자바의 필드와 접근자 메소드를 완전히 대신합니다. 클래스에서 프로퍼티를 선언할때는 변수선언과 마찬가지로 val(읽기전용), var(변경가능)으로 선언합니다.
    class Person {
    	val name: String  // 읽기전용, 자동으로 private 필드, public getter를 만든다.
        var isMarried: Boolean // 변경가능, 자동으로 private 필드, public getter, setter를 만든다.
    }
  • val person = Person("Jubin",false) // 코틀린은 new키워드를 생성하지 않고 생성자를 호출한다.
    println(person.name) // 프로퍼티를 직접 사용해도 코틀린이 자동으로 getter를 호출한다.
    println(person.isMarried)
    
    // java
    person.setMarried(true);
    
    // kotlin
    persion.isMarried = true
  • getter/setter(접근자)를 custom하여 사용할 수 있습니다.
    /*
    * 커스텀 접근자
    */
    class Rectangle(val height: Int, val width: Int) {
    	val isSquare: Boolean
        
        // custom getter
        get() {
        	return height == width
        }
    }
    
    
    fun main(args: Array<String>) {
    	val rectangle = Rectangle(41,43)
        println(rectangle.isSquare) // false
    }​
  • Java와 달리 Kotlin은 패키지 구조와 디렉터리 계층 구조를 일치 안시켜도 됩니다.
    하지만 자바와 같이 패키지별로 디렉터리를 구성하는게 좋습니다.
    Java와 Kotlin을 같이 사용하는 프로젝트에서는 Java방식을 따라야 마이그레이션할떄 문제가 생기지 않습니다.

2.3 선택 표현과 처리 : enum과 when

  • 기본적인 프로퍼티와 메소드가 있는 enum 클래스
    자바에서는 enum을 사용하지만 코틀린에서는 enum class를 사용합니다.
    enum 클래스 안에 메소드를 정의하는 경우 enum 상수목록과 메소드 정의 사이에 세미콜론을 넣어야 합니다.
    /*
    * 기본적인 프로퍼티와 메소드가 있는 enum 클래스
    */
    enum class Color (
    	val r: Int, val g: Int, val b: Int
    ) {
    	RED(255,0,0), BLUE(0,0,255);
        
        fun rgb() = (r * 256 + g) * 256 + b
    }
    
    println(Color.BLUE.rgb()) // 255​
  • when을 사용해 올바른 enum값 찾기
    Kotlin의 when은 Java의 switch문과 같지만 더 강력 기능을 제공합니다.
    if와 마찬가지로 enum도 값을 만들어내는 식입니다. 따라서 식이 본문인 함수에 when을 바로 사용할 수 있습니다.
    /*
    * when을 사용해 올바른 enum값 찾기
    */
    fun getMnemonic (color: Color) =  // 함수 반환값으로 when식을 직접 사용
    	when (color) {
        	Color.RED -> "RED"
            Color.BLUE -> "BLUE"
        }
        
        println(getMnemonic(Color.BLUE)) // BLUE
     
     
    /*
    * when분기 안에 여러 값 사용하기
    */
    fun getMnemonic (color: Color) =  // 함수 반환값으로 when식을 직접 사용
    	when (color) {
        	Color.RED, Color.ORANGE -> "warm"
            Color.BLUE, Color.VIOLET -> "cold"
        }
        
        println(getMnemonic(Color.BLUE)) // cold
        
        
    /*
    * enum 상수값 import해서 enum클래스 수식자 없이 사용하기
    */
    
    import com.colors.Color.*
    
    fun getMnemonic (color: Color) =  // 함수 반환값으로 when식을 직접 사용
    	when (color) {
        	RED, ORANGE -> "warm"
            BLUE, VIOLET -> "cold"
        }
        
        println(getMnemonic(Color.BLUE)) // cold


  • 스마트 캐스트 : 어떤 변수가 원하는 타입인지 알아보기 위해 is로 검사를 하고 나면 굳이 변수를 원하는 타입으로 캐스팅 하는 코드를 작성하지 않아도 마치 처음부터 그 변수가 원하는 타입으로 선언된 것처럼 사용할 수 있습니다.
    프로그래머 대신 컴파일러가 캐스팅을 수행해 줍니다.
    스마트캐스트를 사용한다면 그 프로퍼티는 반드시 val 이여야 하며, 커스텀 접근자를 사용해서는 안됩니다.
    코틀린에서는 is를 사용해 변수 타입을 검사합니다.(Java에서 instanceof)
    interface Expr
    class Num(val value: Int) : Expr // 코틀린에서는 콜론 뒤에 인터페이스 이름을 붙인다(impliments)
    class Sum(val left: Expr, val right: Expr) : Expr
    
    fun eval(e: Expr): Int {
    	if (e is Num) {
        	val n = e as Num // 코틀린에서 캐스팅 변환해주는 코드이지만 스마트캐스팅으로 인해 불필요
            return n.value
        }
        
        if (e is Sum) {
        	return eval(e.right) + eval(e.left) // 변수 e에 대해 스마트캐스트를 사용한다.
        }
    }
    
    println(eval(Sum(Sum(Num(1),Num(2)), Num(4))) // 7​

 


2021.09.05 - [Kotlin] - [Kotlin] Kotlin in Action, 코틀린 시작하기

 

[Kotlin] Kotlin in Action, 코틀린 시작하기

학부시절 부터 JAVA를 주 언어로 사용해 오다가 새로 이직하는 직장의 서비스의 주 언어가 Kotlin이라 Java에서 Kotlin으로 전환하게 되는 좋은 기회를 얻었습니다. JAVA개발자들을 위한 Kotlin 입문 서

jubin-developer.tistory.com

 

반응형

'Kotlin' 카테고리의 다른 글

[Kotlin] Kotlin in Action, 코틀린 시작하기  (0) 2021.09.05