일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 커스텀상태
- kotlin강좌
- 병렬프로그래밍
- 알고리즘
- Kotlin
- 코루틴
- 알게되는
- 안드로이드스튜디오
- Compose
- 안드로이드강좌
- mockito
- 자바
- android
- Rxjava
- Coroutine
- k8s
- 스레드
- 책
- theming
- 테스트
- 글또
- Gradle
- viewmodel
- 회고
- 디자인패턴
- ReactiveProgramming
- 코틀린
- 안드로이드
- g 단위테스트
- 병럴프로그래밍
- Today
- Total
선생님, 개발을 잘하고 싶어요.
Kotlin in Action - 1부 2장 - 코틀린 기초 본문
다룰 것
- 변수, 함수, 클래스, 프로퍼티
- 제어 구조
- 스마트 캐스트
- 예외 처리
함수와 변수
- 문(statement)과 식(expression)
- 문은 아무런 값을 만들어내지 않는다.
- 반면 식은 값을 만들어 내고, 다른 식의 하위 식으로 활용해서 계산에 활용할 수 있다.
- 코틀린의 if는 식이다. 다음과 같은 연산을 할 수 있다는 것
- fun max(a: Int, b: Int): Int = if (a > b) a else b
- 함수의 형태
- 블록이 본문인 함수 block body
- 등호와 식으로 이뤄진 함수 expression body
- 코틀린에선 키워드로 변수 선언을 시작한다.
- val, var 키워드는 변수 선언할 거라는 의미다.
- val → 변경 불가능한 참조를 저장하는 변수를 선언한다. 자바의 final에 해당한다. (value)
- var → 변경 가능한 참조로 자바의 일반 변수에 해당한다. (variable)
- val 변수는 블록을 실행할 때 정확히 한 번만 초기화돼야 한다.
- val, var 키워드는 변수 선언할 거라는 의미다.
쉽게 문자열 형식 지정 문자열 템플릿
- 변수를 문자열 안에서 사용할 수 있는 기능
val name = "greedy"
println("hello $name") // hello greedy
- 내부적으로는 StringBuilder를 사용해서 문자열 접합한다.
클래스와 프로퍼티
코틀린을 활용하면 자바보다 적은 코드로 클래스와 관련 있는 대부분의 작업을 수행할 수 있다.
클래스 목적은 데이터를 캡슐화하고 캡슐화한 데이터를 다루는 코드를 한 주체 아래 가두는 것이다. 자바에서 데이터는 필드에 저장하고 보통 private 가시성으로 제약을 둔다. 필요에 따라서 필드에 접근할 수 있는 접근자 (getter, setter)를 제공하곤한다.
이러한 필드와 접근자를 한데 묶어서 프로퍼티(property)라고 부른다.
코틀린에서는 val, var 키워드를 사용해서 프로퍼티를 간단히 정의할 수 있다.
코틀린이 자체적으로 값을 저장하기 위한 비공개 필드와 세터 게터로 이뤄진 기본 접근자 구현을 제공한다. 따라서 프로퍼티를 제공하기 위해 드는 보일러플레이트 코드를 상당수 제거할 수 있다.
대부분의 프로퍼티는 값을 저장하기 위한 내부적 필드가 있고 이를 backing field라고 부른다.
디렉터리와 패키지
다른 패키지에 정의된 선언을 사용하기 위해서는 import해야 한다.
스타임포트를 사용하면 패키지 안에 있는 모든 클래스, 최상위에 정의된 함수나 프로퍼티까지 모두 불러온다. → (?)
자바는 디렉터리 구조와 패키지 구조가 같아야한다. 각 클래스는 각 패키지에 맞게 파일 하나로 구분되어야한다.
반면 코틀린은 여러 클래스를 한 파일에 넣을 수 있고, 파일 이름도 마음대로 지정할 수 있다.
하지만 자바와 운용성을 생각할 때 그냥 자바 컨벤션을 따르는 편이 낫다. 하지만 동시에 클래스 정의하는 소스가 엄청 작은 경우에는 하나의 파일에 정의하는 걸 망설일 필요는 없다.
enum class
enum은 소프트 키워드로 변수명 등으로 사용될 수 있다. enum class로 함께 쓰여야 키워드 인식된다.
반면 class는 키워드로 변수명 등으로 class를 사용할 수 없기에 clazz와 같은 이름을 사용한다.
enum도 일반적 클래스와 마찬가지로 생성자와 프로퍼티를 선언한다.
when
when 식은 인자 값과 매치하는 조건 값을 찾을 때까지 각 분기를 검사한다.
when은 switch와 다르게 임의의 객체를 when 식의 인자로 활용할 수 있다.
코틀린에서 when은 if와 마찬가지로 식이다.
인자 없는 when 활용도 가능하다.
불필요한 인스턴스 생성은 불필요한 가비지 객체가 늘어나게 만든다. 고로 성능에 악영향을 준다.
스마트 캐스트
타입 검사와 타입 캐스트를 조합하는 것이다.
타입 검사를 하면 컴파일러가 알아서 타입 변환까지 시켜준다.
타입 검사 이후에 참조의 값이 바뀔 수 있는 상황이라면 스마트캐스트는 동작하지 않는다.
코틀린에선 is 키워드를 활용해 타입 검사를 한다.
while
while은 다른 언어와 차이없다.
Range: 범위와 수열, 수에 대한 이터레이션
초깃값, 증가 값, 최종 값을 사용한 루프를 대신하기 위해서 사용한다.
시작 값, 끝 값을 모두 포함한다.
val oneToTen = 1..3 // 1,2,3
downTo를 사용하면 역방향 수열을 만든다.
step을 이용해서 증가 값의 절댓값을 지정한다.
for (i in 100 downTo 1 step 2) { // 100, 98 ... 2
}
반만 닫힌 범위를 만들기 위해서는 until을 활용한다.
// 다음 두 for는 같은 범위를 이터레이션 한다.
fun (i in 0 until size)
fun (i in 0..size-1)
맵에 대한 이터레이션 (구조 분해 문법)
for ((key, value) in userDic) {
//
}
범위나 컬렉션에 들어있는지 알고 싶을 때도 in을 사용한다.
// 다음 두 식은 같다.
c in 'a'..'z'
'a' <= c && c <= 'z'
비교 가능한 클래스라면 인스턴스를 사용해 범위를 만들 수 있다.
// 다음 두 식은 같다. (이런 식으로도 범위 연산자를 쓸 수 있다는 걸 처음 알았다.)
println("Kotlin" in "Java".."Scala")
println("Java" <= "Kotlin" && "Kotlin" <= "Scala")
예외 처리
try, catch, finally를 사용한다.
코틀린 try, catch는 식이다.
코틀린은 체크 예외 언체크 예외를 구분하지 않는다. 함수가 던지는 예외를 지정하지 않아도 되고, 발생한 예외를 반드시 잡아야하는 것도 아니라는 뜻이다.
'일상 > 책 리뷰' 카테고리의 다른 글
Kotlin in Action - 1부 4장 - 클래스, 객체, 인터페이스 (0) | 2022.05.21 |
---|---|
Kotlin in Action - 1부 3장 - 함수 정의와 호출 (0) | 2022.05.18 |
달러는 왜 비트코인을 싫어하는가? (6) - 자본주의 정보체계 (0) | 2022.05.16 |
Kotlin in Action - 1부 1장 - 코틀린이란 무엇이며, 왜 필요한가? (0) | 2022.05.16 |
달러는 왜 비트코인을 싫어하는가? (5) - 화폐와 시간선호 (0) | 2022.05.14 |