두가지의 예시로 상속에 대해 좀 더 알아보려고 한다.
첫번째로, 동물을 부모클래스로 강아지와 고양이를 예로 들어보았다.
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)라는 형변환을 시켜주었다.
그래서 치즈케이크가 케이크로 변환되었으니, 이런식으로도 이용할 수있으므로 잘 알아두면 좋을 것 같다.
'✨ Java > 상속(Inheritance)' 카테고리의 다른 글
자바(JAVA) - 상속(Inheritance) -3 (0) | 2023.07.13 |
---|---|
자바(JAVA) - toString( )과 Object클래스 (0) | 2023.02.13 |
자바(JAVA) - OverLoding 오버로딩과 Overriding 오버라이딩 (상속) (0) | 2023.02.13 |
자바(JAVA) - 상속(Inheritance) -1 (0) | 2023.02.02 |
댓글