Chapter 2. 코틀린 기초

sua·2021년 7월 5일
0

Kotlin In Action

목록 보기
2/9
post-thumbnail

2.1 기본 요소: 함수와 변수

2.1.1 Hello, World!

  • 함수 선언 시 fun 키워드 사용
  • 파라미터 이름 뒤에 타입 기입
  • 최상위 수준에 함수 정의 가능 -> 클래스 밖에 위치시킬 수 있음
  • 배열 처리를 위한 문법 존재 x
  • 래퍼를 제공하여 표준 자바 라이브러리 함수를 간결하게 사용
  • 세미콜론 문장 끝에 붙이지 않아도 됨

2.1.2 함수

<함수 구조>

  • fun 키워드
  • 함수 이름
  • 파라미터 목록(파라미터 이름: 타입)
  • : 반환 타입
  • 함수 본문

식이 본문인 함수

: 등호와 식으로 이뤄진 함수

fun max(a: Int, b: Int) : Int = if(a > b) a else b // 반환 타입 생략 가능

블록이 본문인 함수 : 본문이 중괄호로 둘러싸인 함수

2.1.3 변수

변수 타입은 변수 이름 뒤에 선언

val answer: Int = 42

초기화 식을 사용하지 않고 변수를 선언하려면 변수 타입 반드시 명시(타입 추론 불가하기 때문에)

val answer: Int
answer = 42

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

  • val : 변경 불가능한 참조를 저장하는 변수
    -> 초기화 후 재대입 불가능
    • 참조가 가리키는 객체 내부 변경 가능
         val language = arrayListOf("Java")
         language.add("Kotlin")
  • var : 변경 가능한 참조 -> 값 변경 가능, 변수 타입은 바뀌지 않음

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

  • $변수이름 or ${변수이름}
  • ${복잡한 식} Ex) ${args[0]}
    • 중괄호로 둘러싼 식 안에서 큰 따옴표 사용 가능

2.2 클래스와 프로퍼티

2.2.1 프로퍼티 - 필드 + 접근자

class Person(
	val name: String, // 읽기 전용, 필드와 게터 만들어냄
    var isMarried: Boolean // 쓰기 가능 프로퍼티, 필드 게터 세터 만들어냄

2.2.2 커스텀 접근자

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

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

패키지 - 같은 패키지에 속해있다면 다른 파일에서 정의한 선언일지라도 직접 사용 가능 -> 다른 패키지에 정의한 선언을 사용하려면 임포트 통해 불러오기

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

2.3.1 enum 클래스 정의

enum class Color (
	val r: Int, val g: Int, val b: Int // 상수 프로퍼티 정의
) {
	RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0),
    	BLUE(0, 0, 255), INDIGO(75, 0, 130), VIOLET(238, 130, 238);
        
        fun rgb() = (r * 256 + g) * 256 + b
}

2.3.2 when으로 enum 클래스 다루기

fun getWarmth(color: Color) = when(color) {
	Color.RED, Color.ORANGE, Color.YELLOW -> "warm"
    Color.GREEN -> "neutral"
    Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold"
}

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

  • when 분기 조건에 임의의 객체, 식을 넣을 수 있음
    • 임의의 객체 사용 경우
      fun mix(c1: Color, c2: Color) = 
      	when(setOf(c1, c2)) {
       		setOf(RED, YELLOW) -> ORANGE
               	setOf(YELLOW, BLUE) -> GREEN
                   	SetOf(BLUE, VIOLET) -> INDIGO
                      else -> throw Exception("Dirty color")
              }
    • 식을 사용하는 경우
      fun mixOptimized(c1: Color, c2: Color) = when {
      	(c1 == RED && c2 == YELLOW) || (c1 == YELLOW && c2 == RED) -> ORANGE
       	(c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) -> GREEN
           	(c1 == BLUE && c2 == VIOLET) || (c1 == VIOLET && c2 == BLUE) -> INDIGO
               else -> throw Exception("Dirty color")
               }

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

스마트 캐스트 : 코틀린 컴파일러가 자동으로 타입을 변환해주는 기능
-> is 연산자를 사용해 변수 타입 검사하고 나면 캐스팅을 수행해줌(프로퍼티가 반드시 val이어야 함)

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

2.4.1 while 루프

while (조건) { /*...*/ }
do { /*...*/ } while (조건)

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

수열: 어떤 범위에 속한 값을 일정한 순서로 이터레이션하는 경우

2.4.3 맵에 대한 이터레이션

for((key, value) in 맵) { }

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

fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'
fun recognize(c: Char) = when (c) {
	in '0'..'9' -> "It's a digit!"
    	in 'a'..'z', in 'A'..'Z' -> "It's a letter!"
    	else -> "I dont' know..."

범위는 문자 뿐만 아니라 비교가 가능한 클래스라면 가능

println("Kotlin" in "Java".."Scalla") // true
println("Kotlin" in setOf("Java", "Scala")) // false

2.5 코틀린의 예외 처리

2.5.1 try, catch, finally

2.5.2 try를 식으로 사용

fun readNumber (reader: BufferedReader) {
	val number = try {
    		Integer.parseInt(reader.readLine()) // 예외가 발생하지 않으면 이 값을 사용
            } catch (e: NumberFormatException) {
            	null // 예외가 발생하면 null 값 사용
                }
                
profile
가보자고

0개의 댓글

관련 채용 정보