티스토리 뷰

728x90

 


인터페이스

• 구현부 없이 틀을 만들어 놓은 것

• 인터페이스를 상속한 클래스는 해당  인터페이스의 틀을 지켜야 한다.

     - 일종의 규약(프로토콜)이다.

     - 지켜야 하는 규약이기 때문에, 클래스 내부를 보지 않고 인터페이스만 봐도  어떤 멤버가 들어있는 지 등의 사용법 유추가 가능하다.

• 자료형으로 쓸 수 있다.

• 다중 상속, 다중 구현이 가능하다.

interface Tiger {
    fun bite()
    fun hide()
}

interface Bird {
    fun fly()
}

class BackDoSanTiger: Tiger, Bird {
    override fun bite() { // Tiger 인터페이스의 bite 구체적 구현
        println("문다.")
    }

    override fun hide() { // Tiger 인터페이스의 hide 구체적 구현
        println("숨는다.")
    }

    override fun fly() { // Bird 인터페이스의 fly 구체적 구현 -> 다중 상속이 가능하다.
        println("난다.")
    }
}

val backDoSanTiger: BackDoSanTiger = BackDoSanTiger()
backDoSanTiger.bite() // 문다 출력
backDoSanTiger.hide() // 숨는다 출력
backDoSanTiger.fly() // 난다 출력

 

* 코틀린에서의 인터페이스

• 원래 인터페이스의 문제점

     - 인터페이스는 구현부가 없는 틀이다.

     -> 따라서, 상속받은 클래스에서 반드시 구현해야 한다.

     -> 이는 해당 인터페이스를 상속받은 클래스가 만약 여러 개라 하더라도, 그 클래스들 전부를 구현해주어야 한다는 뜻이다.

     -> 구현할 내용 중 공통된 부분이 었더라도, 각 클래스마다 따로 일일이 구현해주어야 한다.

     -> 이는 불편하고, 코드의 낭비이다.

• 그래서 코틀린은 인터페이스에서 메소드를 구현할 수 있게 지원해준다.

* 프로퍼티는 안 되고 메소드 구현만 지원

interface Person {
    var age: Int

    fun eat()
    fun walk() { // 코틀린은 인터페이스에 메소드 구현이 가능하다.
        println("걷는다.")
    }
    fun sleep() {
        println("잠을 잔다.") 
    }

    var name: String = "홍길동" // 오류 발생 : 프로퍼티의 구현은 안 된다.
}

class Teacher() : Person {
    override var age: Int = 40

    override fun eat() { // eat의 구체적 구현
        println("밥을 사먹는다.")
    }

    // walk는 구현되어 있기 때문에 없어도 된다.

    // sleep도 구현되어 있기 때문에 없어도 된다.
}

class Student() : Person {
    override var age: Int = 19

    override fun eat() { // eat의 구체적 구현
        println("급식을 먹는다.")
    }

    // walk는 구현되어 있기 때문에 없어도 된다.

    override fun sleep() { // 이미 인터페이스에서 구현되어 있는 sleep를 오버라이드
        println("한국 학생들은 잠을 못 잔다.")
    }
}
val student: Student = Student()
student.eat()
student.sleep()
println(student.age)
val teacher: Teacher = Teacher()
teacher.eat()
teacher.sleep()
println(teacher.age)

 

* 클래스의 상속과 인터페이스의 상속의 다른 점

• 클래스는 멤버를 숨기는 것이 기본 값.
     - 즉, 명시하지 않으면 final이 기본 값.
     - 상속을 하기 위해선 open 키워드를 적어줘야 함.

• 인터페이스는 멤버를 보여주는 것이 기본 값.

     - 즉, 명시하지 않으면 open이 기본 값.
     - 상속을 막기 위해선 final 키워드를 적어줘야 함.

 

 

 

 

 

 

 

이 글은

패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online

강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.

 


728x90
댓글
공지사항