본문 바로가기
개발/JAVA

오버로딩 과 오버라이딩

by 욤냠냠냠 2023. 4. 11.

 

🚩 오버로딩( Overloading )?

자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.

오버로딩의 조건

1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

예시

public void println()
public void println(boolean x)
public void println(char x)
public void println(int x) 
public void println(long x)
public void println(float x)
public void println(double x)
public void println(char x[])
public void println(String x)
public void println(Object x)

오버로딩의 대표적인 예시는 우리가 쓰는 println 메서드이다.

우리는 println메서드를 호출할 때 매개변수로 넘어주는 값의 타입을 신경쓰지 않는다. 하지만 값의 타입에 따라서 위의 오버로딩된 메서드들 중 하나가 선택되어 실행된다.

 

// 1. 매개변수의 이름은 다르지만, 타입이 같다면 이 두 메서드는 정확히 같은 것이다. 매개변수 이름만 다를뿐,
      아무런 의미가 없다.
	int add(int a, int b) {
        return a + b;
    }

    int add(int x, int y) {
        return x + y;
    }
    
    실행시 에러 : method add(int,int) is already defined ...
    		   (이미 같은 이름의 메서드가 정의되었다.)
--------------------------------------------------------------------------
// 2. 리턴타입은 오버로딩 구현에 아무런 영향이 없다. 
      리턴타입이 달라도 매개변수의 갯수와 타입이 일치하기 때문에 같은 이름의 메서드를 호출할 시 
      어떤 메서드가 호출될지 알 수 없다.

	int add(int a, int b) {
        return a + b;
    }

    long add(int a, int b) {
        return a + b;
    }
    
    실행시 에러 : method add(int,int) is already defined ...
    		   (이미 같은 이름의 메서드가 정의되었다.)
--------------------------------------------------------------------------
// 3. 두 메서드 int형과 long 매개변수가 하나씩 있는건 같지만, 서로 순서가 다르다.
      이럴경우엔 호출시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 중복된 메서드 정의가
      아닌, 오버로딩으로 간주된다.

	long add(int a, long b) {
        return a + b;
    }

    long add(long a, int b) {
        return a + b;
    }

 

그렇다면 오버로딩을 구현함으로써 장점은 뭐가 있을까?

println 메서드를 보면 여러 메서드들이 모두 같은 기능을 하고 있다. 만약 같은 이름이 아니라면 

printlnBoolean , printlnString...등등 구현할때와 메서드 생성시 모두 각각 다른 이름들을 생각해야 한다. 

그걸 println, 하나의 메서드로 표현할 수 있다.


🚩오버라이딩( Overriding ) ?

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것

자손 클래스가 자신에 맞게 변경해야하는 경우 이럴 때 조상의 오버라이딩을 한다.

오버라이딩의 조건

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와

1. 이름이 같아야 한다.

2. 매개변수가 같아야 한다.

3. 반환타입이 같아야 한다.

 

요약하면 선언부가 같아야 한다.

주의사항

1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.

ex) 조상 클래스의 접근 제어자가 protected 라면 자식 클래스는 protected, public 이어야 한다.

 

2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다,

// 올바른 오버라이딩

class Parent {
	void parentMethod() throws IOException, SQLException {
    ....
    }
}

class Child extends Parent {
	void parentMethod() throws IOException{
    ....
    }
}

--------------------------------------------------------------------
// 잘못된 오버라이딩 : Exception은 모든 예외의 최고 조상이므로 가장 많은 개수의 예외를 던질수 있다.

class Child extends Parent {
	void parentMethod() throws Exception {
    ....
    }
}

3. 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.

 


 

오버로딩은 생성, 오버라이딩은 재정의 

 

 

오버로딩은 이름은 같지만 매개변수의 개수나 타입만 다른 메서드를 생성하는 거고,

         오버라이딩은 이름, 매개변수, 반환 타입이 같은 메서드의 구현부만 재정의 하는 것이다.          

 

 

📌 참고

자바의 정석 교재

'개발 > JAVA' 카테고리의 다른 글

다형성  (0) 2023.04.18
ORM  (0) 2023.03.08
JVM(Java Virtual Machine)?  (4) 2023.03.08