본문 바로가기
Java+Spring 박살내기

오버라이딩과 오버로딩

by 창브로 2024. 5. 10.
728x90

객체 지향의 4가지 특징 중 하나인 다형성과 관련있는 오버라이딩과 오버로딩에 대해 알아보자.

 

오버라이딩과 오버로딩은 이름이 비슷해 많이 헷갈릴 수 있는 것 중 하나의 개념이다.

둘에 대해서 정리해 보자.

 

먼저 오버로딩에 대해 알아보자.

 

오버로딩이란 같은 이름을 가진 메서드나 생성자를 여러 개 정의하는 것을 의미한다.

이름은 같지만 매개변수의 타입, 순서 또는 개수가 다를 때 사용된다.

 

전 포스팅에서 알아봤던 컴파일 시점에 어떤 메서드가 호출될지 결정된다.

컴파일러가 메서드나 생성자를 호출할 때 전달된 인자의 데이터 타입 및 개수를 파악하여 구분한다.

https://changbroblog.tistory.com/81

 

컴파일 시점과 런타임 시점

일단 프로그래밍이 어떻게 돌아가는지 알아보자. 크게 컴파일 시점과 런타임 시점으로 나뉜다. 💡 컴파일 시점컴파일 환경이란 우리가 코드를 작성하고 컴파일러에 의해 컴파일 되는 시점을

changbroblog.tistory.com

 

이제 오버로딩의 예시를 한 번 보자.

여기 계산하는 Calculator 클래스가 있다.

 

public class Calculator {
    // 오버로딩 int, int
    public int add(int a, int b) {
        return a + b;
    }
	
    // 오버로딩 double, int
    public double add(double a, int b) {
        return a + b;
    }

	// 오버로딩 double, double
    public double add(double a, double b) {
        return a + b;
    }
}

 

 

위 코드에서 오버로딩이 일어나고 있다.

add 메서드는 각각 다른 타입의 매개변수와 다른 리턴값을 가지고 있지만 메서드 이름은 같은 걸 볼 수 있다.

그럼 이걸 어떻게 사용하는지 알아보자.

 

Calculator calculator = new Calculator();

calculator.add(1, 1); // int int
calculator.add(1.5, 1); // double int
calculator.add(1.5, 1.5); // double double

 

그냥 똑같이 사용하고 매개변수만 다르게 입력해 주면

컴파일 시점에 알아서 어떤 메서드를 호출해야 하는지 정해준다.

 

이제 오버라이딩에 대해 알아보자.

 

오버라이딩이란 상위 클래스에서 정의된 메서드를 상속받은 하위 클래스가 재정의 하는 것을 말한다.

하지만 오버로딩이랑 다르게 매개변수 타입, 개수 및 반환타입은 동일하게 사용해야한다.

아래 예시를 보자.

 

class Car {
	// 차가 경적을 울릴 때
	public void soundHorn() {
    	System.out.println("빵빵");
    }
}

// Car를 상속받는 마세라티
class Maserati {
	// soundHorn 메서드 오버라이딩
	@Override
    public void soundHorn() {
    	System.out.println("빠~~~~~~아앙");
    }
}

Car myCar = new Maserati();
myCar.soundHorn(); // 빠~~~~~~아앙

 

위 예시는 Car 클래스(상위 클래스)를 상속받는 Maserati 클래스(하위 클래스)가

soundHorn이라는 메서드를 오버라이딩하여 사용하고 있는 경우이다.

 

오버라이딩을 사용할때 @Override 어노테이션을 꼭 사용해야 한다!

'Java+Spring 박살내기' 카테고리의 다른 글

통합 테스트와 단위 테스트  (0) 2024.07.08
N+1 원인과 해결 방법  (0) 2024.07.04
JPA에서 Lazy Loading 과 Eager Loading  (0) 2024.07.04
Swagger, Springdocs  (0) 2024.05.20
컴파일 시점과 런타임 시점  (0) 2024.05.09