상속 

root 

 |   |

A   B 

 |   |

C   D

형태라면 ? Root r = new A,B,C,D()가능하다. 

A = new C() 가능 

A = new root() 불가능 // 부모가 자식을 만들 순 있지만 제약이 따름.

C = new A,root() 불가능. //자식이 부모를 만들 순 없음.

 

Animal.java
public class Animal {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}
Dog.java
public class Dog extends Animal {
    public void sleep() {
        System.out.println(this.name+" zzz");
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);
        dog.sleep();
    }
}

https://hyeonstorage.tistory.com/186 이거 무조건 봐라 ( 객체 타입 ) 
부모타입 = 자식객체 ( 오버라이딩해서 메소드 씀) 
즉, 자식 메소드 사용, 부모 변수 사용 

 

IS-A 관계

Dog클래스는 Animal클래스를 상속받았다. 즉, Dog는 Animal의 하위 개념이라고 할 수 있겠다. 이런 경우 Dog는 Animal에 포함되기 때문에 "개는 동물이다"라고 표현할 수 있다.

자바는 이러한 관계를 IS-A 관계라고 표현한다. 즉 "Dog is a Animal" 과 같이 말할 수 있는 관계를 IS-A 관계라고 한다

 

Animal dog = new Dog(); //개(설계도)로 만든 객체는 동물 자료형이다

Dog dog = new Animal();  
// 컴파일 오류: 부모 클래스로 만든 객체는 자식 클래스의 자료형으로 사용할 수 없다.
// 자식 자료형 X = new 부모클래스(); // 부모(설계도)로 자식의 자료형을 만들 수 없다. 
//
Animal dog = new Dog();
// 부모 자료형으로 만든 개는 개의 설계도로 만들었다. 

즉, 부모 자료형으로 dog1을 만들지만, 자식 설계도이다. 그래서 자식만 가지고 있는 sleep을 쓰면 컴파일 에러가 난다. 이때 형변환을 해주면 쓸 수 있다. 

 

 

즉, 부모 타입 A = new 자식 , 부모() 만 가능하다. 

Root r = new 1,2,3,4() 된다. 로 외우자. 

상속의 완전한 이해 완료.. 

하지만, 아직 멤버객체에 대한 이해 필요.

 

 

객체변수(인스턴스 및 클래스 변수)는 오버라이딩 되지 않는가? 네, 객체 타입을 따라갑니다. 

https://kldp.org/comment/512939#comment-512939

재밌는 코드 공유 

 

java 클래스 상속시 멤버 변수를 오버라이드 | KLDP

아래와 같이 3개의 클래스를 만든 후 Main 클래스의 main 함수를 호출하면, 기대한 대로 동작을 하지 않네요. 뭔가 제가 잘못 이해하고 있었는지도 모르지만... 기대값은 this is b인데 결과는 this is a이네요. 그냥 상속을 하더라도 부모 클래스의 메소드이니 해당 클래스의 멤버 변수가 참조된다.. 라고 외워버려도 되긴 하겠지만 정확한 설명을 할 수 있으신 분의 도움을 부탁드립니다. public class A { String a = "thi

kldp.org

인스턴스 변수는 heap에 생긴다. 

일단은 부모의 변수는 오버라이딩 되지않고 부모의 것을 취한다라고 이해했다. 
http://superjang.com/archives/3095 나름 잘 설명했다. 

 

public class jungwon {
   static class A 
   {
      int d = 1; 
      int method() {
         return 3;
      }
   }
   static class B extends A 
   {
      int d = 2;
      int method() {
         return 3;
      }
   }
   static class C extends B 
   {
      int d = 3;
      int method() {
         return 3;
      }
   }   
   public static void main(String[] args) {
      A a = new C(); 
      B b = new C();
      C c = new C();
      System.out.println(a.method() + b.method() + c.method());
      System.out.println(a.d + b.d + c.d);
   }
}

정답은: 9 , 6이다. 
// 변수는 참조타입을 따른다. 

+ Recent posts