상속, 재정의, 다형성,동적바인딩

이소연's avatar
Aug 04, 2024
상속, 재정의, 다형성,동적바인딩
원래 이렇게 적어야 하지만 extend는 저런 뜻
notion image
notion image
notion image
notion image
Shape가 먼저 시행됨
super쓰임 아는 예제
-이게 무슨 말이야?-v
 
f8,f7 디버깅~코드가 어떻게 진행되는지 해보기
package ex06; class Shape{ int x,y; public Shape(){ System.out.println("Shape 생성됨"); } } class Circle extends Shape{ int radius; // 반지름 public Circle(int radius) { System.out.println("Circle 생성됨"); this.radius = radius; System.out.println("1"); super.x = 1; super.y = 2; } double getArea(){ return 3.14 * radius * radius; } } public class CircleTest { public static void main(String[] args) { Circle circle = new Circle(10); circle.getArea(); // 이거 출력하면 314.0 나옴 } } 결과값으로는 S 생성 > C생성 > 1 나옴 // 그 다음 if sout했다면, getArea출력값 나옴.
package ex06; class Shape { int x, y; public Shape() { System.out.println("Shape 생성됨"); } } class Circle extends Shape { int radius; // 반지름 public Circle(int radius) { System.out.println("Circle 생성됨"); this.radius = radius; System.out.println("1"); super.x = 1; super.y = 2; } double getArea() { return 3.14 * radius * radius; } } public class CircleTest { public static void main(String[] args) { Circle a = new Circle(10); //커스텀 자료형(Circle) 변수(a) = heap에 Circle을 띄운다.쓰기위해 System.out.println(a.getArea()); //그래서 circle의 getArea을 쓴다. } }

재정의

부모의 매서드를 내가 만들어 가려버리는 것.
notion image
notion image
notion image
 

다형성

다형성 CAT, Animal 중 고를 수 있음(포인터를 어디에 두는 것인지 결정.)
(그렇지만 캣을 하면 나중에 고칠 때도 동물 하나하나 소리 지정해줘야 하니까 내가 편할려고 animal로 적어놓으면 나중에 추가할 때도 animal로 수정하면 되서 편함.)
notion image
notion image
 
부모가 들고 이 쓰는 것 자식이 재정의(멍멍→ 야옹)하면 catspeak하면 야옹
new cat을 하면, animal, cat 둘 다 뜸
(상속해서 → 포인터로 cat인지, animal을 고를 수 있음~다형성).
(다양한 이름 가지는 것~다형성)
부모의 speak를 보니 자식이 가지고 있어 부모 자신의 것을 무효화시킴.(오버라이드)
자식의 것이 실행되는 것.(동적바인딩)
 
타입 일치시켜서 동적 바인딩 하려고 상속을 함-v

재정의의 목적

추상화?
 
오버로딩으로는 보니까 한계가 있음-v
 

객체지향

💡
상태는 행위를 통해 변경
💡
오브젝트를 추상화시켜 만든다. 상속해서 만든다.→ 모두가 부모를 바라보게 → 그러면 프로그램이 유지/보수가 easy
 
package ex06.example5; class 왕{ public void 심문(){ System.out.println("왕은 심문한다"); } } class 모자장수{ public void 대답(){ System.out.println("모자장수는 대답한다"); } } class 왕비{ public void 심문(){ System.out.println("왕비는 심문한다"); } } class 토끼{ public void 대답(){ System.out.println("토끼는 대답한다"); } } public class AliceApp { public static void main(String[] args) { 왕비 u1 = new 왕비(); 토끼 u2 = new 토끼(); u1.심문(); u2.대답(); } }
추상화시킴(나중에 추가/수정할 때 편함)
package ex06.example5; class 판사{ public void 심문(){} } class 증인{ public void 대답(){} } classextends 판사{ public void 심문(){ System.out.println("왕은 심문한다"); } } class 모자장수 extends 증인{ public void 대답(){ System.out.println("모자장수는 대답한다"); } } class 왕비 extends 판사{ public void 심문(){ System.out.println("왕비는 심문한다"); } } class 토끼 extends 증인{ public void 대답(){ System.out.println("토끼는 대답한다"); } } public class AliceApp { public static void main(String[] args) { 판사 u1 = new 왕비(); // in memory [판사, 왕비] 증인 u2 = new 토끼(); // in memory [증인, 토끼] u1.심문(); u2.대답(); } }
 
타겟해서 동적바인딩 하려고. 무효화해서 자식껄쓸려고
notion image
 
새로운 증인 추가
재정의 안되서 오버라이드 안되서 동적바인딩도 안함.
package ex06.example5; class 판사{ public void 심문(){} } class 증인{ public void 대답(){} } class 왕(오브젝트) extends 판사{ public void 심문(){ System.out.println("왕은 심문한다"); } } class 모자장수(오브젝트) extends 증인{ public void 대답(){ System.out.println("모자장수는 대답한다"); } } class 왕비(오브젝트) extends 판사{ public void 심문(){ System.out.println("왕비는 심문한다"); } } class 토끼(오브젝트) extends 증인{ public void 대답(){ System.out.println("토끼는 대답한다"); } } class 엘리스(오브젝트) extends 증인{ public void 대답하다(){ System.out.println("엘리스는 대답한다"); } } public class AliceApp { public static void main(String[] args) { 판사 u1 = new 왕비(); // in memory [판사, 왕비] 증인 u2 = new 엘리스(); // in memory [증인, 엘리스] u1.심문(); u2.대답(); } }
이런 경우 class 증인{ public void 대답(){} } 다시 잘 만들어야 한다.
notion image
💡
추상클래스는 오브젝트가 아님 ⇒ new할 수 없음. 존재 할 수 없음.
→ 상속을 해서 구체적인 애를 띄울 때 같이 뜸.
→ 독립적으로 뜨게 할 수는 없다.
notion image
 
동적바인딩 되어 대답, 심문만 사용 가능
notion image
notion image
notion image
Share article

Coding's note