본문 바로가기

프로그래밍/Java

Java_상속과 다형성

클래스 상속

기존의 클래스를 재사용하여 속성이나 기능을 확장하여 새로운 클래스를 작성하는 것이다.
이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야할 때 기존 클래스를 상속한다.

물려받아서 기능을 확장
'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