본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

JAVA 문법 - 오버로딩(= 중복정의), 오버라이딩(= 재정의)

by 개발하는 경제학도 2022. 1. 4.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.

교재로는 자바의 정석을 사용하고 있습니다.


 

오버로딩

오버 로딩(overloading, 중복 정의)

1개의 클래스에 포함된 여러 메서드의 관계이다.

같은 이름의 메서드가 여러 개 정의되지만 '매개변수'에 따라서 기능을 다양하게 제공하기 위해서 사용된다.

반드시 메서드 이름은 같고 매개변수는 달라야 한다(매개변수의 개수 또는 타입에서 달라야 한다)

반면, return타입이나 modifier과는 오버 로딩은 무관하다.

 

[오버 로딩 예제 코드]

class ArithMetic {
	int add(int i, int j) {
		return i + j; 
	}

	double add(double i, double j) {
		return i + j;
	}
	
	String add(String i, String j) {
		return i + j;
	}
	
}


public class OverloadingTest {

	public static void main(String[] args) {

		ArithMetic a = new ArithMetic();
		double r1 = a.add(1.1, 2.3);
		String r2 = a.add("자바", "스프링");
		int r3 = a.add(1, 2);
		double r4 = a.add(3.14, 1); // 두 번째 매개변수 1이 자동형변환으로 double 로 변경됨 

		System.out.println(r1); // 3.4
		System.out.println(r2); // 자바스프링
		System.out.println(r3); // 3
		System.out.println(r4); // 컴퓨터의 오차범위 때문에. 4.140000000000001
   }
}

ArithMetic 클래스에서 add()라는 동일한 이름을 가진 메서드를 3개 만들었다. 이 메서드들은 이름은 같지만 매개변수는 int, double, String으로 타입이 서로 달라 오버 로딩이 되었다.

따라서 이를 출력해본다면 r1은 3.4로 double 타입이 반환되었고, 이를 통해 순서로 2번째에 해당되는 add메서드가 실행되었음을 확인할 수 있다.

또한, r2는 "자바스프링"이 출력되었는데, 이를 통해 String 타입을 매개변수로 받았던 3번째 add매서드가 실행되었음을 알 수 있다.

 

 

오버 라이딩

오버 라이딩(overriding, 재정의)

상속관계에 있는 2개 클래스의 관계이다. 

부모로부터 상속받은 메서드의 실행 내용을 상속받는 클래스(= 자식 클래스)에 맞게 변경하는 것이다.

 

특징

- 부모 클래스와 자식 클래스의 이름, 매개변수 리스트, 리턴 타입, modifier 모두 같은 경우, 자식(본인) 클래스의 메서드가 우선한다.

- @Override 어노테이션을 사용하여 컴파일러에게 미리 오버 라이딩을 할 것임을 알려줄 수 있다. 이 어노테이션은 생략해도 무방하다.

 

[오버 라이딩 예제 코드]

// 부모 클래스
class Employee /*extends Object*/{  
	void work() {
		System.out.println("직원입니다");
	}
}

// 자식 클래스
class Manager extends Employee{
	// work기능을 manager에서 재정의(오버라이딩)하면 본인(즉, 자식) 클래스 내 메서드가 우선되어 실행.
	void work() {
		System.out.println("매니저입니다");
	}
}

public class ManangerTest {

	public static void main(String[] args) {
		Manager manager1 = new Manager();
		manager1.work();  // 매니저입니다
        }
}

Employee클래스를 Manager클래스가 extends로 상속받았다. 따라서 Employee는 부모 클래스가, Manager는 자식 클래스가 되는데

부모, 자식 모두 work() 메서드를 가지고 있다.

이 경우 Manager의 인스턴스를 생성하여 manager.work()를 해보면 "매니저입니다"가 출력된다.

 

즉, 부모 클래스에서 상속받은 work메서드가 실행되었다면 "직원입니다"가 출력되었을 테지만

동일한 이름을 가진 메서드를 자식 클래스에서 재정의(= 오버라이딩) 하여 자식클래스 안에 있는 work메서드가 호출되었음을 확인할 수 있다.

 

 

오버 로딩, 오버 라이딩 주의점

오버 라이딩은 상속과 관련된 개념이지만, 오버 로딩은 상속과 무관하다.

 

 

출처: 자바의 정석(남궁 성 저), 멀티캠퍼스

댓글