Java

Java <Overloading, Override>

wlals5855 2024. 10. 8. 16:03
오버로딩(Overloading)
한클래스 내에서 같은 이름의 메서드를 여러개 정의하는 것

 

✔️오버로딩의 성립 조건

  • 동일한 메서드 이름
  • 매개변수의 개수 또는 타입의 차이
  • 반환 타입은 관계 없다.

오버로딩의 장점

사용자가 매개변수의 순서를 외우지 안아도 사용가능 (편의성)

오버로딩의 단점

중복적으로 의미 없이 생성하는 경우, 기질적으로 필요한 구현 메서드 찾기에 어려움 (복잡성)

class Calc {
	int a, b;
	int c, d;
	double x, y;
    // 두 정수를 "더하는 메서드"
int add (int a, int b) { return a + b; }

	// ===매개변수의 타입 차이===
	double add(double x, double y) { return x + y; }
	double add(int a, double y) { return a + y; }
	double add(double x, int b) { return x + b; }

	// ===매개변수의 개수 차이===
	int add (int a, int b, int c) { return a + b + c; }
 
}

✅오버로딩 사용 이유

  • 메서드가 수행하는 기본적인 작업이 동일할 때, 같은 이름 사용 가능
    - 코드를 더 명확하고 가독성 있게 작성 가능
  • 코드의 재사용성이 높아짐
  • 컴파일 시 타입 체크를 강화 - 올바른 매개변수 타입을 가진 메서드를 선택

<메서드 출력결과>

public class Overloading01 {
	public static void main(String[] args) {
		Calc calculator = new Calc();
		System.out.println(calculator.add(10, 20)); //30
		
		System.out.println(calculator.add(10.0, 20.5));//30.5
		System.out.println(calculator.add(10, 20.3));//30.3
		System.out.println(calculator.add(10.1, 20));//30.1
		
		System.out.println(calculator.add(10, 20, 30));//60
	}
}

 


✔️오버라이드 (Override)

  • 자식 클래스가 부모 클래스에서 정의된 "메서드"를 자신의 상황에 맞게 "재정의"
     >> 상속 관계에 있는 클래스들 사이에서 사용

✅오버라이딩의 특징

  • 메서드이 시그니처가 일치 >> 부모 클래스에서 정의된 메서드와 동일한 이름, 매개변수 구성을 가져야 함
  • 반환 타입은 같거나 자동 형 변한이 가능한 것이어야함
  • @Override (어노테이션, 주석) : 오버라이딩 된 메서드임을 명시적으로 표시

✅ 오버라이딩 구현 방법

  • 부모 클래스의 상속받은 메서드를 자식 클래스에서 다시 정의
  • 메서드의 이름, 매개변수를 일치, 반환타입은 같거나 자동 형 변환 가능하게 작성
  • 메서드 위에 @Override 어노테이션을 작성

오버라이딩 사용 이유?

다형성 구현 -: 하나의 이름으로 여러 기능을 수행하는 코드 작성

재사용성 확장성 향상 : 기존코드 변경 없이, 새로운 기느응르 추가하거나 변경 가능

// 부모클래스
class AnimalClass {
	void sound() {
		System.out.println("동물이 소리를 냅니다.");
	}
}
// 자식 클래스
class DogClass extends AnimalClass {
	// 어노테이션: 코드에 메타데이터를 제공하는 방법
	
	@Override // : 현재 메서드가 부모 클래스의 메서드를 오버라이딩 한다는 것을 명시
	void sound() {
		System.out.println("개가 멍멍하고 짖습니다.");
	}
}
// 자식 클래스
class CatClass extends AnimalClass {
	@Override
	void sound() {
		System.out.println("고양이가 야옹하고 웁니다.");
	}
}

 

<main클래스>

public class Overriding {
	public static void main(String[] args) {
		
		DogClass dog1 = new DogClass();
		dog1.sound();
		
		CatClass cat1 = new CatClass();
		cat1.sound();
}

부모로 부터 상속받은 속성이나 메서드를 확장하는 개념

: 해당 상태나 동작을 반드시 가지지만 상속받는 클래스 마다 차이를 두고 싶을 때


✔️오버로딩 VS 오버라이딩 공통점

모두 메서드의 이름을 재사용하는 방법 (다형성)

 

✅ 오버로딩

  • 같은 클래스 내에서 같은 이름을 가진 메서드를 여러 개 정의
  • 메서드명이 동일, 매개변수의 타입, 개수, 순서 중 적어도 하나 이상은 달라야 함 
  • 메서드의 동작을 다양한 상황에 맞게 조정

오버라이딩

  • 상속 관계에 있는 클래스에서 사용
  • 메서드의 시그니처(이름, 매개변수, 반환타입)가 같아야 함
  • 메서드의 동작을 변경하거나 확장
  • @Override 어노테이션을 사용 >> 컴파일러에게 전달