본문 바로가기
✨ Java/상속(Inheritance)

자바(JAVA) - 상속(Inheritance) -2

by 환풍 2023. 2. 13.
728x90

 

두가지의 예시로 상속에 대해 좀 더 알아보려고 한다.

첫번째로, 동물을 부모클래스로 강아지와 고양이를 예로 들어보았다.

 

Ani.class

Cat.class

Puppy.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Ani{
    public void sound(){
        System.out.println("운다.");
    }
}
 
public class Cat extends Ani{
    public void sound(){
        System.out.println("야옹");
    }
}
 
class Puppy extends Ani{
    public void sound(){
        System.out.println("멍멍");
    }
}
cs

Cat은 Ani의 자식클래스이고, Puppy도 Ani의 자식클래스이다.

그렇다면 5마리의 동물을 각각 저장할 수 있을까?

 

AnimalManage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class AnimalManage {
    public static void main(String[] args) {
        // 강아지, 고양이 저장할 공간 5개 만들어야 함.
        // Ani a = new cat();   부모는 자식을 받을 수 있다.
        Ani cages[] = new Ani[5];
 
        cages[0= new Cat();
        cages[1= new Cat();
        cages[2= new Puppy();
        cages[3= new Puppy();
        cages[4= new Puppy();
 
        cages[0].sound();
        cages[3].sound();
    }
}
 
cs

1. Ani 클래스로 cages[ ] 라는 배열을 만들어 Ani객체에 5개의 공간을 생성해주었다.

   Ani는 puppy와 cat 모두 수용할 수 있는 부모 클래스이므로 cages[ ]에 cat이나 puppy 모두 담을 수 있다.

2. cages[ 0 ] , 첫번째 공간에 고양이 한마리를 집어넣고, cages[ 1 ]에도 고양이, 나머지는 강아지를 담아주었다.

3. 이후 cages[ 0 ]과 cages[ 3 ]을 보면 고양이와 강아지가 각각 담겨있는걸 볼 수 있다.

4.  cat, puppy 클래스에서 사운드 메소드가 각각 실행이된다.


 

두번째로, 케이크에 비유하여 상속관계를 만들어 보았다.

 

Cake.class

CheesCake.class

StrawberryCheeseCake.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Cake {
 // 한 파일에는 클래스가 여러개 있더라도 public이 있는건 단 하나다.
    public void eatCake(){
        System.out.println("케잌 먹다.");
    }
}
 
class CheeseCake extends Cake{
    public void eatCheeseCake(){
        System.out.println("치즈 케잌 먹다.");
    }
}
 
class StrawberryCheeseCake extends CheeseCake{
    public void StrawberryCheeseCake(){
        System.out.println("딸기 치즈 케잌 먹다.");
    }
}
cs

 

Cake가 부모 클래스이고, CheeseCake는 Cake의 자식클래스, StrawberryCheeseCake는 CheeseCake의 자식클래스이다. 그렇다면 StrawberryCheeseCake 클래스는 Cake의 손자로고도 말할 수 있다.

 

CakeTest.class

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
public class CakeTest {
    public static void main(String[] args) { 
    // 부모 클래스는 자식 객체를 받을 수 있따.
    // Cake c1 = new CheeseCake();  ( O )
    // Cake c2 = new StrawberryCheeseCake(); ( O )
 
    // CheeseCake c3 = new Cake();   ( X )   
    // 이유: 치즈케이크가 케이크보다 자식이라 못 받음.
 
    // CheeseCake c4 = new StrawberryCheeseCake();  ( O )
 
    // StrawberryCheeseCake c5 = new Cake();  ( X )  
    // 이유 : 스트로베리 치즈케이크는 케이크보다 자식이다.
 
        Cake c1 = new CheeseCake();
        //형변환
        //c1는 형 변환 전 메소드 하나만 사용 가능.
        CheeseCake c11 = (CheeseCake)c1;
        // 형변환을 통해 객체의 자료형을 변경할 수 있고,
        // 그로인해 변수 및 메소드도 다~ 사용할 수 있다.
 
        CheeseCake c4 = new StrawberryCheeseCake();
         Cake c44 = (Cake)c4;
         c44.eatCake(); // 가스라이팅 가능.
    }
}
 
cs

위 코드와 같이 부모 클래스는 자식 클래스를 객체로 둘 수 있다. 그 반대는 불가능하다.

22줄의 코드를 보면, 치즈 케이크인 c4에 딸기치즈케이크를 넣었고, c4를 형변환 시켜주어 케이크에 넣었다.

그리고 출력 결과는 Cake의 메소드가 실행되었다. 어떻게 된 일일까?

Cake c44 = (Cake)c4; 의 코드에 (Cake)라는 형변환을 시켜주었다.

그래서 치즈케이크가 케이크로 변환되었으니, 이런식으로도 이용할 수있으므로 잘 알아두면 좋을 것 같다.

 

반응형

댓글