본문 바로가기
🌈 백엔드/객체 지향

JAVA_객체지향_오버로딩 & 오버라이딩

by 개발자 알마 2023. 6. 18.
반응형

[1] 오버로딩 overloading



(1) 오버로딩 정의

  • 1개의 클래스 내에서 같은 이름의 메서드를 여러개 정의하는것을 말한다 
  • 메서드 이름이 같아도 매개변수가 다르면 구분이 가능하여 여러개를 정의할수 있다 
  • 기존에 없는 새로운 메서드를 정의하는 것 
  • 오버로딩 = 메서드 오버로딩 
  • 하나의 클래스에 같은 이름의 메서드를 여러개 정의하는 것을 말한다. 

(2) 오버로딩 조건 

  • 메서드 이름이 같아야한다
  • 매개변수의 갯수 , 타입이 달라야한다 
  • 반환타입은 상관없다 

(3) 오버로딩 예시 

println()

println(boolean x)

println(char x)

....

//가능하다 
int add( int a,  int b) { return a+b } 
int add( int x,  int y, int z) { return x+y+z } 

// 같은 메서드가 있다고 오류난다 
int add( int a,  int b) { return a+b } 
int add( int a,  int b) { return a*b }
class Parent {	
	void parentMethod() {}
}    

class Child extends Parent {	
	
    @overriding
	void parentMethod() {}
    
    void parentMethod(int i) {}
    
    void childMethod() {}
    
    void childMethod(int i ) {}
}

 

 

 

 

[2] 오버라이딩  overriding


(1) 메서드 재정의 = 오버라이딩 overriding

  • 상위 클래스의 메서드가 하위 클래스에서는 다른 기능으로 사용해야하여 메서드 내용 수정이 필요할때 사용한다
  • 하위 클래스에서 상위클래스의 메서드와 똑같은 이름으로 재정의 할 수 있다
  • 상속받은 메서드의 내용을 변경하는 것 
  • 부모클래스의 메서드를 자식 클래스에서 자신에 맞게 재정의해서 사용하는 것을 말한다. 

 

(2) 오버라이딩 조건 

  • 상위,하위의 메서드 이름, 매개변수, 반환타입이 일치해야한다
  • 접근제어자 제한 public > protected > default > private 
  • 상위 클래스가 protected라면 하위 클래스는 protected 이상의 권한이 있어야한다 
  • 상위 클래스의 메서드보다 예외갯수가 적어야한다 
class 상위클래스 {
	void carInfo() throws IOExceprion, SQLException {...}
}

class 하위클래스 extends 상위클래스 {
	void carInfo() throws IOExceprion {...}
}

 

 

 

(3) 애노테이션 annotation

  • 주석
  • 컴파일러에게 특별한 정보를 제공해주는 역할
종류 설명
@Override 재정의된 메서드 정보를 제공한다
@Fuctionallnterface 함수형 인터페이스 정보를 제공한다
@Deprecated 이후 버전에서 사용되지 않을수 있는 변수나 메서드에 사용된다
@SuppressWarnings 특정 경고가 나타나지 않도록 한다 

(4) 오버라이딩과 메모리 

 

  • 메서드는 주소값을 가리킨다 
  • 메서드는 명령어의 set 이고 프로그램이 로드되면 메서드 영역(코드 영역)에 명령어 set이 위치한다 
  • 해당 메서드가 호출 되면 명령어 set 이 있는 주소를 찾아 명령어가 실행됨
  • 이때 메서드에서 사용하는 변수들은 스택 메모리에 위치 하게됨
  • 따라서 다른 인스턴스라도 같은 메서드의 코드는 같으므로 같은 메서드가 호출됨
  • 인스턴스가 생성되면 변수는 힙 메모리에 따로 생성되지만, 메서드 명령어 set은 처음 한번만 로드 됨

 

 

(5) @overriding 예시 

  • 상위클래스
package 패키지;

public class 상위클래스 {

	protected int customerId;
	protected String customerName;
	protected String coustomerGrade;
	int bonusPoint;
	double bonusRatio; // 적립비율

	public Customer(int customerId, String customerName) {
		this.customerId =customerId;
		this.customerName = customerName;
		
		coustomerGrade ="SILVER";
		bonusRatio = 0.01;
		
	}
	
    //상위 클래스 메서드
	public int calcPrice(int price) {
		bonusPoint += price * bonusRatio;
		return price;
	}
    
    public int getCustomerId() {
		return customerId;
	}

	public void setCustomerId(int customerId) {
		this.customerId = customerId;
	}

	public String getCustomerName() {
		return customerName;
	}

	public void setCustomerName(String customerName) {
		this.customerName = customerName;
	}

	public String getCoustomerGrade() {
		return coustomerGrade;
	}

	public void setCoustomerGrade(String coustomerGrade) {
		this.coustomerGrade = coustomerGrade;
	}

	public String showCustomerInfo() {
		return customerName +"님의 등급은 "+coustomerGrade + " 이고 , 보너스 포인트는 "+bonusPoint +"입니다 ";
	}
	
	
}
  • 하위클래스
package 패키지;

public class 하위클래스 extends 상위클래스 {

	double salesRatio;
	String agentId;
	
	public VIPCustomer(int customerId , String customerName) { 
		super(customerId, customerName);
		
		coustomerGrade ="VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
	}
	
	@Override
	public int calcPrice(int price) {
		bonusPoint += price * bonusRatio;
		price -= (int) (price * salesRatio);
		return price;
	}

	@Override
	public int getCustomerId() {
	
		return super.getCustomerId();
	}

	@Override
	public void setCustomerId(int customerId) {
		
		super.setCustomerId(customerId);
	}

	@Override
	public String getCustomerName() {
		return super.getCustomerName();
	}

	@Override
	public void setCustomerName(String customerName) {
		super.setCustomerName(customerName);
	}

	@Override
	public String getCoustomerGrade() {
		// TODO 자동 생성된 메소드 스텁
		return super.getCoustomerGrade();
	}

	@Override
	public void setCoustomerGrade(String coustomerGrade) {
		// TODO 자동 생성된 메소드 스텁
		super.setCoustomerGrade(coustomerGrade);
	}

	@Override
	public String showCustomerInfo() {
		// TODO 자동 생성된 메소드 스텁
		return super.showCustomerInfo();
	}

	public String getAgentId() {
		return agentId;
	}

	public void setAgentId(String agentId) {
		this.agentId = agentId;
	}	
}

본 실행 클래스 

package ch04;

public class Service {

	public static void main(String[] args) {
		
		
		Customer customerA = new Customer(10010, "이순신 ");
		customerA.bonusPoint=1000;
		int price = customerA.calcPrice(1000);
		System.out.println(customerA.showCustomerInfo()+ price);
		
		
		VIPCustomer customerB = new VIPCustomer(10020, "김유신 ");
		customerB.bonusPoint = 10000;
		price = customerB.calcPrice(1000);
		System.out.println(customerB.showCustomerInfo()+ price);

		Customer vc = new VIPCustomer(12345,"Test"); //가상메서드 방식 
		vc.calcPrice(1000);
		System.out.println(vc.showCustomerInfo()+ price);
	}

}

 

 

예시2 

  • 상위클래스에서 메서드 정의 
public int calcPrice(int price) {
	bonusPoint += price * bonusRatio;
	return price;
}
  • 하위클래스에서 상위클래스의 메서드를 @override 호출하여 재정의한다 
@Override
public int calcPrice(int price) {
	bonusPoint += price * bonusRatio;
	return price - (int)(price * salesRatio);
}

 

 

2차원 프린터를 표현하기 위한 클래스가 있다. 

기본은 2차원 프린터지만 확장하여 3차원 프린터도 추가되었다. 

그렇다면 2차원 프린터에서 사용하는 메서드와 3차원 프린터에서 사용하는 메서드를 똑같이해야 프린터 기능이 동일해질텐데 

이럴때 3차원 프린터를 하위클래스로 설정하여 @overriding 으로 3차원 프린터에 맞게 재정의를 할수 있다 

 

 

class point2D {
	int x, y ; 
    
    String printing() {
    	return x,y;
}

class point3D extends point2D {
	int x,y;
    
    @overriding
    String printing() {
    	return x,y,z
    }
}

 

 

 

반응형

댓글