- [Java] 43. 다형성과 캐스팅2024년 04월 24일
- Song hyun
- 작성자
- 2024.04.24.:28
728x90반응형[Java] 43. 다형성과 캐스팅
1. 다형성의 개념
2. 업캐스팅과 다운캐스팅
3. 다형성과 캐스팅의 활용
1. 다형성의 개념
(1) 다형성(Polymorphism)은 하나의 데이터 타입을 다양한 형태로 바라볼 수 있는 개념을 뜻한다.
-다형성은 객체 지향 패러다임에서 중요한 개념 중 하나로,이는 한 요소(메서드, 클래스)가 여러 형태를 가질 수 있는 등력을 뜻한다.
-다형성은 코드의 유연성과 재사용성을 높이며, 이러한 개념은 상속/추상화/인터페이스에서 많이 쓰인다.-컴파일 시점에서는 문법적인 오류만을 확인하고, 런타임 시점에서 실제 객체가 만들어진다.
2. 업캐스팅과 다운캐스팅
업캐스팅/다운캐스팅은 객체 지향 패러다임에서 다형성을 활용할 때 사용되는 개념이다.
(1) 업캐스팅(Upcasting)
-업캐스팅은 부모클래스의 참조변수로 자식 클래스의 객체를 참조하는 것을 말한다.
-부모 클래스의 데이터 타입으로 자식 클래스의 객체를 대입하는 것을 의미한다.
-업캐스팅은 자동으로 이루어진다.Animal animal=new Dog(); // 업캐스팅
(2) 다운캐스팅(Downcasting)
-다운캐스팅은 부모 클래스의 참조 변수를 자식 클래스의 객체로 변환하는 것을 말한다.
-다운캐스팅은 명시적으로 형변환을 해야한다. (=강제 형 변환과 유사하다.)
-다운캐스팅은 업캐스팅된 객체가 실제로 자식 클래스의 객체일 때만 가능하다.
그렇지 않으면 ClassCastException(예외)가 발생할 수 있다.((Human)animal).readBooks();
3. 다형성과 캐스팅의 활용
*Instanceof 연산자: 실행 시점에 객체가 특정 클래스의 인스턴스인지 확인하는 키워드이다.
아래의 코드를 살펴보자.
각각 Banana/Peach 클래스에 새로운 객체를 생성한 뒤,
Fruit형 변수들을 받는 배열 fruits에 순서대로 넣었다는 것을 알 수 있다.
(1) 이처럼 Banana/Peach 클래스 소속인 두 변수가
Fruit형을 담는 배열에 들어갈 수 있던 이유는 다형성 때문이라고 할 수 있다.
Banana/Peach 클래스 두 개 모두 Fruit 클래스에게서 상속받고 있기 때문에,
Fruit 자료형으로도 호출이 가능해지는 것이다.
(2) 두번째로는 캐스팅을 통해, banana 내부의 origin 요소를 출력하는 것이다.
이 때 origin은 Fruit 클래스가 아닌 Banana 클래스에서만 존재하는 변수이다.
banana의 속성 origin의 경우는 private으로 외부 접근을 막고 있기 때문에,
직접 호출이 아닌 다른 방법으로 접근해야 한다. 이 때 방식은 두 가지가 있는데,
-첫
package basic.ch20; public class FruitTest { public static void main(String[] args) { //다형성 //다양한 형태로 클래스, 또는 데이터 타입을 바라볼 수 있다. Fruit fruit1=new Banana(); //업캐스팅: 부모의 데이터 타입으로 자식 클래스의 객체 대입 Fruit fruit2=new Peach(); Banana banana=new Banana(); //업캐스팅: 부모의 데이터 타입으로 자식 클래스의 객체 대입 Peach peach=new Peach(); fruit1.showinfo(); fruit2.showinfo(); System.out.println("------------"); // 다형성을 사용하면 // 코드를 유연하게 사용할 수 있다. Fruit[] fruits=new Fruit[4]; fruits[0]=fruit1; fruits[1]=fruit2; fruits[2]=banana; fruits[3]=peach; } }
package basic.ch20; public class Fruit { String name; int price; public void showinfo() { System.out.println("상품명 : "+this.name); System.out.println("상품 가격 : "+this.price); } }
package basic.ch20; public class Banana extends Fruit{ String origin; public Banana() { name="춘식이바나나"; price=5_000; origin="한국"; } public void saleBanana() { System.out.println("바나나 가격을 할인합니다."); price-=1_000; } }
package basic.ch20; public class Peach extends Fruit{ public Peach() { name="복숭아"; price=8_000; } }
728x90반응형'Java > 기본 개념 및 클래스' 카테고리의 다른 글
[Java] 45. 배열, 업/다운 캐스팅, 다형성 활용 : 인형 뽑기 프로그램 만들기 (0) 2024.04.24 [Java] 44. 다형성 활용: 스타크래프트 소스 코드 수정하기 (0) 2024.04.24 [Java] 42. 연관 관계 활용: 학생과 학급 클래스 만들기 (0) 2024.04.24 [Java] 41. 연관 관계와 의존 관계 (0) 2024.04.23 [Java] 40. 메서드 오버로딩, 상속 응용: 유닛에 마린, 질럿, 저글링 상속시키기 (0) 2024.04.23 다음글이전글이전 글이 없습니다.댓글