#예제
[Parent]
package dto;
/**
* 부모 역할 클래스
*/
public class Parent extends Object {
protected String lastName = "홍"; // 명시적 초기화
private String address = "서울시 중구 남대문로 120";
private int money = 100_000_000; // _ : 자릿수 구분(해석 X)
private String car = "그랜져";
// 기본 생성자
public Parent() {
System.out.println("부모 - 기본 생성자로 객체 생성");
}
// 매개 변수 생성자(Alt + shift + s -> o)
public Parent(String address, int money, String car) {
this.address = address;
this.money = money;
this.car = car;
System.out.println("부모 - 매개 변수 생성자로 객체 생성");
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String getCar() {
return car;
}
public void setCar(String car) {
this.car = car;
}
/**
* 현재 객체의 필드 값을 하나의 문자열로 반환하는 메서드
* @return
*/
public String inform() {
return String.format("%s / %s / %d / %s",
lastName, address, money, car);
}
/**
* 자기소개 기능
*/
public void introduce() {
System.out.println("저는 Parent 입니다");
}
@Override // 오버라이딩 잘 되었는지 검사
public String toString() {
return String.format("[Parent]%s / %s / %d / %s",
lastName, address, money, car);
}
public final void onlyParent() {
System.out.println("final 메서드 입니다");
}
}
[Child1]
package dto;
public class Child1 extends Parent{
// 필드
private String notebook;
// 기본 생성자
public Child1() {
super();
System.out.println("자식1 - 기본 생성자로 객체 생성");
}
// 매개 변수 생성자
public Child1(String notebook) {
// 부모 매개 변수 생성자 호출하기
super("부산 해운대구", 123456789, "모하비");
this.notebook = notebook;
System.out.println("자식1 - 매개 변수 생성자로 객체 생성");
}
// getter/setter
public String getNotebook() {
return notebook;
}
public void setNotebook(String notebook) {
this.notebook = notebook;
}
/*
* 자식 객체 + 부모 객체에 있는 모든 필드 값 출력
*/
public void print() {
// 부모 필드
// protected 필드는 상속 받은 클래스에서 직접 접근 가능!!
System.out.println("lastName : " + lastName);
// private 필드간접 접근
System.out.println("address : " + getAddress());
System.out.println("money : " + getMoney() );
System.out.println("car : " + getCar() ); // private 필드를 간접 접근
// 자식 필드
System.out.println("notebook : " + notebook);
}
public String childInform() {
// return String.format("%s / %s / %d / %s / %s",
// lastName, getAddress(), getMoney(), getCar(), notebook);
return super. inform() + "/" + notebook;
}
@Override
public void introduce() {
System.out.println("저는 Parent의 자식 Child1 입니다");
}
// Parent에게 상속 받은 toString() 오버라이딩
@Override
public String toString() {
return super.toString() + "/" + notebook;
}
}
[Child2]
package dto;
public class Child2 extends Parent {
@Override
public String toString() {
return "[Child22222]" + super.toString();
}
}
[Child3]
package dto;
public class Child3 extends Parent {
@Override
public String toString() {
return "[Child33333]" + super.toString();
}
}
[Run]
package run;
import dto.Child1;
import dto.Child2;
import dto.Child3;
public class TestRun3 {
public static void main(String[] args) {
// Child 1,2,3 객체 생성
Child1 c1 = new Child1();
Child2 c2 = new Child2();
Child3 c3 = new Child3();
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
}
}
#결과

<Parent를 상속 받은 Child1/2/3가 toString()을 오버라이딩 할 때>
공통적으로 super.toString() 구문을 작성함!
→ Parent의 toString() 하나를 수정했을 뿐인데
Child1/2/3의 toString()이 모두 결과가 수정됨!!
→ 상속 받은 클래스에 대한 공통적인 규약
[상속 장점]
1. 코드 길이 감소
-> 부모 필드/메서드를 자식이 안써도 사용 가능
2. 재사용성 증가
-> super(), super 참조변수를 이용해
자식이 부모코드를 호출해서 자식 코드 길이 감소
3. 공통적인 코드 관리, 유지 보수성 증가
-> 부모의 코드만 수정해도
부모 코드를 활용하던 자식이 코드도 일괄 수정됨
4. 자식에게 상속하는 기능의 이름을 강제할 수 있음
-> 오버라이딩 시 부모의 메서드명과 동일해야 한다!
'BackEnd > Java' 카테고리의 다른 글
| [Java]다형성 (Polymorphism) (0) | 2024.07.31 |
|---|---|
| [Java]상속(Inheritance) final 클래스 (0) | 2024.07.31 |
| [Java]상속(Inheritance) (0) | 2024.07.31 |
| [Java]다형성(Polymorphism) 바인딩 (0) | 2024.07.31 |
| [Java]반환형의 다형성(Polymorphism) (0) | 2024.07.30 |