[Java] 오버로딩 / 오버라이딩

2023. 1. 31. 16:26기술 창고/Java

728x90
SMALL

오버로딩 (OverLoading)

자바의 클래스 내에서 이미 존재하고 있는 메소드의 이름과 사용하려고 하는 메소드의 이름이 같더라도 매개변수의 개수 또는 타입 / 이름이 다르면 메소드를 새로이 정의해서 사용할 수 있는 기법을 뜻한다.

 

 

오버로딩 조건

앞서 말했던 것처럼 이름은 같아도 되지만, 매개변수의 개수 /  타입  / 이름이 다를 경우에 조건이 성립한다.

단, 리턴 값만을 다르게 할 경우에는 오버로딩을 했다고 볼 수 없다.

 

접근 제어자도 자유롭게 지정가능하다. (public, default, protected, private...)

이 역시 접근 제어자만을 변경했다고 해서 오버로딩을 했다고 볼 수 없다.

 

즉, 위의 조건들과 주의점을 보았을 때 오버로딩은 결국에는 매개변수에 대한 변경점이 있을 경우에 조건이 성립되는 것이다.

 

public class CreateOverloadingMethods {
	public void print() {
		System.out.println("오버로딩1");
	}

	String print(Integer a) {
		System.out.println("오버로딩2");
		return a.toString();
	}

	void print(String a) {
		System.out.println("오버로딩3");
		System.out.println(a);
	}

	String print(Integer a, Integer b) {
		System.out.println("오버로딩4");
		return a.toString() + b.toString();
	}

}



public class OverloadTest{

	public static void main(String[] args){
    	CreateOverloadingMethods colm = new CreateOverloadingMethods();
        
        colm.print(); 
        // 결과 : 
        // 오버로딩1
        
        System.out.println(colm.print(6));
        // 결과 : 
        // 오버로딩2
        // 6
        
        colm.print("테스트");
        // 결과 :
        // 오버로딩3
        // 테스트
        
        System.out.println(colm.print(4, "번 메소드"));
        // 결과 : 
        // 오버로딩4
        // 4번 메소드
    }

}

 

이처럼 오버로딩은 같은 명칭의 메소드를 재정의해서 사용할 수 있다.

이러한 오버로딩을 사용하는 이유는 같은 기능을 하고 여러 반환값을 필요로 할 경우에 하나의 이름으로 묶어서 사용하여 사용하기에 편리하기 때문이다.

 

 


오버라이딩 (Overriding)

부모클래스나 상위 인터페이스에서 상속받아 사용하는 메소드를 자식 클래스에서 재정의하여 사용하는 것을 오버라이딩이라고 한다.

 

 

 

오버라이딩 조건

오버로딩과 다르게 상속받아 사용하는 것이기 때문에 정해진 양식을 위반해서는 안된다.

따라서 메소드 명, 반환타입, 매개변수와 같은 만들어진 양식을 고정된 상태에서 사용한다.

 

public class Footballer{
	public String position(){
    	return "공격수"
    }
}

public class Midfielder extends Footballer{
    @Override
    public String position(){
    	return "미드필더";
    }
}

public class defender extends Footballer{
    @Override
    public String position(){
    	return "수비수";
    }
}


public class Player{
	
    public static void main(String[] args){
    	Footballer footballer = new Footballer();
        Midfielder midfielder = new Midfielder();
        Defender defender = new Defender();
        
        System.out.println(fooballer.position());
        // 결과 :
        // 공격수
        
        System.out.println(midfielder.position());
        // 결과 :
        // 미드필더
        
        System.out.println(defender.position());
        // 결과 :
        // 수비수
        
    }
}

 

위의 코드에서 볼 수 있듯이 Footballer 클래스를 상속받은 클래스 내부에서 position() 메소드를 오버라이딩받았다.

이 때 @Override 라는 어노테이션을 붙여줌으로서 오버라이딩 받은 메소드임을 명시해준다.

 

 

 

오버라이딩 추가 조건

  1. 상속받은 자식 클래스 내에서 오버라이딩한 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다.
  2. 예외(Exception)는 부모 클래스의 메소드보다 많이 선언할 수 없다.
  3. static 메소드를 인스턴스의 메소드 혹은 그 반대로 바꿀 수 없다.
728x90
반응형
LIST