클리엘
CLIEL LAB
클리엘
전체 방문자
오늘
어제
  • 분류 전체보기 (514)
    • Mobile (47)
      • Kotlin (47)
    • Web (84)
      • NestJS (9)
      • HTML5 & CSS3 (38)
      • Javascript (20)
      • TypeScript (6)
      • JQuery (11)
    • .NET (301)
      • C# (84)
      • ASP.NET (67)
      • Windows API for .NET (128)
    • Server (53)
      • SQL Server (10)
      • MariaDB (18)
      • Windows Server (6)
      • node.js (19)
    • System (12)
      • 작업LOG (12)
    • Review (11)
    • ETC (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 블로그 정리

인기 글

태그

  • asp.net core web api
  • NestJS
  • JavaScript
  • android studio
  • asp.net core
  • Windows API
  • Entity Framework
  • android
  • c#
  • MariaDB
  • jQuery
  • LINQ
  • CSS3
  • node.js
  • 변수
  • HTML5
  • ASP.NET
  • Kotlin
  • .NET
  • exception

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
클리엘

CLIEL LAB

[Kotlin] 추상 클래스와 인터페이스
Mobile/Kotlin

[Kotlin] 추상 클래스와 인터페이스

2020. 12. 10. 09:43
728x90

클래스라는 것을 만들어 두면 이것을 인스턴스화 하여 객체를 생성하고 객체를 통해 클래스의 기능을 이용하게 됩니다. 객체지향 언어(코틀린은 함수형언어)에서 클래스는 객체를 구체화한 것인데 이 구체화 단계가 명확하게 떨어지지 않을 때 추상 클래스를 사용하게 됩니다.

 

예를 들어 고양이라는 대상이 있으면 고양이를 클래스로 만들어 구체화 할 수 있고, 고래가 있으면 고래라는 클래스를 만들어 구체화할 수 있을 것입니다. 그런데 '동물'이라는 대상이 있으면 얘는 어떻게 클래스로 만들어 구체화할까요?

 

'동물'이라는 대상은 개인지 고양이인지, 고래인지, 두더지인지.. 암튼 특정 류의 동물에 따라 구체화할 수 있는 방법이 달라집니다. 객체 자체가 명확하지 않은 셈인데 이렇게 불분명한 상태를 나타내고자 할 때 이걸 추상 클래스(abstract)나 인터페이스(interface)로 구현하고 명확한 객체를 대상으로 클래스를 만들 때 이들로부터 상속하여 좀 더 구체화하는 것으로 클래스의 설계가 진행되는 것입니다.

 

(1) 추상 클래스

 

추상 클래스는 abstract키워드로 클래스가 작성됩니다.

abstract class Animal {
    abstract fun eat()
    abstract fun move()
}

동물이 먹는 방법과 이동하는 방법이 어떤 동물이냐에 따라 달라진다는 판단하에 추상적으로 껍데기만 구현해 놓는 것입니다.

 

하지만 간혹 추상 클래스 안에서도 어떤 내용이 구체화될 수 있는 경우도 있는데 이때는 온전한 메서드를 구현해 놓습니다.

abstract class Animal {
    abstract fun eat()
    abstract fun move()
    fun sleep() {
        Log.d("test", "동물이 잠을 잔다.")
    }
}

이제 클래스를 구현하는 단계에서 추상 클래스를 상속해 메서드를 구체화합니다. 이때 추상클래스의 메서드는 override를 통해 재정의 하는 것으로 구체화 합니다.

class Whale : Animal() {
    override fun eat() {
        Log.d("test", "고래가 먹이를 먹다.")
    }
    
    override fun move() {
        Log.d("test", "고래가 헤엄쳐 이동하다.")
    }
}

(2) 인터페이스

 

추상 클래스와 거의 비슷한 개념이지만 차이점은 인터페이스는 절대로 메서드의 구체적인 구현을 가지지 않는다는 점입니다. 추상클래스에서 예로 든 'sleep()'메서드는 추상클래스 안에서 이미 구현되어 있기 때문에 이를 상속받는 클래스에서는 다시 재정의 하지 않아도 자유롭게 해당 메서드를 호출할 수 있습니다.

var a = Whale()
a.sleep()

하지만 인터페이스는 순수히 속성이나 메서드의 이름만 가질 수 있으며 interface키워드를 사용해 다음과 같이 구현할 수 있습니다.

interface Animal {
    var name: String
    fun eat()
    fun move()
}

물론 인터페이스를 상속받는 클래스는 이를 모두 구현해야 합니다.

class Whale : Animal {
    override var name: String = "고래"
    override fun eat() {
        Log.d("test", "고래가 먹이를 먹다.")
    }

    override fun move() {
        Log.d("test", "고래가 헤엄쳐 이동하다.")
    }
}

인터페이스에서 재미있는 건 클래스의 상속 형태가 아닌 인터페이스 자체를 그대로 받아 객체를 생성하는 것도 가능하다는 것입니다. 이렇게 하려면 object키워드를 통해 인터페이스를 받아야 합니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var Whale = object : Animal {
            override var name: String = "고래"
            override fun eat() {
                Log.d("test", "고래가 먹이를 먹다.")
            }

            override fun move() {
                Log.d("test", "고래가 헤엄쳐 이동하다.")
            }
        }
        
        Whale.move()
    }
}

728x90
저작자표시 비영리 변경금지 (새창열림)

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

[Kotlin] 레이아웃(Layout) - 컨스트런트  (0) 2020.12.11
[Kotlin] 제네릭(Generics)  (0) 2020.12.10
[Kotlin] 데이터 클래스  (0) 2020.12.09
[Kotlin] 클래스(Class)  (0) 2020.12.09
[Kotlin] 함수  (0) 2020.12.08
    'Mobile/Kotlin' 카테고리의 다른 글
    • [Kotlin] 레이아웃(Layout) - 컨스트런트
    • [Kotlin] 제네릭(Generics)
    • [Kotlin] 데이터 클래스
    • [Kotlin] 클래스(Class)
    클리엘
    클리엘
    누구냐 넌?

    티스토리툴바