BackEnd/Java

[Java]상속(Inheritance) 오버라이딩

Hojung7 2024. 7. 31. 06:20

#예제

[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