Notice
Recent Posts
Recent Comments
Link
개발 무지렁이
[Java] 상속관계와 Polymophism, 오버라이딩(Overriding) 본문
상속
생성자(Constructor)와 private 요소를 제외한 부모 클래스의 모든 것을 상속받는다.
Why
확장은 용이하고,
재사용성이 높아지고,
코드가 간결해진다.
📌 class A extends B
= A is B
= (1) A를 A라 부를 수 있다.
= (2) A를 B라 부를 수 있다.
(단, 부르는 호칭에 따라 접근에 제한이 생긴다.)
⚠️ Java의 모든 class는 Object(Java 최고조상)를 상속받는다.
= 모든 객체를 Object라 부를 수 있다.
📌 Polymophism(다형성)
B b = new A();
(상속관계에서, 의미적으로* 부모가 자식보다 크다.)
상속과 Polymophism
[멤버필드를 이용한 다형성.java]
class Car {
public String carname;
public int cost;
protected void printAttributes() {
System.out.println("carname: " + carname + "\tcost: " + cost);
}
}
class EfSonata extends Car {
EfSonata() {
this.carname = "EfSonata";
this.cost = 2500;
}
}
class Excel extends Car {
Excel() {
this.carname = "Excel";
this.cost = 1000;
}
}
class Carnival extends Car {
Carnival() {
this.carname = "Carnival";
this.cost = 4000;
}
}
public class InheritanceExam {
public static void main(String[] args) {
Car car = new Car();
EfSonata ef = new EfSonata();
Excel ex = new Excel();
Carnival ca = new Carnival();
// Polymophism, 멤버필드를 이용한 다형성
car.printAttributes(); // carname: null cost: 0
ef.printAttributes(); // carname: EfSonata cost: 2500
ex.printAttributes(); // carname: Excel cost: 1000
ca.printAttributes(); // carname: Carnival cost: 4000
}
}
[매개변수를 이용한 다형성.java]
class Car {
public String carname;
public int cost;
Car(String carname, int cost) {
this.carname = carname;
this.cost = cost;
}
protected void printAttributes() {
System.out.println("carname: " + carname + "\tcost: " + cost);
}
}
class EfSonata extends Car {
EfSonata() {
super("EfSonata", 2500);
}
}
class Excel extends Car {
Excel() {
super("Excel", 1000);
}
}
class Carnival extends Car {
Carnival() {
super("Carnival", 4000);
}
}
public class InheritanceExam {
public static void main(String[] args) {
Car car = new Car(null, 0);
EfSonata ef = new EfSonata();
Excel ex = new Excel();
Carnival ca = new Carnival();
// Polymophism, 멤버필드를 이용한 다형성
car.printAttributes(); // carname: null cost: 0
ef.printAttributes(); // carname: EfSonata cost: 2500
ex.printAttributes(); // carname: Excel cost: 1000
ca.printAttributes(); // carname: Carnival cost: 4000
}
}
오버라이딩(Overriding)
상속관계에서 부모 클래스에 정의되어 있는 method를 자식클래스에서 재정의 한 것.
⚠️ Access modifier는 반드시 부모클래스의 Access modifier보다 크거나 같아야한다.
자식클래스가 생성될 때, 부모클래스의 기본생성자가 먼저 호출된다.
❓ 만약에 부모의 기본생성자가 없다면
: 부모클래스에서 인수가 있는 생성자를 작성해서,
부모의 기본생성자가 없다면, 자식생성자 구현부 첫줄에서 에러난다.
: 부모클래스에서 인수가 있는 생성자를 작성해서,
부모의 기본생성자가 없다면, 자식생성자 구현부 첫줄에서 에러난다.
📖 해결방법
: 부모클래스에서 인수가 있는 생성자를 작성하고 싶다면,
먼저 기본생성자를 작성한다음 오버로딩(Overloading)하는 것을 권장한다.
(아니면 자식생성자에서 super(인수,...)를 호출해라)
❗super란: 상속관계에서 자식안에서 부모를 부를 때 사용하는 키워드이다.
'Backend > 자바' 카테고리의 다른 글
[Java] 기타제한자 static / final / abstract (0) | 2023.04.08 |
---|---|
[Java] Immutable Object(불변객체) String과 StringBuilder (0) | 2023.04.07 |
[Java] 정보은닉과 Getter, Setter (0) | 2023.03.13 |
[Java] GregorianCalender()와 아규먼트 인덱스 (0) | 2023.03.12 |
[Java] 생성자와 오버로딩(Overloading) (0) | 2023.03.12 |
Comments