Kotlin

Kotlin in Action - 2. 코틀린 기초

yswn1531 2024. 5. 15. 20:00

1. 함수와 변수

  1. Hello World
    1. fun 키워드, 파라미터 이름, 파라미터 타입 순으로 적는다.
    2. 자바와 달리 클래스 안에 함수가 있는 것이 아닌, 함수를 최상위 수준에 정의 할 수 있다.
    3. 배열도 일반적인 클래스와 마찬가지이다.
    4. 감싼 Wrapper 클래스를 제공해 여러가지 자바 표준 라이브러리를 간결하게 사용할 수 있다.
    5. 세미 콜론을 붙이지 않아도 된다.
  2. 함수
    1. 함수 이름, 파라미터 목록 : 반환 타입 { 함수 본문 }
    2. 문과 식
      • 식(expression) : 값을 만들어 내며 다른 식의 하위 요소로 계산 참여 가능
      • 문(statement) : 자신을 둘러싸고 있는 가장 안쪽 블록의 최상위 요소
      • 자바와 달리 대입식과 비교식을 잘못 바꿔 써서 버그가 생기는 경우가 없다.
        • 자바: = 대입  / == 비교 -> 대입, 비교 둘 다 boolean을 반환
        • 코틀린 : = 대입 / === 비교 -> 대입 Unit , 비교 boolean 반환
    3. 반환 타입을 생략할 수 있는 이유
      1. 식이 본문인 함수의 경우 컴파일러가 결과를 함수 반환 타입으로 정해준다 -> 타입 추론
  3. 변수
    • 변수의 타입도 컴파일러가 식을 분석해서 초기화 식의 타입을 변수 타입으로 지정
    • 초기화 식을 사용하지 않으려면 타입을 적어야 한다.
    • val : 변경 불가능한 변수 , 자바에서는 final
    • var: 변경 가능한 변수
    • 기본적으로 변경 불가능한 변수로 선언하고 꼭 필요한 경우에만 var로 변경
      • 변경 불가능한 참조와 변경 불가능한 객체를 부수 효과가 없는 함수와 조합해서 사용하면 코드가 함수형 코드에 가까워진다.
    • val은 참조 자체가 불변일지라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다.
    • var 키워드는 변수의 타입은 바뀌지 않는다.
  4. 문자열 템플릿
    1. 문자열에서 '$'을 사용해 변수를 사용한다. 
    2. 컴파일된 코드는 StringBuilder 사용하여 append 연산

2. 클래스와 프로퍼티

  1. property
    1. 클래스의 목적은 데이터를 캡슐화 하고 캡슐화한 데이터를 다루는 코드를 한 주체 아래 두는 것
    2. 자바에서는 필드와 접근자를 한데 묶어 property라고 한다.
    3. 코틀린에서는 자동으로 값을 저장하기 위한 비공개 필드 +  getter를 만들어 준다.(var의 경우 setter 까지)
  2. 커스텀 접근자 
  3. class Rectangle(val height: Int, val width:Int){ val isSquare : Boolean get() { return height == width } }
  4. 디렉토리와 패키지
    1. 코틀린은 자바와 달리 여러 클래스를 한 파일에 넣을 수 있다
    2. 패키지 구조와 디렉토리 구조가 맞아 떨어질 필요가 없다.
    3. 하지만 자바와 같이 패키지별로 디렉터리를 구성하는 편이 마이그레이션 할 때 좋다.

3. 선택 표현과 처리: enum과 when

  1. enum 클래스 정의
    • enum은 soft keyword라 class 앞에서는 특별한 의미를 지니지만 그 외에서는 이름에 사용가능하다.
    • enum에서도 생성자와 property를 선언한다.
  2. when으로 enum 다루기
    • 자바의 switch문에 해당하는 것이 when
    • when도 값을 만들어 내는 식
  3. when.과 임의의 객체를 함께 사용
    • when은 자바의 switch와 달리 조건에서 임의의 객체를 함께 사용할 수 있어 강력하다.
    • 객체 사이를 매치할 때 동등성을 사용한다.
    • when의 대상을 변수에 포획할 수 있다.
  4. 인자 없는 when 사용
    • 인자가 없는 when식 사용시 조건이 불필요한 객체를 생성하는 경우를 막을 수 있다.
  5. 스마트 캐스트: 타입 검사와 타입 캐스트를 조합
    • is 를 사용해 변수 타입을 검사한다. 자바에서 instanceOf와 비슷
    • 코틀린에서는 is로 검사 후 원하는 타입으로 컴파일러가 캐스팅해준다. (스마트 캐스트)
    • 원하는 타입으로 명시적 캐스팅 하려면 as 사용
  6. if를 when으로 변경
    • 언제 if와 when을 사용해야 할까
  7. if와 when의 분기에서 블록 사용
    • '블록의 마지막 식이 결과' 라는 규칙은 블록이 값을 만들어내야 하는 경우 항상 성립

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

  1. while 루프
    1. while, do-while
  2. 수에 대한 이터레이션 : 범위와 수열
    1. 자바에 for 루프가 없다. 대신 범위를 사용 ex) 1..100
    2. 수열 : 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 것 
    3. downTo를 통해 역방향 , step을 통해 증가의 절댓값 단계 설정
  3. 맵에 대한 이터레이션
    1. ,, 연산자를 숫자 타입의 값 뿐아니라 문자 타입의 값도 가능
    2. withIndex()를 통해 인덱스와 함께 컬렉션을 이터레이션 가능
  4. in으로 컬렉션이나 범위의 원소 검사
    1. in 연산자를 사용해 어떤 값이 범위에 속해있는지 검사할 수 있다.
    2. 반대의 경우 !in
    3. Comparable 인터페이스를 구현한 클래스라면 범위를 만들어 낼 수 있다.
    4. 컬렉션에도 in 연산자 사용 가능

5. 코틀린의 예외 처리

throw 는 식이다.

val percentage = 
    if (number in 1..100) 
        number 
    else
        throw IllegalArgumentException("A percentage value must be between 0 and 100: $number")
  1. try, catch, finally
    1. 자바와의 차이는 throw에 뒤에 s가 없다.
    2. 함수를 작성할 때 함수 선언 뒤에 체크 예외를 명시적으로 할 필요가 없다.
    3. 체크 예외와 언체크 예외를 구별하지 않는다.
      1. 체크 예외 : 외부 환경에 의해 발생하는 예외 / 파일 입출력 오류, 네트워크 연결 문제, 데이터베이스 접근 오류 등등
      2. 언체크 예외 : 프로그래밍 오류나 잘못된 입력값 등으로 인해 발생하는 예외 / NPE, IllegalArgumentException 등등
    4. try-with-resource를 use를 통해 같은 기능을 구현
  2. try를 식으로 사용
    1. if, when과 마찬가지로 식이다. 그래서 값을 변수에 대입할 수 있다.