일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 추상화함수
- 카이캐드 설치
- ESP32_S2_WROVER
- 개발 보드
- GCD
- ATmega328p
- 아두이노
- 유클리드 호제법
- ESP32_S2
- 7세그먼트
- 업캐스팅
- 아두이노 모터 드라이버
- 카이캐드 다운로드
- string함수
- kotlin
- androidstudio
- 재정의함수
- 우송대 라즈베리파이 피코
- 약수 구하기
- 공약수
- 카이캐드
- 코틀린
- 안드로이드스튜디오
- Arduoin
- 우송대
- 라즈베리파이 피코
- KiCad
- PICO4
- 우송대학교
- L293D
- Today
- Total
개발자의 생활
업, 다운 캐스팅 (다형성) 본문
이전에 클래스 상속에 대해 알아보았는데요 이번에는 상속을 통해 다형성을 구현할 수 있습니다.
다형성이란 여러 다양한 기능을 가진 객체 라고 설명할 수 있습니다.
예를들어 저의가 결제 시스템을 만든다고 했을때 결제하는 기능을 가진 클래스를 하나 만들어야 하죠 하지만 결제 방식은 삼성페이, 애플페이, 구글페이 등 같은 결제시스템 안에 다양한 방식의 결제기능을 구현해야 합니다.
만약 각각 결제방식마다 구분해서 다양한 클래스로 만들면 추후에 새로운 결제시스템을 추가하거나 수정하는등의 유지보수를 하기 힘들어 질겁니다. 다형성은 이러한 문제를 해결할 수 있게 합니다. 다양한 결제시스템을 구현한 클래스를 하나의 클래스로 연결해서 관리하면 유지보수에 용이합니다.
다형성을 활용한 코드 예시
fun main() {
val paymentSystem1: Pay = Samsung()
val paymentSystem2: Pay = Apple()
val paymentSystem3: Pay = Google()
paymentSystem1.payment()
if(paymentSystem1 is Samsung){
paymentSystem1.check()
}
paymentSystem2.payment()
val a = paymentSystem2 as Apple
paymentSystem2.check()
paymentSystem3.payment()
}
interface Pay{
fun payment()
}
class Samsung : Pay{
override fun payment() {
println("삼성 페이 결제")
}
fun check(){
println("결제 확인")
}
}
class Apple : Pay{
override fun payment() {
println("애플 페이 결제")
}
fun check(){
println("결제 확인")
}
}
class Google : Pay{
override fun payment() {
println("구글 페이 결제")
}
}
Pay 인터페이스는 payment라는 추상 함수를 선언하고 있습니다. 이 인터페이스를 Samsung, Apple, Google 클래스가 각각 구현 하여 해당 함수를 오버라이딩 하고 있습니다.
이러한 구조는 다형성의 예로, 각각의 결제 시스템이 공통 인터페이스를 통해 다양한 방식으로
결제를 처리할 수 있게 합니다.
main 함수에서는 Pay 인터페이스 타입의 변수를 생성하고, Samsung, Apple, Google 인스턴스를 담고 있습니다. 이를
업캐스팅 이라고 부르며, 하위 클래스의 객체가 상위 클래스나 인터페이스 타입으로 참조되는 것을 의미합니다. 이때,
실제 객체가 Samsung이지만 참조 변수의 타입은 Pay이므로 payment 메서드를 호출하면 해당 객체에서
오버라이딩된 함수가 실행됩니다.
하지만 업캐스팅된 객체는 상위 클래스 또는 인터페이스의 함수만 사용할 수 있기 때문에, 하위 클래스에서 정의한 고유 함수는 직접 호출할 수 없습니다. 예를 들어, Samsung 클래스에만 있는 check() 메서드는 Pay 타입으로 참조할 때는 사용할 수 없습니다. 그래서 이를 사용하려면 다시 다운캐스팅이 필요합니다.
is 키워드: 객체가 특정 타입인지 확인할 때 사용합니다. is 키워드는 조건식에서 타입 체크를 수행하며, 타입이 맞다면 자동으로 해당 타입으로 캐스팅되어 일시적으로 그 타입의 함수를 사용할 수 있습니다.
as 키워드: 객체를 특정 타입으로 명시적으로 다운캐스팅할 때 사용합니다. 다운캐스팅 후에는 영구적으로 그 타입의 참조 변수로 사용할 수 있으며, 이를 통해 하위 클래스의 고유 함수에 접근할 수 있습니다.
이 코드는 다형성을 이해하기 위한 기본적인 예시이며, 이를 바탕으로 더 확장하고 코드를 리팩터링하면 더 깔끔한 구조로 만들 수 있습니다.
물론 이 방법 말고도 다양한 방법들도 있습니다.
'kotlin(코틀린) 강좌' 카테고리의 다른 글
제네릭 (0) | 2024.10.30 |
---|---|
고차함수, 람다함수 (0) | 2024.10.24 |
스코프, 접근제한자 + 프로젝트 구조 (0) | 2024.10.04 |
class 사용 (4) | 2024.09.16 |
조건문, 반복문 (연산자) (2) | 2024.09.09 |