본문 바로가기
JAVA

[JAVA(자바)] 메소드 오버라이딩 (feat. 오버로딩)

by 초이사 2023. 1. 18.

메소드 오버라이딩(메소드 재정의)

  • 상속받은 부모 클래스의 메소드를 자식클래스에서 재정의해서 사용하는 것
  • 오버라이딩되면 부모 클래스의 메소드는 무시되고, 자식 클래스의 메소드만 실행된다. (=동적 바인딩이라고도 한다.)

 

 

메소드 오버라이딩 작성

  • 부모 메소드의 이름, 리턴타입, 매개변수가 동일해야 한다.
  • 접근을 막는 범위를 더 작게 변경할 수 없다. ex) publc -> private 변경 못함
  • static, private, final로 선언된 메소드는 오버라이딩 할 수 없다.
  • 부모 메소드에 없는 예외를 throw할 수 없다.

@Override

- 컴파일시에 오버라이딩 제대로 되었는 지 확인하라는 의미이다.

- 잘못 되었다면 컴파일 에러 출력하는 어노테이션

- 생략가능

class Red {
	public void print(){
    	System.out.println("Red");
    }
}

class Green extends Red{
	@Override //오버라이딩 제대로 되었는지 컴파일시 확인하라는 표시
	public void print(){
    	System.out.println("Green");
    }
}

class Yellow extends Green{
	@Override //오버라이딩 제대로 되었는지 컴파일시 확인하라는 표시
	public void print(){
    	System.out.println("Yellow");
    }
}

public class Solution {
	public static void main(String[] args){
		
		Red red = new Red(); //Red 객체 생성
		red.print(); //Red에 오버라이딩된 print() 실행
		
		Green green = new Green(); //Green 객체 생성
		green.print(); //Green에 오버라이딩된 print() 실행
		
		Yellow yellow = new Yellow(); //Yellow 객체 생성
		yellow.print(); //Yellow에 오버라이딩된 print() 실행
		
	}
}

//결과
//Red
//Green
//Yellow

 

메소드 오버라이딩을 하면 부모 메소드를 무시하는 것과 같다. -> 부모 메소드에 있던 내용을 자식 메소드에도 작성해주어야 한다.

 

 

동적 바인딩에 의해 생기는 이 문제를 해결하기 위해 super를 사용한다.

super 키워드를 이용해서 정적 바인딩을 통해 부모 클래스에 접근할 수 있다.

class Green {
	public void print(){
    	System.out.println("Green");
    }
}

class Yellow extends Green{
	public String color = "green";
	@Override
	public void print(){
		if(color.equals("yellow"))
			System.out.println("Yellow");
		else
			super.print();
    }
}

public class Solution {
	public static void main(String[] args){
		
		Yellow yellow = new Yellow(); //Yellow 객체 생성
		yellow.print(); //color="green" -> 부모메소드 실행
		
		yellow.color="yellow";
		yellow.print(); //color="yellow" -> 자식메소드 실행
		
		yellow.color="green";
		yellow.print(); //color="green" -> 부모메소드 실행
		
	}
}
//결과
//Green
//Yellow
//Green

 

이런 메소드 오버라이딩이 자바에서 사용되는 이유는 자바의 다형성 때문이다.

자바의 다형성

- 객체 사용 방법(동일한 메소드 사용)은 동일하지만 다양한 결과가 나오는 것

 

 

 

메소드 오버라이딩과 메소드 오버로딩

  • 오버라이딩: 상속받은 메소드를 재정의하는 것
  • 오버로딩: 새로운 메소드를 정의하는 것

오버라이딩은 기존의 메소드 재정의 -> 기존 메소드의 이름, 리턴타입, 매개변수가 같아야함

오버로딩은 새로운 메소드 정의 -> 기존 메소드의 이름은 같되, 리턴타입이나 매개변수가 달라야 한다.

 

 

댓글