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

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

by 환풍 2023. 7. 13.
728x90

 

 

Me 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
package core.obj2;
 
public class Me extends Father {
 
    @Override
    public void eat() {
        System.out.println("Me eat");
    }
    public void meWork() {
        System.out.println("meWork");
    }
}
 
cs

 

Father 클래스

1
2
3
4
5
6
7
8
9
10
public class Father extends GrandFather{
    
    @Override
    public void sleep() {
        System.out.println("Father Sleep");
    }
    public void fatherWork() {
        System.out.println("fatherWork");
    }
}
cs

 

GrandFather 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package core.obj2;
 
public class GrandFather {
    
    public void sleep() {
        System.out.println("GrandFather Sleep");
    }
    public void eat() {
        System.out.println("GrandFather eat");
        System.out.println("GrandFather eat");
        System.out.println("GrandFather eat");
    }
    public void grandFatherWork() {
        System.out.println("grandFatherWork");
    }
}
 
cs

 

FamilyWork 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package core.obj2;
 
public class FamilyWork {
 
    public static void main(String[] args) {
        
        Me me = new Me(); // Me( Father(  GrandFather( object() )  )  ) 
        
        //me.sleep(); // 나한테 sleep이 있으면 내껄부름, 없으면 아빠, 할배 순으로 찾음.
        
        GrandFather gf = new Father(); //is-a 관계, 아빠는 할아버지까지 확장한것.
        // Father( GrandFather ( obejct() ) )
                
        //gf.grandFatherWork(); 됨
        //gf.fatherWork() 안됌
        gf.sleep(); // 멤버 은폐 현상이 발생된다. 나한테도 있지만 후손에게도 확장되어있다.
        // 따라서 내것(할배)이 호출되어야하지만, 후손(파덜)의 메소드를 부르는 것이다.
        
        me.eat(); // 할배의 eat을 나에게 오버라이딩했다.
        //나한테 eat이 있고 선조(할배)에게 eat이 있으면 내것이 실행된다.
    }
}
 
cs

 


 


FamilyWork 

main 메소드가 있는 FamilyWork 클래스에서 Me 객체를 생성해, sleep 메소드를 호출해보았다.

 

 

Me

하지만 보다시피 Me 클래스에는 sleep 메소드가 없다. 그렇다면 호출이 안되는 것일까?

위 사진을 보면 extends Father이라고 해서 Father의 상속을 받고있는 것을 확인할 수 있다.

그렇다면 Me 클래스는 Father의 클래스 안에 있는 것도 사용할 수 있게 되는 것이다.

 

Father

Father에는 sleep() 메소드가 존재한다. 따라서 콘솔창에 출력 값으로 Father Sleep이 출력될 것이다.

 


FamilyWork Class

GrandFather 클래스 타입의 참조 변수인 gf를 Father 객체로 초기화 하는 것이다.

Father Class

따라서 바로 Father 클래스에 fatherWork 메소드가 있다하더라도 사용할 수 없다.

위 그림을 보면 GrandFather의 변수 gf는 GrandFather 를 가르킨다.

따라서 Object 메서드와 GrandFather 메서드까지 제공된다.

FamilyWork Class

gf 변수 뒤에 . 을 찍고 확인해보면, 모든 메소드들이 Object와 GrandFather로 이루어진 것을 확인할 수 있다.

 

GrandFather Class

따라서 이 코드는 GrandFather 클래스에서 grandFatherWork() 메소드를 출력하는 것이다.


 

FamilyWork Class

 

 

GrandFather 클래스, Father 클래스

gf.sleep() 을 받아줄 수 있는 메소드가 GrandFather 클래스에 있지만, Father 클래스에도 있다.

이 경우 더 확장된 메소드를 사용한다. 이를 오버라이드라고도 부른다.

따라서 출력하면 이렇게 나오게 된다.


FamilyWork Class

상속관계는 Me extends Father,  Father extends GrandFather로 구성되어 있다.

따라서 Me 도 GrandFather의 상속을 받는다.

따라서 이 경우에도 오버라이딩으로 인해 Me eat이 출력되는 것이다.

반응형

댓글