클래스 상속
기존의 클래스를 재사용하여 속성이나 기능을 확장하여 새로운 클래스를 작성하는 것이다.
이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야할 때 기존 클래스를 상속한다.
물려받아서 기능을 확장
'extends' 키워드를 사용한다.
→ 상속하는 클래스 : 상위 클래스(A 클래스)
→ 상속받는 클래스 : 하위 클래스(B 클래스)
다형성이란 ?
하나의 코드가 여러 자료형으로 구현되어 실행되는 것이다. 즉 다양한 형태로 클래스(타입을) 바라볼 수 있다.
다형성을 잘 활용하면 유연하고 확장성 있고 유지보수가 편리한 프로그램을 만들 수 있다.
캐스팅이란 ?
타입을 변환(형변환)하는 것을 뜻한다.
- 업캐스팅
: 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것을 뜻한다.
- 다운캐스팅
: 업캐스팅된 것을 다시 원상태로 돌리는 것을 말한다.
하위클래스로 다운캐스팅을 할 때는 타입을 명시적으로 지정해줘야 한다.
상속과 다형성 예제
Fruit 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package ch11; public class Fruit { String name; int price; public Fruit(String name, int price) { this.name = name; this.price = price; } public void showInfo() { System.out.println("상품 명 : " + name); System.out.println("가격 : " + price); } } | cs |
Peach 클래스
1 2 3 4 5 6 7 8 | package ch11; public class Peach extends Fruit{ public Peach() { super("복숭아", 8000); } } | cs |
→ Fruit클래스의 상속을 받아 Peach를 구현하였다. (생성자에서 기본값을 미리 설정해둠.)
→ 자기자신의 생성자를 호출할 때 this()를 사용하듯 조상인 생성자를 호출하여 사용하려면 super()를 사용하면 된다.
super()를 사용하여 호출하고 초기값을 주었다.
Banana 클래스
1 2 3 4 5 6 7 8 9 10 11 12 | package ch11; public class Banana extends Fruit { String origin; public Banana() { super("델몬트 바나나", 5000); this.origin = "필리핀"; } } //end of class | cs |
→ Fruit클래스의 상속을 받아 Banana를 구현하였다.
→ 멤버변수 String origin; 을 선언하고 생성자 오버로딩으로 기본값을 설정해주었다.
FruitMainTest 클래스
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package ch11; public class FruitMainTest { // main 함수 public static void main(String[] args) { Fruit fruit1 = new Banana(); // 업 캐스팅 // 컴파일 시점에는 컴파일러가 앞에 선언된 데이터 타입만 확인한다. Fruit fruit2 = new Peach(); // 0, 1 Fruit[] fruits = new Fruit[2]; fruits[0] = fruit1; fruits[1] = fruit2; // 다운 캐스팅 String bananaOrigin = ((Banana) fruit1).origin; System.out.println("다운 캐스팅 된 값 확인 : " + bananaOrigin); // 반복문 for (int i = 0; i < fruits.length; i++) { fruits[i].showInfo(); // 바나나이면 원산지를 출력하시오 if(fruits[i] instanceof Banana) { //바나나 타입이 맞다면 여기 코드 안으로 들어온다. //다운 캐스팅 가능 String origin = ((Banana)fruits[i]).origin; System.out.println("바나나 원산지 : "+origin); } System.out.println("==============="); // 주소값 == 주소값 if (fruits[i] == fruit1) { String bananaOrigin2 = ((Banana) fruits[i]).origin; System.out.println(bananaOrigin2); } } } // end of main } // end of class 결과 화면 다운 캐스팅 된 값 확인 : 필리핀 상품 명 : 델몬트 바나나 가격 : 5000 바나나 원산지 : 필리핀 =============== 필리핀 상품 명 : 복숭아 가격 : 8000 =============== | cs |
→ Fruit fruit1 = new Banana();
부모 클래스 Fruit를 상속하는 Peach, Banana 자식 클래스가 있다. Banana 클래스는 Fruit클래스를 상속하기 때문에 Fruit 클래스의 상위 요소라 볼 수 있다. Banana를 Fruit에 할당하는 것을 업캐스팅이라고 한다.
→ String bananaOrigin = ((Banana)fruit1).origin;
Banana 클래스에서 선언했던 origin 멤버변수는 다운 캐스팅으로 출력하였다.
→ instanceof 연산자
원래의 인스턴스 형이 맞는지 여부를 체크하는 키워드이다. if문에 넣어 사용하고 형변환이 가능하면 true 아니면 false를 반환한다.
'프로그래밍 > Java' 카테고리의 다른 글
Java_Object클래스 (0) | 2023.02.14 |
---|---|
Java_인터페이스 (0) | 2023.02.14 |
Java_배열, 객체 배열 (0) | 2023.02.12 |
Java_static변수와 메서드 (0) | 2023.02.12 |
Java_this 사용법 (0) | 2023.02.10 |