본문 바로가기
BackEnd/Java

[Java] 오버라이드, 오버로드

by summer_light 2021. 7. 1.

오버라이드(override)

오버라이드는 상속 관계(부모관계 or 인터페이스)서만 사용가능하다.

상속받은 부모 메소드를 자식 클래스에서 재정의 하여 상황에 맞게 활용하는 것이다.

재정의하는 것이기 때문에 메소드 이름, 리턴타입, 파라미터 등은 동일해야 한다.

오버라이드 하는 메소드 위에 @Override 를 넣어주어 오버라이드 된 메소드임을 표시해준다.

 

※ 오버라이드 시 주의점

  1. 메소드의 형식은 상속받은 메소드와 동일해야 한다.
  2. 접근제어자는 반드시 부모의 것과 같은 범위거나 더 큰 범위여야 한다.
  3. 재정의된 메소드의 부모 메소드는 자식의 것에서는 은닉(Hide)되어지기 때문에,
    직접적으로는 더이상 호출되지 않는다.
  4. 은닉 된 부모 메소드를 호출할 때super라는 부모 객체를 호출하는 키워드를 통해 호출한다. 
package jun08_inher;

class OldMan{
	String name;
	String ssn;
	
	public OldMan(String name, String ssn) {
		this.name = name;
		this.ssn = ssn;
	}
	
	public void myInfo() {
		System.out.println("이름은 " + name + "입니다.");
		System.out.println("주민번호는 " + ssn + "입니다.");
	}
	
}

class NewMan extends OldMan{
	String tel;
	
	public NewMan(String name, String ssn, String tel) {
		super(name, ssn); //부모의 생성자 활용
		this.tel = tel;
	}
	
	@Override
	public void myInfo() {
		//super.myInfo(); 부모의 myinfo메소드 활용 가능
		System.out.println("내 이름은 " + name + "입니다.");
		System.out.println("내 생년월일은 " + ssn.substring(0, 6) + "입니다.");
		System.out.println("내 전화번호는 " + tel + "입니다.");
	}
	
}


public class Inher03 {
	public static void main(String[] args) {

		OldMan o01 = new OldMan("홍길동", "123456-7894562");
		o01.myInfo();
		NewMan n01 = new NewMan("김길동", "123456-7894562", "010-5255-9001");
		n01.myInfo();
		
	}
}

출력결과

이름은 홍길동입니다.
주민번호는 123456-7894562입니다.
내 이름은 김길동입니다.
내 생년월일은 123456입니다.
내 전화번호는 010-5255-9001입니다.

 

 

 

오버로드(overload)

한 클래스 내에서 같은 이름의 메소드를 여러개 만드는 기술을 말한다.

같은 이름의 메소드가 있으면 안 되지만, 파라미터가 다르다면 같은 메소드명을 허용한다.

파라미터의 갯수, 순서, 타입이 다르면 다른 메소드로 취급된다. 이 갯수, 순서, 타입을 '메소드 시그니쳐'라고 한다.

메소드를 호출할 때도 이렇게 메소드 시그니쳐로 구분하기 때문에 메소드 이름과 시그니쳐까지 같다면,

같은 메소드로 인식하여 에러가 발생한다.

 

같은 이름의 메소드를 시그니쳐만 다르게 해서 정의하는 것을 오버로드 또는 오버로딩 이라고 한다. 

아래의 예1, 예2, 예3의 메소드는 같은 메소드 이름(plus)을 갖지만, 메소드 시그니쳐가 다르기 때문에 메소드 오버로드의 예라고 할 수 있다.

EX1

	public void plus(int a, int b) {
		System.out.println();
	}

 

EX2

	public void plus(int a, int b, double c) {
		
	}

EX3

	public void plus(double a, byte b) {
		
	}

 

'BackEnd > Java' 카테고리의 다른 글

[Java] 접근제어자 Access Modifier  (0) 2021.07.01
[Java] 스태틱 Static  (0) 2021.07.01
[Java] 객체지향프로그래밍 OOP*  (0) 2021.07.01
[Java] 동적가변배열 Dynamic Array  (0) 2021.07.01
[Java] 날짜 형식 Date Format  (0) 2021.07.01

댓글