원래 이렇게 적어야 하지만 extend는 저런 뜻




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을 쓴다.
}
}
재정의
부모의 매서드를 내가 만들어 가려버리는 것.



다형성
다형성 CAT, Animal 중 고를 수 있음(포인터를 어디에 두는 것인지 결정.)
(그렇지만 캣을 하면 나중에 고칠 때도 동물 하나하나 소리 지정해줘야 하니까 내가 편할려고 animal로 적어놓으면 나중에 추가할 때도 animal로 수정하면 되서 편함.)


부모가 들고 이
쓰는 것 자식이 재정의(멍멍→ 야옹)하면 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 대답(){}
}
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.대답();
}
}
타겟해서 동적바인딩 하려고. 무효화해서 자식껄쓸려고

새로운 증인 추가
재정의 안되서 오버라이드 안되서 동적바인딩도 안함.
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 대답(){}
}
다시 잘 만들어야 한다.

추상클래스는 오브젝트가 아님 ⇒ new할 수 없음. 존재 할 수 없음.
→ 상속을 해서 구체적인 애를 띄울 때 같이 뜸.
→ 독립적으로 뜨게 할 수는 없다.

동적바인딩 되어 대답, 심문만 사용 가능



Share article