티스토리 뷰

Programming/Kotlin

2. 객체 소개

Mongi0417 2023. 6. 16. 18:32

Atom. 19 생성자

예제) Wombat

class Wombat

fun main() {
    val wombat = Wombat()
    println(wombat)
}

코틀린에서는 자바와 달리 new가 불필요한 중복이기 때문에 제외한다.

 

예제) Arg

class Alien(name: String) {
    val greeting = "Poor $name"
}

fun main() {
    val alien = Alien("Mr. Meeseeks")
    println(alien.greeting)
    // alien.name은 에러를 발생시킨다.
}

출력

Poor Mr. Meeseeks

name은 생성자 안에서 greeting 프로퍼티를 초기화하지만, 생정자 밖에서는 name에 접근할 수 없다. 클래스 본문 밖에서도 생성자 파라미터에 접근할 수 있게 하려면 파라미터 목록에 var나 val을 지정해야 한다.

예제)

class MutableNameAlien(var name: String)

class FixedNameAlien(val name: String)

fun main() {
    val alien1 = MutableNameAlien("Reverse Giraffe")
    val alien2 = FixedNameAlien("Krombopolis Michael")
    alien1.name = "Parasite"
    // alien2.name = "Parasite"
}

생성자 파라미터 목록에 있는 name을 var나 val로 정의하면 해당 식별자가 프로퍼티로 바뀌며, 생성자 밖에서도 이 식별자에 접근할 수 있게 된다. 하지만 val로 정의한 생성자 파라미터는 변경할 수 없다.

 

Atom 20. 가시성 제한하기

" 작성한 코드를 며칠 또는 몇 주 동안 보지 않다가 다시 살펴보면 그 코드를 작성하는 더 좋은 방법이 보일 수도 있다 "

 

소프트웨어를 설계할 때 일차적으로 고려해야 할 내용: 변화해야 하는 요소와 동일하게 유지되어야 하는 요소 분리하기

 

Atom 21. 패키지

패키지란, 연관 있는 코드를 모아둔 것이다.

as 키워드를 사용하면 임포트하면서 이름을 변경할 수 있다.

예제)

import kotlin.math.PI as circleRatio
import kotlin.math.cos as cosine

fun main() {
    println(circleRatio)
    println(cosine(circleRatio))
    println(cosine(2 * circleRatio))
}

출력

3.141592653589793
-1.0
1.0

 

Atom 22. 테스트

" 프로그램을 빠르게 개발하려면 지속적인 테스트가 필수다 "

 

예제) TDDFails

import atomictest.*

fun main() {
    calculateBMI(160, 68) eq "Normal weight"
    calculateBMI(100, 68) eq "Under weight"
    calculateBMI(200, 68) eq "Over weight"
}

fun calculateBMI(weight: Int, height: Int): String {
    val bmi = weight / (height * height) * 703.07
    return if (bmi < 18.5) "Under weight"
    else if (bmi < 25) "Normal weight"
    else "Over weight"
}

출력

Under weight
[Error]: Under weight != Normal weight
Under weight
Under weight
[Error]: Under weight != Over weight

몸무게가 어느 범주에 속하는지 검사하는 코드를 추가하였을 때, 첫 번째와 세 번째 테스트는 실패 에러를 발생시킨다.

두 번째 테스트는 weight / (height * height) 부분에서 Int와 Int를 곱한 값이라 Int이다. 결과적으로 키 * 키는 몸무게에 훨씬 큰 경우가 일반적이기 때문에 결과가 0으로 나오고 첫 번째와 세 번째 테스트는 실패 에러를 발생시킨다.

 

예제) TDDWorks

import atomictest.*

fun main() {
    calculateBMI(160.0, 68.0) eq "Normal weight"
    calculateBMI(100.0, 68.0) eq "Under weight"
    calculateBMI(200.0, 68.0) eq "Over weight"
}

fun calculateBMI(weight: Double, height: Double): String {
    val bmi = weight / (height * height) * 703.07
    return if (bmi < 18.5) "Under weight"
    else if (bmi < 25) "Normal weight"
    else "Over weight"
}

파라미터를 Double로 변경하여 이를 해결할 수 있다.

 

Atom 23. 예외

예제) IntroducingNull

import atomictest.*

fun main() {
    "1$".toIntOrNull() eq null
}

출력

null

코틀린 표준 라이브러리는 String에 정수가 들어 있으면 정수를 정수로 변활할 수 없는 문자열이 들어 있으면 null을 리턴하는 String.toIntOrNull()이라는 함수를 제공한다.

 

예제) AverageIncome

import atomictest.*

fun averageIncome(income: Int, months: Int) = income / months

fun main() {
    averageIncome(3000, 3) eq 1000
    capture {
        averageIncome(5000, 0)
    } eq "ArithmeticException: / by zero"
}

출력

1000
ArithmeticException: / by zero

months에 0을 입력했을 때, averageIncome()의 나눗셈은 ArithmeticException을 던진다. 하지만, 해당 예외는 발생 원인에 대한 정보를 주지 않는다. 아래 예제는 averageIncome()이 문제가 발생한 이유를 명확히 생성하도록 만들었다.

예제) AverageIncomewithNull

import atomictest.*

fun averageIncome(income: Int, months: Int) = if (months == 0) null else income / months

fun main() {
    averageIncome(3000, 3) eq 1000
    averageIncome(5000, 0) eq null
}

출력

1000
null

 

averageIncome()에 잘못된 인자가 전달될 경우에도 예외를 던질 수 있다. 예뢰를 던지면 함수를 종료하고 프로그램의 다른 부분에서 이를 처리하도록 강제한다. 일반 디폴트 ArithmeticException을 허용할 수 있지만, 좀 더 자세한 오류 메시지가 포함된 구체적인 예외를 던지면 더 유용하다.

예제)

import atomictest.*

fun averageIncome(income: Int, months: Int) = if (months == 0) throw IllegalArgumentException("Months can't be zero") else income / months

fun main() {
    averageIncome(3000, 3) eq 1000
    capture {
        averageIncome(5000, 0)
    } eq "IllegalArgumentException: " + "Months can't be zero"
}

출력

1000
IllegalArgumentException: Months can't be zero

 

Atom 24. 리스트

" List는 컨테이너(container), 즉 다른 객체를 담는 객체에 속한다 "

 

컨테이너는 컬렉션이라고도 한다.

List는 표준 코틀린 패키지에 들어 있기 때문에 import를 할 필요가 없다.

예제) Lists

import atomictest.*

fun main() {
    val ints = listOf(99, 3, 5, 7, 11, 13)
    ints eq "[99, 3, 5, 7, 11, 13]"

    var result = ""
    for (i in ints)
        result += "$i "
    result eq "99 3 5 7 11 13"

    ints[4] eq 11
}

출력

[99, 3, 5, 7, 11, 13]
99 3 5 7 11 13 
11

[1] List는 자기 자신을 표현할 때 각괄호([])를 쓴다.

 

 

Atom 25. 가변 인자 목록

 

 

Atom 26. 집합

 

 

Atom 27. 맵

 

 

Atom 28. 프로퍼티 접근자

 

 

Atom 29. 2장 요약

'Programming > Kotlin' 카테고리의 다른 글

1. 프로그래밍 기초  (1) 2023.06.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
29 30
글 보관함