[Kotlin] 상속

Leechaeyeon·2023년 5월 27일
0

상속

중복된 요소를 가지고 있는 클래스

  • 클래스는 객체를 생성할 때 사용하는 설계도 역할을 한다.
  • 다음과 같이 클래스가 정의되어 있다고 가정한다.

상속

  • 클래스를 설계할 때 다른 클래스가 가지고 있는 부분을 물려받는 것을 의미
  • 이를 통해 클래스마다 중복된 부분을 클래스 한곳에 만들 수 있다.

  • 상속을 하는 클래스를 부모클래스( SuperClass )라고 하며, 상속을 받는 클래스를 자식 클래스 ( SubClass ) 라고 한다.

  • 부모 클래스는 open 키워드를 사용해야한다.

  • open 키워드를 사용하지 않으면 자바 코드로 변경될 때 final키워드가 붙는다.
    ( final : 한번 초기화된 것은 바뀌지 않는다. )

open class Super1{
}

class Sub1 : Super1{
}

main

fun main(){
    val s1 = SubClass1()
    println("s1.subMember1 : ${s1.subMember1}")
    s1.subMethod1()

    println("s1.superMember1 : ${s1.superMember1}")
    s1.superMethod1()
}

부모 클래스

open class SuperClass{
    var superMember1 = 100
    
    constructor(){
        println("SuperClass의 기본 생성자")
    }
    
    fun superMethod1(){
        println("SuperClass1의 메서드 입니다")
    }
}

자식 클래스

class SubClass1 : SuperClass(){
    val subMember1 = 200
    
    fun subMethod1(){
        println("SubClass1의 메서드 입니다")
    }
}

s1에 SubClass1을 선언하면 상속받은 superMethod1를 호출할 수 있고, 자식의 메소드도 별개로 가능하다.
하지만, 부모클래스가 자식클래스에 있는 메소드를 불러올 수는 없다.
자바와 동일하게 클래스의 객체를 생성하면 부모 클래스의 기본생성자 ( 매개변수가 없는 ) 가 자동으로 호출된다.

만약 부모 클래스에 기본 생성자가 없으면 자식 클래스에서 명시적으로 호출해야한다.

open class SuperClass2(var a1:Int)

class SubClass2 : SuperClass2{
    // 부모의 생성자를 호출한다.
    constructor() : super(100){
        // 필요한 코드를 작성해주세요
    }
}

// 만약 생성자에 작성할 코드가 없다면 아래와 같이한다. 
class SubClass3 : SuperClass2(100)

상속 예제

< 문제 >

중국집
메뉴를 선택해주세요

  1. 짜장면, 2. 짬뽕, 3. 볶음밥, 4. 종료

주문 총 금액 : 30000원
짜장면 : 0개
짬뽕 : 0개
볶음밥 : 0개
음식 : 짜장면
가격 : 6000원
곱배기여부 : 곱배기 입니다 or 곱배기 아닙니다
음식 : 짬뽕
가격 : 8000원
홍합여부 : 홍합이 있습니다 or 홍합이 없습니다
음식 : 볶음밥
가격 : 10000원
국물종류 : 짬뽕국물 or 계란국물
짜장면, 짬봉, 볶음밥은 각각 별개의 클래스로 구성해준다.
각 클래스를 통해 생성된 객체를 담을 ArrayList는 각각 따로 만들어준다.
주문내역 출력시 짜장면들, 짬뽕들, 볶음밥들 순서대로 출력해주세요


fun main(){
    val chinessRestaurant = ChinessRestaurant()
    chinessRestaurant.selectMenu()
    chinessRestaurant.printMenu()
    chinessRestaurant.printFoodList()
}

class ChinessRestaurant{
    val scanner = Scanner(System.`in`)
    // 음식들을 담을 리스트
    val jjanJangMyunList = ArrayList<JJaJangMyun>()
    val jjamPPongList = ArrayList<JJamPPong>()
    val bockUmBabList = ArrayList<BockUmBab>()

    // 메뉴를 선택하는 기능
    fun selectMenu(){
        var selectNumber = 0

        while (true){
            println("메뉴를 선택해주세요")
            print("1. 짜장면, 2. 짬뽕, 3. 볶음밥, 4. 종료 : ")
            selectNumber = scanner.nextInt()

            if(selectNumber !in 1..4){
                println("번호를 다시 입력해주세요")
                continue
            }
            if(selectNumber == 4){
                break
            }

            when(selectNumber){
                1 -> {
                    print("곱배기 인가요 ?(1. 곱배기O, 2. 곱배기X) : ")
                    val temp = scanner.nextInt()
                    var temp2 = true
                    if(temp == 2){
                        temp2 = false
                    }
                    val food = JJaJangMyun("짜장면", 6000, temp2)
                    jjanJangMyunList.add(food)
                }
                2 -> {
                    print("홍합이 있나요? (1. 있음, 2. 없음) : ")
                    val temp = scanner.nextInt()
                    var temp2 = true
                    if(temp == 2){
                        temp2 = false
                    }
                    val food = JJamPPong("짬뽕", 8000, temp2)
                    jjamPPongList.add(food)
                }
                3 -> {
                    print("국물 종류가 무엇인가요? (1. 짬뽕국물, 2.계란국물) : ")
                    val temp = scanner.nextInt()
                    var temp2 = "짬뽕국물"
                    if(temp == 2){
                        temp2 = "계란국물"
                    }
                    val food = BockUmBab("볶음밥", 10000, temp2)
                    bockUmBabList.add(food)
                }
            }
        }
    }
    // 주문 내역을 출력하는 기능
    fun printMenu(){
        // 총 주문 금액
        var totalPrice = 0
        // 짜장면 금액 누적
        for(food in jjanJangMyunList){
            totalPrice += food.price
        }
        // 짬뽕 금액 누적
        for(food in jjamPPongList){
            totalPrice += food.price
        }
        // 볶음밥 금액 누적
        for(food in bockUmBabList){
            totalPrice += food.price
        }

        println("주문 총 금액 : ${totalPrice}원")
        println("짜장면 : ${jjanJangMyunList.size}개")
        println("짬뽕 : ${jjamPPongList.size}개")
        println("볶음밥 : ${bockUmBabList.size}개")
        println()
    }
    // 주문한 음식들을 출력하는 기능
    fun printFoodList(){
        // 짜장면
        for(food in jjanJangMyunList){
            food.printFoodInfo()
        }
        // 짬뽕
        for(food in jjamPPongList){
            food.printFoodInfo()
        }
        // 볶음밥
        for(food in bockUmBabList){
            food.printFoodInfo()
        }
    }

}

class JJaJangMyun  (var name:String, var price:Int, var isDouble:Boolean){

    fun printFoodInfo(){
        println("음식 : $name")
        println("가격 : ${price}원")

        if(isDouble == true){
            println("곱배기 여부 : 곱배기 입니다")
        } else {
            println("곱배기 여부 : 곱배기 아닙니다")
        }
    }
}

class JJamPPong (var name:String, var price:Int, var hasMuseel:Boolean){

    fun printFoodInfo(){
        println("음식 : $name")
        println("가격 : ${price}원")

        if(hasMuseel == true){
            println("홍합 여부 : 홍합이 있습니다")
        } else {
            println("홍합 여부 : 홍합이 없습니다")
        }
    }
}

class BockUmBab (var name:String, var price:Int, var soupType:String){

    fun printFoodInfo(){
        println("음식 : $name")
        println("가격 : ${price}원")
        println("국물 종류 : $soupType")
    }
}

0개의 댓글