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 루프만 존재
생각해볼점
- 변수 선언 시, 명시적으로 타입을 써주는것 vs 간결함을 위해 타입을 생략하는것: 어느게 더 올바른 코딩 컨벤션일지?
- 불변성을 지향하는 코틀린 vs 생명주기동안 가변적인 jpa entitiy: kotlin 에서 jpa entity 를 작성하는 방법
- 파라미터가 없는 함수를 정의하는 것 vs 커스텀 케터를 정의하는 것
- 내부에선 변경가능하고 외부에선 접근만 가능한 프로퍼티를 작성하는 방법:코틀린의 장점인 간결성을 해치지않고 작성할 수 있을까?
참고
http://www.yes24.com/Product/Goods/55148593
'kotlin' 카테고리의 다른 글
[Kotlin in Action] 5장: 람다로 프로그래밍 (0) | 2023.03.05 |
---|---|
[Kotlin in Action] 4장: 클래스, 객체, 인터페이스 (0) | 2023.02.11 |
[Kotlin in Action] 3장: 함수의 정의와 호출 (0) | 2023.02.08 |
[kotlin-tip] 코프링 환경에서 로깅하기 (0) | 2023.01.14 |
[kotlin-tip] kotlin 에서 jpa entity 작성하기 (0) | 2023.01.12 |
댓글