본문 바로가기
kotlin

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

by 권성호 2023. 1. 14.

2장에서 다루는 내용

  • 함수, 변수, 클래스, enum, 프로퍼티를 선언하는 방법
  • 제어 구조
  • 스마트 캐스트: 타입 검사와 타입 캐스트, 타입 강제 변환을 하나로 엮은 기능!
  • 예외 던지기와 예외 잡기

2.1 기본 요소: 함수와 변수

함수 작성 문법

식(expression) vs 문(statement) 

  • expression
    • 값을 만들어 낸다
    • 다른 식의 하위 요소로 계산에 참여할 수 있다
    • ex> 3항 연산자
  • statement
    • 가장 안쪽 블록의 최상위 요소로 존재
    • 아무 값을 만들어내지 않는다.
    • ex> java의 while 문
  • 제어 구조와의 관계
    • java -> 모든 제어 구조가 문으로 구성
    • kotlin -> 루프를 제외한 대부분의 제어 구조가 식으로 구성
      • 제어 구조를 표현하는 방식이 다양할수록 다양한 코드 패턴을 간결하게 표현할 수 있는 유연성이 생김

변수 작성 문법

val answer: Int = 42
  • 특징 1 -> 자바와 달리 타입이 변수 이름 뒤에 선언된다.
  • 특징 2 -> 선언과 동시에 초기화 하는 경우 타입 추론이 동작하여 변수 타입 생략이 가능하다
    • 변수 선언만 할 경우 반드시 타입을 명시해야 함
    • 명시적으로 타입을 써주는것 vs 간결함을 위해 타입을 생략하는것: 어느게 더 올바른 코딩 컨벤션일지?
  • 특징 3 -> 변수 이름 : 타입 말고도 val, var 이라는 키워드가 있다(뒤에서 다룸)

val과 var

  • val
    • 값을 뜻하는 value에서 따옴
    • 변경 불가능한 참조를 저장하는 변수
    • 자바로 말하면 final 변수(constant 개념은 아님, 참조를 바꿀 수 없다는 의미이다!!!)
  • var
    • 변수를 뜻하는 variable 에서 따옴
    • 변경 가능한 참조
      • 변수의 타입은 한번 선언되면 바꿀 수 없음에 주의
    • 자바의 일반 변수와 같음
  • 불변 변수와 함수형 프로그램
    • 가능하면 모든 변수를 val 키워드를 사용해 불변 변수로 선언하고 나중에 꼭 필요하면 var로 변경할 것(코틀린 철학???)
    • 변경 불가한 참조와 변경 불가한 객체를 부수 효과가 없는 함수와 조합해 사용하면 코드가 함수형 스타일에 가까워진다.

코틀린은 문자열 템플릿 기능을 지원

  • ex> println("Hello $name!")
  • 자바 문자열 접합보다 간결하게 사용할 수 있도록 하기 위한 언어 차원의 지원
  • "Hello, ${args [0]}" 같은 복잡한 식도 중괄호로 둘러싸서 문자열 템플릿 안에 넣을 수 있다.
  • 되도록 중괄호를 사용하는 것을 습관화하자
    • namehello이런식으로 하면 namehello를 인식해 버림−>{name} hello로 써야 name을 변수 명으로 인식

2.2 클래스와 프로퍼티

프로퍼티 -> 말 그대로 클래스의 특성이라고 이해해야 한다.

  • 클래스는 상태와 행동을 갖는데, 이중 상태에 해당함
  • 필드와 접근자를 한데 묶은 개념
  • val(value)
    • 읽기 전용 프로퍼티를 선언
    • java로 치면, private 필드와 getter를 만들어 준다.
    • object.getter 방식이 아니라 object.field 방식을 통해 값을 getting 할 수 있다.
    • object 밖 말고 안쪽에서도 val의 참조는 변경 불가하다
      • 즉, 일반 val 은 final이고 클래스 프로퍼티의 val 은 final + private field + public getter로 이해하기
  • var(variable)
    • 변경 가능한 프로퍼티를 선언
    • java로 치면, private 필드와 getter & setter를 만들어 준다.
    • object.getter 방식이 아니라 object.field 방식을 통해 값을 getting & setting 할 수 있다.
  • 프로퍼티는 꼭 필드를 가져야 할까?
    • 대부분의 프로퍼티에는 그 프로퍼티의 값을 저장하기 위한 필드가 있다.
      • 이를 프로퍼티를 뒷받침하는 필드 라 한다.
    • 하지만 원한다면 프로퍼티 값을 그때그때 계산할 수도 있다.
      • 커스텀 게터를 작성하면 그런 프로퍼티를 만들 수 있다.
      • 아마 프로퍼티에 값을 setting 하고 싶을 경우 필드가 뒷받침되는 게 자연스러울 듯

커스텀 접근자

class Rectangle(val height: Int, val width: Int) {
	val isSquare: Boolean 
    	get() {	// <- 프로퍼티 게터 선언
        	return height == width
        }
}
  • 이러한 방식을 통해 필드 없이도 값을 getting 할 수 있는 프로퍼티를 만들 수 있음
  • 파라미터가 없는 함수를 정의하는 것 vs 커스텀 케터를 정의하는 것
    • 구현상으론 완전히 동일
    • 내가 작성하는 메소드가 클래스 관점에서 프로퍼티의 성격이 강한지, 메소드의 성격이 강한지에 따라 선택하면 의도가 보다 명확해 질 수 있을것으로 보임

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

enum 클래스 정의

  • 코틀린에서 enum 은 소프트 키워드
    • enum 은 class 앞에 있을 경우 특별한 의미를 지니지만 다른 곳에서는 이름에 사용할 수 있다.(즉, val enum=3 같은 코드가 가능하다)
  • 자바와 마찬가지로 enum 은 단순 값만 열거하는 존재가 아님
    • 프로퍼티나 메서드 정의 가능
      • 참고: 이 예제에서는 코틀린에서 유일하게 세미콜론(;)이 필수인 부분을 볼 수 있다.
      • enum 클래스 안에 메서드를 정의하는 경우 반드시 enum 상수 목록과 메소드 정의 사이에 세미콜론을 넣어야 함

when 으로 enum 클래스 다루기(feat. java 의 switch)

  • when 은 식임 -> 메소드에 코드 블락({}) 없이 = 으로 사용 가능

when 과 임의의 객체를 함께 사용

  • when 의 분기 조건은 임의의 객체를 허용(java 의 switch 는 분기 조건에 상수만을 사용할 수 있음) -> 코드의 간결성 up

인자가 없는 when 사용

  • when 에 아무 인자도 없으려면 각 분기의 조건이 불리언 결과를 계산하는 식 이어야 한다.
    • 임의 객체를 함께 사용할 때 발생하는 불필요한 객체 생성을 방지할 수 있다.
    • 코드의 가독성과 성능의 trade off 에서 선택의 여지가 있는 부분이다.

(tip) 스마트 케스트 사용하기(feat. kotlin [is] & [immutable])

  • 자바에서
    • 타입 검사를 위해 instanceof 메소드를 사용한다.
    • 타입 검사 후에 명시적으로 한번 더 타입 캐스팅을 해 줘야 하는 불편함이 있다.
  • 코틀린에서
    • 타입 검사를 위해 is를 사용한다.
    • 일단 is 검사가 성공하고 나면 해당 코드 블락에선 is로 검사한 타입으로 컴파일러에 의해 자동 타입 캐스팅이 되는데, 이걸 스마트 캐스트라고 한다.
    • ex> 
    • 스마트 캐스트는 is 로 변수에 든 값의 타입을 검사한 후 그 값이 바뀔 수 없는 경우에만 작동함!
      • ex1> 클래스의 프로퍼티에 대해 스마트 캐스트를 사용하려면 그 프로퍼티는 반드시 val 이어야 함 + 커스텀 접근자도 스마트 캐스팅이 불가
      • 즉, 스마트 캐스트가 발생하는 시점에 값들을 확정할 수 있어야 함

(tip) 블록의 마지막 식이 블록의 결과라는 규칙은 블록이 값을 만들어내야 하는 경우 항상 성립

  • 이 규칙이 유일하게 함수에서는 성립 안 함
    • 함수에선 리턴문이 산발적으로 나타날 수 있기 때문에 명시적으로 return 키워트를 사용해야 함

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

  • while 루프
    • 자바와 거의 동일
  • for 루프
    • for-each 루프만 존재

생각해볼점

참고

http://www.yes24.com/Product/Goods/55148593

 

Kotlin in Action - YES24

코틀린이 안드로이드 공식 언어가 되면서 관심이 커졌다. 이 책은 코틀린 언어를 개발한 젯브레인의 코틀린 컴파일러 개발자들이 직접 쓴 일종의 공식 서적이라 할 수 있다. 코틀린 언어의 가장

www.yes24.com

 

댓글