0920 JSP - 상속
목차
객체
클래스를 구체화(메모리에 올림) 형태
상속
- 프로그래밍에서 상속 의미
=> 이미 정의 되어 있는 객체(속성)를 사용(객체 사이 관계를 맺음) 해서 새로운 객체를 만드는 것.
=> 자식클래스가 부모 클래스의 모든 요소를 사용 가능하게 하는 것, 자식(선택권자) 이 부모를 선택해서 상속을 받는다.
부모 클래스 ( 슈퍼 클래스 -SuperClass) , 상위 클래스
자식 클래스 ( 서브 클래스 -SubClass) , 하위 클래스
[ 상위 객체 ] : 공통 속성을 보유, 속성 간단
[ 하위 객체 ] : 개별 속성을 보유, 속성 복잡


두 클래스 상속 시키기
SubClass (자식) SuperClass (부모)
class SubClass{
}
class SuperClass{
}
class SuperClass{
}
class SubClass extends SuperClass{
}
SubClass 가 부모 class를 extends 했기 때문에 부모 클래스의 기능들을 쓸 수 있다.
상속을 쓰기 위한 전제 조건 (必)
1. 부모 객체가 존재해야 함
2. 부모 객체의 성격(형태)과 유사한 형태를 구현해야 한다.
(아이폰 - 아이폰) o
(아이폰 - 갤럭시) x
예제
//iPhone 13 객체 - 속성 : color, price
class Iphone13{
String color;
int price;
}
//iPhone 14 객체 - 속성 : color, price, tel
class Iphone14 extends Iphone13{
// String color; (공통 속성)
// int price; (공통 속성)
String tel; (특수 속성)
}
Extends를 씀으로써,
String, int를 굳이 쓰지 않아도, 부모로부터 받은 String, int를 이용할 수 있다.
//아이폰 13, 14 객체 생성 - 정보 출력
Iphone13 i13 = new Iphone13();
i13.color = "white";
i13.price = 1;
Iphone14 i14 = new Iphone14();
i14.color = "grey";
i14.price = 2;
i14.tel = "000-0000-0000";
class Parent{
public void pprn() {
System.out.println(" P : pprn() 호출!!! ");
}
}
class Child extends Parent{
public void cprn() {
System.out.println(" C : cprn() 호출!!!");
}
}
child가 parent 객체를 상속함.
Parent p1 = new Parent();
p1.pprn();
Child c1 = new Child();
c1.cprn();
c1.pprn();
Child는 부모의 pprn을 쓸 수 있다. (상속관계 o - 부모의 메서드 호출)
< > 부모는 Child의 cprn을 쓸 수 없다!

접근 지정자 (제어자)
public >> protected >> default (생략) >> private
private : 자신 클래스
생략 : 자신 클래스, 같은 패키지
protected : 자신 클래스, 같은 패키지, 하위 클래스
public : 자신 클래스, 같은 패키지, 하위 클래스, 다른 패키지
protected
상속관계 일 때는 public, 아닐 때는 private
class Point2D{
private int x;
private int y;
}
class Point3D extends Point2D{
//int x;
//int y;
int z;
}
Point2D p2 = new Point2D();
// p2.x = 100;
// p2.y = 200;
Point3D p3 = new Point3D();
p3.x = 100;
p3.y = 200;
p3.z = 300;

[ p r i v a t e ]
사용 불가!
class Point2D{
protected int x;
private int y;
}

[ p r o t e c t e d ]
int x를 protected로 바꿨더니 사용 가능해짐 , 상속한 객체만 쓰게 해 주겠다는 뜻 (접근 불가능했던 객체도 접근 가능하게 만들어줌)
메서드 오버 라이딩vs 메서드 오버 로딩
'상속'
오버 라이딩 - 상속관계에서만 사용 가능 (必)
오버 로딩 - 상속관계가 아니어도 사용 가능
메서드 오버 라이딩
서브 클래스에서 슈퍼 클래스의 메서드를 재 정의하는 것.
(상속이 전제되어 있음)
-> 기존의 부모의 메서드를 같은 형태로 사용하는 것 ( 동작은 다름 )
-> 기존의 메서드명, 전달 인자의 타입, 전달 인자의 개수가 모두 동일
-> 부모의 메서드를 '은닉' 시켜서 항상 재 정의된 메서드가 호출
class Child extends Parent{
@Override
public void pprn() {
System.out.println(" P : pprn() 호출!!!(오버라이딩 함)");
}
public void cprn() {
System.out.println(" C : cprn() 호출!!!");
}
}
부모의 pprn()을 복붙함 => 오버 라이딩

▲ 오버라이드 메시지가 뜸

@ 해당 메서드가 오버 라이딩하고 있다는 걸 알려줌

똑같은 메서드 2개 됐음
1개 - 부모가 준거
1개 - 내가 오버 라이딩한 거
근데 충돌이 안 일어난다.
왜냐면 오버 라이딩 한 메서드가 호출이 되기 때문
=> 기존의 것은 안 쓰고 새로 정의한 것만 쓰기 때문. 하지만 원래 가져온 (부모) 건 안 사라짐!
[ 에러 조건 => 동일 메서드 2개 있을 때 ]
둘 중 하나가 없으면 에러가 안 나므로, (사실 부모의 pprn을 없애지는 않음)
부모의 pprn을 은닉시키고 오버 라이딩 한 pprn을 호출 되게 만들어서 에러를 발생시키지 않게 한다.