티스토리 뷰
😶🌫️ 다형성
- 이미 우리는 클래스의 상속을 통해 클래스를 확장하는 방법을 알고 있다. 다형성이라는 것은 어떻게 생각하면 좀 어려운 개념이지만, 간단한 예시로 이해하자면 다음과 같다.
- 점심을 먹을 때 중식, 한식, 양식, 일식 중 한식을 먹는다고 해보자. 이때 한식을 한식 자체로 볼 수도 있지만, 이를 확장시켜 음식이라는 특징으로 생각한다면, 어떨까? 좀 더 확장된다고 생각들지 않는가? 이게 바로 다형성이다.
- 다시 이야기하자면, 음식이라는 클래스와 이를 상속받은 한식이라는 클래스를 만든 뒤에 한식이라는 클래스로 koreanFood라는 인스턴스를 만든다면, koreanFood에는 음식이라는 클래스 공간에 한식이라는 클래스 공간이 추가된다.
- 이때 한식 인스턴스를 음식 변수에 담는 행위를 상위 자료형인 super class로 변환했다고 하여 up-casting이라고 하며, up-casting된 인스턴스를 다시 하위 자료형으로 down-casting이라고 한다.
- 사실 up-casting은 그냥 상위 타입에 할당하는 것으로도 동작하지만, down-casting은 별도의 연산자가 필요하다. 그 연산자가 바로 as와 is 연산자이다.
- as는 변수를 호환되는 자료형으로 변환해주는 casting 연산자로 코드에서 사용시 즉시 자료형을 바로 변환해주며 변환한 결과를 반환받아 변수에 넣어줄수도 있다.
- is는 변수가 자료형에 호환되는지 먼저 체크한 후 변환해주는 casting 연산자로 조건문 내에서 사용되는 특징이 있다.
아래의 코드를 확인해보자.
fun main(args: Array<String>) {
var a = Food()
a.eat()
var b: Food = KoreanFood()
b.eat()
// is를 통해 짐시 down-casting하는 방법
if( b is KoreanFood) //
{
b.delicious()
}
// as를 통해 down-casting 된 자료형을 저장하여 하위 클래스의 인스턴스를 사용하는 방법
var c = b as KoreanFood
c.delicious()
b.delicious()
}
open class Food {
var name = "음식"
open fun eat() {
println("${name}을 먹습니다.")
}
}
class KoreanFood: Food() {
var type = "한식"
override fun eat() {
println("${name}중에 ${type}을 먹습니다.")
}
fun delicious() {
println("${type}은 맛있습니다.")
}
}
- b는 Food 타입이지만, KoreanFood에서 override한 eat 함수를 호출할 수 있다.
- 하지만 Food 타입임으로 delicious를 호출할 수는 없다. 실제로 작성해보면 참조할 수 없다고 뜰 것이다.
- 이때는 is나 as를 통해 down-casting해야 delicious를 사용할 수 있는데, is는 조건문 안에서만 잠깐 down-casting 되며, as의 경우 반환값 뿐만 아니라 사용값까지 모두 down-casting된다.
- 다형성은 클래스의 상속관계에서 오는 인스턴스의 호환성을 적극 활용할 수 있는 기능으로 슈퍼 클래스가 같은 인스턴스를 한번에 관리하거나 인터페이스를 구현하여 사용하는 코드에서도 이용된다
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] List (0) | 2021.12.08 |
---|---|
[Kotlin] Generic (0) | 2021.12.07 |
[kotlin] 변수, 함수, 클래스의 접근범위와 접근제한자 (0) | 2021.12.06 |
[Kotlin] Kotlin의 기본 프로젝트 구조 (0) | 2021.12.06 |
[Kotlin] 오버라이딩과 추상화 (0) | 2021.12.06 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Python
- 앱개발
- Java #객체지향 #상속 #생성자 #개념 #비전공개발자 #FullStack을 #향해
- 구간 합 구하기 4
- 싸피5기
- 참조연산자
- kotlin문법
- 알고리즘
- 보조생성자
- 기본생성자
- 프로그래머스
- Java
- 비전공개발자
- 코틀린
- 일반파라미터
- 백준 #숨박꼭질3 #다익스트라 #알고리즘 #비전공개발자 #풀스택 #웹개발 #앱개발 #안드로이드 #python
- 백준
- Class
- 생성자
- 추가합격후기
- 비전공싸피합격
- Programmers #알고리즘 #Python #KAKAOINTERNSHIP #비전공개발자 #불량사용자
- 백준알고리즘 #BFS #델타이동 #알고리즘풀이 #개발 #안전영역 #풀스택개발자가되고싶습니다. #노력할래요 # 꾸준히 # 화이팅! #비전공개발자
- 카카오
- 중첩클래스와 내부클래스
- DP
- 프로젝트구조
- 안드로이드
- Kotlin
- 안드로이드 #안드로이드스튜디오 #Kotlin #앱개발 #안드로이드기초 #비전공개발자 #풀스택개발자 #앱개발자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함