본문 바로가기

코틀린

코틀린: 4장 테스트에 도전해 보세요

쉽게 다가가는 최신 프로그래밍: 코틀린 - 4장 클래스를 완전히 이해했나요? 다음 문제를 풀어 보세요.

문제 1 아래 코드를 참고하여 클래스 Calculator를 곱셈, 나눗셈이 가능한 클래스로 확장시켜 보세요.
(1) 2개의 인터페이스(IMultiply, IDivide)를 선언하세요,
(2) 클래스 Calculator가 (1)에서 정의한 인터페이스를 추가로 상속받아야 합니다.
(3) main() 함수에 곱셈, 나눗셈 테스트를 위한 코드를 추가해야 합니다.

interface IAddition {
    fun add(a: Int, b: Int)
}

interface ISubtract {
    fun sub(a: Int, b: Int)
}

class Calculator: IAddition, ISubtract {
    override fun add(a: Int, b: Int) {
        println("$a + $b = ${a+b}")
    }

    override fun sub(a: Int, b: Int) {
        println("$a - $b = ${a-b}")
    }
}

fun main() {
    val calc = Calculator()
    calc.add(4, 5)
    calc.sub(4, 5)
}

 

문제 2 문제 1을 이진 트리(binary tree)로 바꿔 보세요. 아래 코드를 참고하여 곱셈, 나눗셈이 가능한 클래스 Calculator로 기능을 확장시켜 보세요.
(1) 아래 코드를 먼저 실행시켜 보세요. 먼저 코드를 이해하는 것이 중요합니다.
최종 출력은 (4+5)+(4-5) = 9-1 = 8 입니다. NumberNode는 이진 트리의 잎사귀(leaf)에 해당합니다. val result = AddNode(addExpr, subExpr) 를 주목하세요. 2개의 자식 노드(addExpr, subExpr)을 합쳐 부모 노드(result)를 만든 것입니다. 

(2) 곱셈, 나눗셈을 위한 data class(MultiplierNode, DivideNode)를 정의하세요.
일반 클래스가 아닌 data 클래스를 사용한 것에 주목하세요. 2가지 이유 때문에 data 클래스를 사용했습니다. 첫째, data 클래스는 기본 함수(toString, equals, ...)를 자동으로 생성해 줍니다. boilerplate 코드가 필요없어 코드가 깔끔합니다. 둘째, 각 노드는 값(value)을 갖습니다. NumberNode는 당연히 값을 갖으며, 수식 노드(AddNode, SubtractNode)도 계산 결과 값을 반환합니다. 이런 형태의 응용에서는 data 클래스 사용이 최적입니다.

(3) main() 함수에 곱셈, 나눗셈 테스트를 위한 코드를 추가해야 합니다.

interface Expr {
    fun eval(): Int
}

data class NumberNode(val value: Int) : Expr {
    override fun eval(): Int {
        return value
    }
}

data class AddNode(val left: Expr, val right: Expr) : Expr {
    override fun eval(): Int {
        return left.eval() + right.eval()
    }
}

data class SubtractNode(val left: Expr, val right: Expr) : Expr {
    override fun eval(): Int {
        return left.eval() - right.eval()
    }
}

fun main() {
    val addExpr = AddNode(NumberNode(4),NumberNode(5))
    val subExpr = SubtractNode(NumberNode(4), NumberNode(5))
    val result = AddNode(addExpr, subExpr).eval()
    println("Result: $result")
}

 

문제 3 아래 코드는 3개 부분이 미완성입니다. 해당되는 코드를 추가해 코드를 완성하세요.

class Product(name: String, category: String) {
    private val name: String
    private val category: String
    private var price: Double
    private var quantity: Int
    init {
       // 미완성(1)
    }
    constructor(name: String, category: String, price: Double): 미완성(2) {
        this.price = price
    }
    constructor(name: String, category: String, price: Double, quantity: Int): 미완성(3) {
        this.quantity = quantity
    }
}

fun main() {
    val mp3 = Product("MP3 player", "Electronics")
    val flash = Product("Flash memory", "Electronics", 35.0)
    val lego = Product("Lego block", "Toy", 10.0, 54)
}

 

문제 4 교재 p.248-249의 코드는 대표 과일 8개에 대해 칼로리 순으로 과일을 정렬하는 코드입니다.
(1) 인터넷 검색을 통해 data 클래스 Fruit 에 맞게 과일 데이터를  2개 추가하세요.
(2) 과일을 먹었을 때 총 칼로리를 환산하는 함수를 작성하세요.
칼로리 계산을 위해서는 입력 값으로 과일 갯수(단위: 개), 과일 무게(단위:  g - 가상의 무게)를 전달받아야 합니다.
예: 사과 2개(1개당 350g), 딸기 10개(1개당 20g)를 먹었을 때 총 칼로리는 48x3.5x2 + 33x0.2x10 = 402 입니다.

 

문제 5 교재 p.195-197의 코드는 다형성(polymorphism)을 적용해 다각형의 면적을 계산하는 코드입니다. 이를 sealed class를 사용해 구현하세요.
(1) 봉인된 부모 클래스 이름은 Shape, 자식 클래스 이름은 Circle, Rectange, Triangle 입니다.
(2) sealed class Shape 안에 자식 클래스를 모두 선언해야 합니다(교재 p.93 코드를 참고하세요).

 

문제 6 교재 p.205-211의 코드는 깊이 우선 탐색 알고리즘(전위/중위/후위 탐색)을 구현한 코드입니다. 교재 예제에서는 모두 7개의 노드를 삽입하고, 균형잡힌 이진 트리(balanced binary tree)를 만들었습니다.
(1) 전체 코드를 직접 입력해 전위/중위/후위 탐색이 제대로 동작하는지 확인하세요.
(2) 불균형 이진 트리를 만들고,  전위/중위/후위 탐색이 제대로 동작하는지 확인하세요.
인터넷 검색을 통해 균형 트리와 불균형 트리의 개념을 알아보세요.
(3) 노드 갯수는 7~10개 이내로 제한해서 테스트 하세요.