[코틀린 인 액션] CH2 코틀린 기초✍

0

코틀린 인 액션

목록 보기
1/13
post-thumbnail

[코틀린 인 액션] CH2 코틀린 기초

이 포스팅은 <<Kotlin in Action>>, 드미트리 제메로프 & 스베트라나 이사코바, 에이콘출판사(2017)을 읽고 개인 학습용으로 정리한 글입니다.

2.1 기본 요소: 함수와 변수

2.1.1 Hello, World

  • 함수 최상위 수준에 정의 가능
    -> 자바와 달리 꼭 클래스 안에 넣을 필요 X

  • 배열도 일반적인 클래스와 마찬가지
    -> 자바와 달리 배열 처리를 위한 문법 따로 존재하지 X

  • 코틀린 표준 라이브러리
    -> 여러가지 자바 표준 라이브러리 함수를 간결하게 사용할 수 있게 감싼 래퍼(Wrapper) 제공
    -> ex. System.put.println 대신 println 사용

2.1.2 함수

fun max(a : Int, b : Int) : Int{
	return if(a > b) a else b
}
  • 코틀린의 if 식은 자바 3항 연산자와 비슷함
    (a > b)? a : b

  • 식(statement): 값을 만들어 냄, 다른 식의 하위 요소로 계산에 참여 가능
    -> 코틀린에서 루프를 제외한 대부분의 제어구조는 식

  • 문(sentence): 값을 만들어내지 X
    -> 코틀린에서 대입문

식이 본문인 함수

  • 중괄호 제거, return 제거, 등호(=)추가
fun max(a : Int, b : Int) : Int = if(a > b) a else b
fun max(a : Int, b : Int) = if(a > b) a else b
  • 식이 본문인 함수반환 타입 생략 가능
    -> 컴파일러가 타입 추론(type inference)

  • 블록이 본문인 함수반환 타입 생략 불가능 & 반드시 return문 있어야

2.1.3 변수

변경 가능한 변수와 불가능한 변수

  • val: 변경 불가능한 참조(immutable), 초기화하고 나면 재대입 불가능
    -> 자바의 final 변수

  • var: 변경 가능한 참조(mutable)

  • 기본적으로 모든 변수 val로 선언 -> 나중에 필요할 때만 var로 변경

  • val 참조 자체는 불변이어도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있음

val languages = arrayListOf("Java")
languages.add("Kotlin")

2.1.4 더 쉽게 문자열 형식 지정: 문자열 템플릿

  • 문자열 템플릿: 자바의 문자열 접합연산과 동일한 기능

  • 컴파일러는 각 식을 컴파일 시점에 검사
    -> 존재하지 않는 문자열을 템플릿 안에 넣으면 컴파일 오류

  • 문자열 템플릿 안에서 변수 이름만 사용하는 경우라도 중괄호로 감싸는 것이 좋다

fun main(args:Array<String>) {
    var name = "sunjoo"
    println("Hello, ${if(name.isNotBlank()) name else "someone!"}")//Hello, sunjoo
    name = ""
    println("Hello, ${if(name.isNotBlank()) name else "someone!"}")//Hello, someone!
}

2.2 클래스와 프로퍼티

  • 간단한 자바 클래스 Person
public class Person{
    private final String name;
    
    public Person(String name){
        this.name = name;
    }
    
    public String getName(){
        return name;
    }
}
  • 코틀린으로 변환한 Person 클래스
class Person(val name : String)
  • 코드 없이 데이터만 저장하는 클래스: 값 객체(value object)

2.2.1 프로퍼티

  • 자바에서는 데이터를 필드(field)에 저장, 멤버 필드의 가시성은 보통 private
    -> 클라이언트에게 접근자 메서드(accessor method) 제공 (getter, setter)

  • 자바는 필드와 접근자를 한데 묶어 프로퍼티(property)라 부름

  • 코틀린 프로퍼티는 자바의 필드와 접근자를 완전히 대신함
class Person(val name : String, var isMarried : Boolean)
  • 읽기 전용 프로퍼티
    -> 비공개 필드, 공개 게터 생성됨

  • 변경할 수 있는 프로퍼티
    -> 비공개 필드, 공개 게터, 공개 세터 생성됨

  • 코틀린에서 Person 클래스 사용하기
    -> 게터/세터 호출 대신 프로퍼티 직접 사용

class Person(val name: String, var isMarried:Boolean)

fun main(args:Array<String>) {
    val person = Person("Bob", true) //new 키워드 사용하지 않고 생성자 호출
    
    println(person.name)//Bob
    println(person.isMarried)//true
    person.isMarried = false
    println(person.isMarried)//false
}
  • 대부분의 프로퍼티에는 그 프로퍼티의 값을 저장하기 위한 필드 존재
    -> 뒷받침하는 필드(backing field)

2.2.2 커스텀 접근자

class Rectangle(val height:Int, val width: Int){
    val isSquare: Boolean
    	get(){
            return height == width
        }
}

fun main(args:Array<String>) {
    val rec1 = Rectangle(4, 5)
    println(rec1.isSquare)//false
    val rec2 = Rectangle(3, 3)
    println(rec2.isSquare)//true
}
  • isSquare 프로퍼티
    -> 자체 값을 저장하는 backing field X
    -> 자체 구현을 제공하는 게터만 존재
    -> 클라이언트가 프로퍼티에 접근할 때마다 게터가 프로퍼티 값 매번 다시 계산

2.2.3 코틀린 소스코드 구조: 디렉터리와 패키지

  • 같은 패키지에 속해있다면 다른 파일에서 정의한 선언이어도 직접 사용 가능

  • 다른 패키지에 속해있다면 다른 파일에서 정의한 선언 임포트를 통해 불러와야

  • 코틀린에서는 클래스 임포트와 함수 임포트에 차이 X
    -> 최상위 함수는 그 이름으로 임포트 가능

  • 패키지 이름 뒤에 *를 추가하면 패키지 안의 모든 선언 임포트
    (최상위에 정의된 함수, 프로퍼티 포함)

✍...

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

2.3.1 enum 클래스 정의

2.3.2 when으로 enum 클래스 다루기

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

2.3.4 인자 없는 when 사용

2.3.5 스마트 캐스트: 타입 검사와 타입 캐스트를 조합

2.3.6 리팩토링: if를 when으로 변경

2.3.7 if과 when의 분기에서 블록 사용

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

2.4.1 while 루프

2.4.2 수에 대한 이터레이션: 범위와 수열

2.4.3 맵에 대한 이터레이션

2.4.4 in으로 컬렉션이나 범위의 원소 검사

2.5 코틀린의 예외 처리

2.5.1 try, catch, finally

2.5.2 try를 식으로 사용

2.6 요약

profile
Be able to be vulnerable, in search of truth

0개의 댓글