본문 바로가기

reviews/Kotlin in Action

2. 코틀린 기초

  • 줄 끝에 세미콜론을 부팅지 않아도 됨
    • 예외 : enum 클래스 안에 메소드를 정의하는 경우 반드시 enum 상수 목록과 메소드 정의 사이에 세미콜론을 넣어야 함

2.1 기본 요소: 함수와 변수

변수

  • 초기화 할 경우 타입 생략 가능
  • 초기화 식을 사용하지 않고 변수를 선언할 경우 변수 타입을 반드시 명시해야 함

val

변경 불가능한 참조를 저장함

  • 블록을 실행할 때 정확히 한 번만 초기화 되어야 함
  • 어떤 블록이 실행될 때 오직 한 초기화 문장만 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 다른 여러 값으로 초기화 할 수 있음
  • val message: String if (canPerformOperation()) { message = "Success" } else { message = "Failed" }
  • val 참조 자체는 불변일지라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있음
  • val languages = arrayList("Java") languages.add("Kotlin")

var

변경 가능한 참조

  • 변수의 값을 변경할 수 있지만 변수의 타입은 고정돼 바꿀 수 없음
    • 바꿀 경우 "Error: type mismatch" 컴파일 오류 발생

함수

  • 함수를 최상위 수준에 정의할 수 있음
  • 블록이 본문인 함수 : 본문이 중괄호로 둘러싸인 함수
    • 값을 반환한다면 반드시 반환 타입을 지정하고 return문을 반드시 사용해 반환값을 명시해야 함
    • (if 나 while에서 블록에서 마지막 라인에 return을 명시하지 않아도 블록 전체의 결과가 되는 것과 차이가 있음)
  • 식이 본문인 함수 : 등호와 식으로 이루어진 함수
    • 반환 타입을 생략 할 수 있음
    • 타입 추론 : 굳이 사용자가 반환 타입을 적지 않아도 컴파일러가 함수 본문 식을 분석해서 식의 결과 타입을 함수 변환 타입으로 정해줌

2.2 클래스와 프로퍼티

JavaBean 클래스 Person와 프로퍼티 name

/** Java */
public class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

/** Kotlin */
class Person(val name: String)

변경 가능한 프로퍼티

자바에서는 필드와 접근자를 한데 묶어 프로퍼티라고 부름

/** Kotlin */
class Person(
    val name: String, // 읽기 전용 프로퍼티로 비공개 필드, 공개 getter가 만들어짐
    var isMarried: Boolean // 비공개 필드, 공개 getter, 공개 setter가 만들어짐
}

사용하기

/** Java */
Person person = new Person("Bob", true);
person.getName();
person.isMarried();
person.setMarried(false);

/** Kotlin */
val person = Person("Bob", true)
person.name
person.isMarried
person.isMarried = false

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

when

  • Java의 switch와 비슷
  • when의 분기조건에 임의의 객체를 허용함
    • Java의 switch는 분기 조건에 상수(enum 상수나 숫자 리터럴)만을 사용할 수 있음

스마트 캐스트

is로 어떤 변수가 원하는 타입인지 일단 검사하고 나면 실제로는 컴파일러가 캐스팅을 수행해주기 때문에 굳이 변수를 원하는 타입으로 캐스팅하지 않아도 마치 처음부터 그 변수가 원하는 타입으로 선언된 것 처럼 쓸 수 있음

if (e is Sum) {
    return eval(e.right) + eval(e.left)
}

e가 Sum 객체일 경우 명시적 캐스팅 없이 Sum의 right, left를 사용할 수 있음

명시적 타입 캐스팅

val n = e as Num

2.4 대상을 이터레이션

for

for <아이템> in <원소들>

범위 range

두 값으로 이루어진 구간

보통 그 두 값은 정수 등의 숫자 타입의 값이며, .. 연산자로 시작 값과 끝 값을 연결해서 범위를 만들음

  • 수열 progression
  • 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 경우
  • A .. B : A부터 B까지 양 끝을 포함하는 구간
  • A until B : A부터 B-1까지 포함함 A .. B-1
  • A downTo B : A부터 역방향 수열을 만듦
  • step C : 증가값 C의 수열에 대해 이터레이션 함
for (i in 100 downTo 1 step 2) {
}

100 부터 1까지 2 씩 내려감 => 100, 98, 96, ... 2

2.5 코틀린의 예외 처리

if (percentage !in 0..100) {
    throw IllegalArgumentException(
         "A percentage value must be between 0 and 100: ${percentage}")
}
  • new를 붙일 필요가 없음
  • 자바와 달리 코틀린의 throw는 식이므로 다른 식에 포함될 수 있음
  • val percentage = if (number in 0..100) number else throw IllegalArgumentException( "A percentage value must be between 0 and 100: ${percentage}")

try, catch, finally

  • 코틀린에서는 함수가 던지는 예외를 지정하지 않고 발생한 예외를 잡아내도 되고 안잡아내도 됨
    • 어떤 함수가 던질 가능성이 있거나 발생할 가능성이 있는 예외를 catch에서 처리해야 하며, 처리하지 않은 예외는 throws절에 명시해야함 (함수 선언 뒤에 throws IOException)
  • 자바에서는 체크 예외를 명시적으로 처리해야 함
  • try를 식으로 사용
  • try의 분문을 반드시 중괄호로 둘러싸야 함
  • try 블록 내부에 여러 문장이 있으면 마지막 식의 값이 전체 결과 값임
반응형

'reviews > Kotlin in Action' 카테고리의 다른 글

1. 코틀린이란 무엇이며, 왜 필요한가?  (0) 2022.01.07