<상속>

 

 

- 부모의 모든 것을 물려 받는 것을 말한다.

 

- 다형성이 충족되어야 한다.

 

* 다형성 : 다양한 형을 가지고 있다. / 두가지의 의미로 불릴 수 있다.

 

구체적인 것(object)들을 만들고 나서 동일한 속성을 뽑아 부모(추상적인 class)를 만들어야 한다.

 

ex) 나 = 사람 (사람은 부모가 된다.)

기와집 = 집(집은 부모가 된다)

아파트 = 집 (아파트는 기와집의 속성을 가질 수는 없다.)

 

- 박서준은 배우가 있을 수 있지만 한국인이 배우는 아니니까(배우랑 한국인은 다른 트리를 탄다) 부모가 될 수 없다(삭제)

 

 

 

확장

 

 

- 부모 class가 변수를 가지고 있으면 밑 class에도 값이 다 뜬다.

내가 찾는 그 시점부터 위로 쭉 스캔한다.(extends)

 

ex) new 박서준 : 한국인, 아시아인 , 사람 값이 뜬다.

new 한국인 : 아시아인 사람값이 뜬다.

 

- 박서준만 object이다. (실제 존재할 수 있으니까) 

 

 

* 다형성 : 위 클래스 값을 다 띄우고 싶다 ( = new 박서준)

 

한국인에 포인트값을 가져다 주고싶다면 아래사진 값( type 값을 한국인으로 한다)

* 포인트를 다른쪽에다 가져다 대도 전체값은 다 떠있다

 

* 다형성

 

 

- 이 경우 메모리에 '박서준'은 없기 때문에 오류!

*System.out.println(b3.num) 오타 -> (b4.num)

 

 

값을 찾으면 더 위로 올라가지 않는다(이미 값을 찾았으니까)

 

 

- 한국인 b2에 박서준값을 넣고 싶다면 다운캐스팅으로 값을 띄울 수 있다.

 

 

 

- Dog -> Dog, Animal 

Cat -> Cat, Animal

Bird -> Bird, Animal 

 

 

 

- Sonata를 가르키고 있지만 extends 해서 확장했기 때문에 Sonata도 void 메서드를 가진다.

 

 

ctrl + space

 

 

- Override : 부모의 메서드를 무효화 시킨다 / 코드가 지워지는게 아니라 실행시에 무시된다.

 

- 동적 바인딩 : 런타임시에 필요한 메서드를 찾아 가는 것 

(실행 후 작동된다.)

 

* 여기있는 super 는 Car꺼임 

 

- 실행하면 Car의 메서드를 무효화 시킴

 

- Car s1 실행시 Sonata Class에 Override 되어 있기 때문에 Car 메서드는 무시되므로 "소나타만의 움직임"이 뜬다. 

 

 

 

메서드 생성

 

 

- a1의 경우 A를 가르키고 A만 띄웠기 때문에 A가 가진 run 값이 뜬다.

b1의 경우 메모리를 C까지 메서드를 띄어놓고 B를 가르켰지만, C에서 윗 값을 무시하는 override를 썼기 때문에 "C 달린다" 라는 값이 뜬다.

a2의 경우도 메모리를 C까지 메서드를 띄운 후, A를 가르켰지만, C에서 override를 썼기 때문에 A의 메서드가 무시되고 B도 같은 run 함수를 사용하고 있기 때문에 B의 메서드도 무시되어 "C 달린다."의 결과값이 나온다.

 

 

- A a1 = new C : 값을 찾을 수 있다.

System.out.println(a1.name); : 오류 / 메서드는 찾을 수 있지만 A값에 name 은 없으니까!

 

 

 

package ch05;

class Animal {
	public String getNAME() {
		return null;
	}
}

class  Dog extends Animal {
	final String NAME = "강아지";
	public String getNAME() {
		return NAME;
	}
}

class Cat extends Animal {
	final String NAME = "고양이";
	public String getNAME() {
		return NAME;
	}
	
}

class Bird extends Animal {
	final String NAME = "새";
	public String getNAME() {
		return NAME;
	}
	
}


public class AnimalEx01 {

	static void attack(Dog u1, Cat u2) {
		System.out.println(u2.NAME + "가 " + u1.NAME + "에게 공격당했습니다.");
	}
	
	static void attack(Dog u1, Bird u2) {
		System.out.println(u2.NAME + "가 " + u1.NAME + "에게 공격당했습니다.");
	}
	
	static void attack(Cat u1, Bird u2) {
		System.out.println(u2.NAME + "가 " + u1.NAME + "에게 공격당했습니다.");
	}
	
	static void attack(Animal u1, Animal u2) {
		System.out.println(u2.getNAME() + "가 " + u1.getNAME() + "에게 공격당했습니다.");
	}
	
	public static void main(String[] args) {
		Dog d1 = new Dog();
		Cat c1 = new Cat();
		Bird b1 = new Bird();
		
		System.out.println(d1.NAME + " 탄생");
		System.out.println(c1.NAME + " 탄생");
		System.out.println(b1.NAME + " 탄생");
		
		//강아지 vs 고양이
		attack(d1, c1);
		
		//강아지 vs 새
		attack(d1, b1);
		
		//고양이 vs 새
		attack(c1, b1);

	}

}

 

 

 

- heap : Anamal, dog 힙 영역에 뜬다.

 

 

 

- u1 : attack이 가지고 있다

 

- ㅁ : main stack 이 가지고 있다.

 

 

 


 

 

 <추상클래스>

 

 

- 추상클래스(abstract class)란 하나 이상의 추상 메소드를 포함하는 클래스이다.

 

선언만 있고 본체는 없는 함수이며, 선언부에 'abstract'라는 키워드를 붙인다.

 

-  추상클래스를 이용해서 자식클래스를 만들 때 추상 클래스에 있는 추상메서드를 꼭 사용하도록 강제성을 부여한다.

 

- 추상클래스는 new로 인스턴스화 할 수 없다. 왜냐면 추상적이기 때문에(object가 아니기 때문에)

 

 

 

 

 

 

- food : 부모 , 추상클래스(object가 아니기 때문에 new 할 수 없다.)

 

- abstract 로 강제성 부여 

 

- abstract void eat(); : 추상메서드로 통로로만 쓰임

 

- 밑 class를 override 해준다.

 

 

- 오류가 난 곳에서 alt + enter 후 맨 첫번째 박스 클릭 

 

 

- 자동으로 생성된다.

 

 

- start 가 실행되면서 food 쪽으로 포인트가 가면서 실행된다.

 

 

- food class가 연결된 라면에서 Override로 무효화 시켰음(오버라이드)

무효화 되었기 때문에 값을 찾아 내려가서 "라면을 먹었습니다" 실행 (동적바인딩)

 

- 함수(eat)를 통해서 변수(name)에 접근가능

 

 

 

openclose