본문 바로가기
Java/Java 예습

[Java] 자바의 객체 Part.2 예습_3

by 박채니 2022. 1. 24.

안녕하세요, 코린이의 코딩 학습기 채니입니다.

Java 객체를 예습했던 내용을 정리한 포스팅입니다.

 

오버라이딩(Overriding)

: 자식 클래스가 상속 받은 부모 메소드를 재작성 하는 것

: 부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미로 자식 객체를 통한 실행 시 후손 것이 우선권을 가짐

 

특징

: 메소드 헤드라인 위에 반드시 Annotation, @Override 표시

: 접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 가능

: 부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정 가능

public >> public (O)

protected >> protected, public (O)

protected >> default (X) 부모 것보다 같거나 넓은 범위로 변경가능 → protected를 물려받고 default로 접근 제어자 변경이 안됨

private >> (X) private 메소드는 오버라이딩, 접근 불가

 

성립 조건

부모 클래스의 메소드와 자식 클래스의 메소드 비교

1) 메소드 이름 동일

2) 매개변수의 개수, 타입, 순서 동일 (변수로 넘어오는 값들, 자료형, 순서)

3) 리턴 타입 동일 (Java 1.5부터는 리턴 타입의 하위 클래스로 변환 가능)

 

// 부모 클래스

package com.kh.p2.over.parent.model.vo;

public class Shop {
	private String owner;	// 가게 주인
	private String address;	// 가게 주소
	
	public Shop() {
		super();
	}
	
	public Shop(String owner, String address) {
		super();
		this.owner = owner;
		this.address = address;
	}
	
	public String getOwner() {
		return owner;
	}
	
	public void setOwne(String owner) {
		this.owner = owner;
	}
	
	public String getAddress() {
		return address;
	}
	
	public void setAddress(String address) {
		this.address = address;
	}
	
	@Override	// 부모클래스가 갖고 있는 메소드 중 toString이라는 메소드가 있는 지 확인
	public String toString() {
		return "주인 : " + owner + ", 주소 : " + address;
	}
}
// 자식 클래스

package com.kh.p2.over.child.model.vo;

public class CoffeeShop {
	private String coffeeName;	// 커피명
	private int price;		// 가격
	private String shopName;	// 가게명
	
	public CoffeeShop() {
		super();
	}
	
	public CoffeeShop(String coffeeName, int price, String shopName) {
		super();
		this.coffeeName = coffeeName;
		this.price = price;
		this.shopName = shopName;
	}
	
	public String getCoffeeName() {
		return coffeeName;
	}
	
	public void setCoffeeName(String coffeeName) {
		this.coffeeName = coffeeName;
	}
	
	public int getPrice() {
		return price;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
	
	public String getShopName() {
		return shopName;
	}
	
	public void setShopName(String shopName) {
		this.shopName = shopName;
	}
	
	@Override
	public String toString() {
		return "커피명 : " + coffeeName + ", 가격 : " + price + ", 가게명 : " + shopName;
	}
}
@run
package com.kh.p2.over.run;

import com.kh.p2.over.child.model.vo.CoffeeShop;
import com.kh.p2.over.parent.model.vo.Shop;

public class Run {

	public static void main(String[] args) {
		Shop sp = new Shop("채니", "서울 송파구");
		System.out.println(sp);
		
		CoffeeShop sc = new CoffeeShop("아이스 아메리카노", 2000, "채니샵");
		System.out.println(sc);
	}
}

@출력값
주인 : 채니, 주소 : 서울 송파구
커피명 : 아이스 아메리카노, 가격 : 2000, 가게명 : 채니샵

오버라이딩을 통해서 출력값을 간단하게 불러올 수 있게 되었다.

 

// 부모클래스

package com.kh.p2.over.child.model.vo;

import com.kh.p2.over.parent.model.vo.Shop;

public class CoffeeShop extends Shop{
	private String coffeeName;	// 커피명
	private int price;			// 가격
	private String shopName;	// 가게명
	
	public CoffeeShop() {
		super();
	}
	
	public CoffeeShop(String coffeeName, int price, String shopName) {
		this.coffeeName = coffeeName;
		this.price = price;
		this.shopName = shopName;
	}
	
	public CoffeeShop(String owner, String address, String coffeeName, int price, String shopName) {
		super(owner, address);
		this.coffeeName = coffeeName;
		this.price = price;
		this.shopName = shopName;
	}
	
	public String getCoffeeName() {
		return coffeeName;
	}
	
	public void setCoffeeName(String coffeeName) {
		this.coffeeName = coffeeName;
	}
	
	public int getPrice() {
		return price;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
	
	public String getShopName() {
		return shopName;
	}
	
	public void setShopName(String shopName) {
		this.shopName = shopName;
	}
	
	@Override
	public String toString() {
		return "커피명 : " + coffeeName + ", 가격 : " + price + ", 가게명 : " + shopName;
	}
	
	@Override
	public void order(String str) {
		System.out.println(str + " " + super.getOwner() + "의 " + shopName + " 가게에서 " + coffeeName + "을 " + price + " 를 주고 주문한다.");
	}
}
// 자식 클래스
package com.kh.p2.over.parent.model.vo;

public class Shop {
	private String owner;	// 가게 주인
	private String address;	// 가게 주소
	
	public Shop() {
		super();
	}
	
	public Shop(String owner, String address) {
		super();
		this.owner = owner;
		this.address = address;
	}
	
	public String getOwner() {
		return owner;
	}
	
	public void setOwne(String owner) {
		this.owner = owner;
	}
	
	public String getAddress() {
		return address;
	}
	
	public void setAddress(String address) {
		this.address = address;
	}
	
	@Override	// 부모클래스가 갖고 있는 메소드 중 toString이라는 메소드가 있는 지 확인
	public String toString() {
		return "주인 : " + owner + ", 주소 : " + address;
	}
	
	public void order(String str) {
		System.out.println(str + address + "에 있는 " + owner + " 가게에서 주문한다.");
	}
	
}
@run
package com.kh.p2.over.run;

import com.kh.p2.over.child.model.vo.CoffeeShop;
import com.kh.p2.over.parent.model.vo.Shop;

public class Run {

	public static void main(String[] args) {
		Shop sp = new Shop("채니", "서울 송파구");
		System.out.println(sp);
		sp.order("부모 메소드 >> ");
		
		CoffeeShop sc = new CoffeeShop("채니", "서울 송파구", "핫초코", 4000, "채니샵");
		sc.order("오버라이딩에 의한 자식 메소드 >>");
		
		
	}
}


@출력값
주인 : 채니, 주소 : 서울 송파구
부모 메소드 >> 서울 송파구에 있는 채니 가게에서 주문한다.
오버라이딩에 의한 자식 메소드 >> 채니의 채니샵 가게에서 핫초코을 4000 를 주고 주문한다.