1. 다형성이란 ?
다형성(Polymorphism) 개념은 객체 지향 프로그래밍에서 중요한 특성 중 하나입니다.
다형성은 추상적이고 포괄적인 개념이라 정확하게 어떤 동작이다라고 딱 떨어지게 표현하기는 어렵습니다.
대신 다형성을 나타내는 여러가지 방식과 방법을 통해서 다형성을 설명할 수는 있습니다.
다형성이란 간단히 말해 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 말합니다.
좀 더 프로그램적으로 말하자면, 하나의 클래스나 함수가 다양한 방식으로 동작할 수 있도록 만드는 것입니다.
실생활 예로 다형성의 가장 유명하고 이해하기 쉬운 예로는 다형성을 붕어빵 틀에 비유하는데,
붕어빵 틀에 재료로 무엇을 담느냐에 따라 팥붕이 되거나 슈붕이 되거나 피붕이 되겠죠.
완벽한 비유라고는 할 수 없지만, 다형성 개념을 쉽게 이해하기엔 적절한 예시라 생각해 적어보았습니다.
객체 지향 언어인 자바에서의 다향성은 객체를 다양한 형태로 사용하고 관리할 수 있게 합니다.
그래서 자바에서 이런 다형성을 구현하기 위해서는 다양한 방식들이 있습니다.
다형적 변수, 오버라이딩, 오버로딩 등이 있는데, 오늘은 오버라이딩에 대해 정리해보았습니다.
2. 오버라이딩(Overriding)이란 ?
우선 Override의 사전적 의미에 대해서 알아보면,
1.(직권을 이용하여 결정 등을) 무시하다 2.~보다 더 우선하다 3. (자동으로 진행되는 과정을) 중단시키다라는 뜻을 가지고 있습니다.
뜻을 봐도 직관적으로 자바에서의 오버라이딩이 무엇이구나라는 감은 오지 않습니다만
무엇이 어떤것을 무시하고 우선하는구나 정도로만 예측할 수 있습니다.
괜히 찾아본 것 같지만 찾아봤으니까 적었습니다..🙄
자바에서의 오버라이딩은 간단하게 말하면,
부모 클래스로부터 상속받은 메소드의 내용을 변경하는 것을 오버라이딩이라고 합니다.
자바에서는 기본의 클래스를 재사용해 새로운 클래스를 작성하는 상속이라는 개념이 있습니다.
상속을 통해서 자바는 프로그램의 생산성을 높이고 유지보수에 편의성을 높입니다.
이렇게 상속받은 메소드를 그대로 사용하는 경우도 있지만,
자식 클래스에 맞게 변경해서 사용하는 경우를 부모 클래스의 메소드를 오버라이딩한다고 표현합니다.
3. 오버라이딩(Overriding)의 조건
오버라이딩은 메소드의 내용만을 새로 자식 클래스에 맞게 변경하는 것이므로
메소드의 선언부는 부모 클래스의 선언부와 완벽하게 일치해야합니다.
좀 더 자세히 일치해야하는 조건에 대해 말하면
- 자식 클래스에서의 오버라이딩하는 메소드는 부모 클래스의 메소드와 이름이 같아야 한다.
- 자식 클래스에서의 오버라이딩하는 메소드는 부모 클래스의 메소드와 매개 변수가 같아야 한다.
- 자식 클래스에서의 오버라이딩하는 메소드는 부모 클래스의 메소드와 반환 타입이 같아야 한다.
추가적인 조건으로는
- 접근 제어자를 부모 클래스의 작은 범위의 접근 제어자로 변경할 수 없다.
: 접근 제어자의 범위 순서는 public > protected > private 입니다.
예로 부모 클래스의 접근 제어자가 public인 경우에 자식 클래스의 접근 제어자는 public만 가능합니다. - Exception은 부모 클래스의 메소드보다 많거나 상위 선언할 수 없다.
: 특히 부모 클래스에선 특정 Exception을 선언하였는데 자식 클래스에서 "Exception"을 선언하는 것을 주의해야합니다. "Exception"은 모든 Exception을 뜻하기 때문입니다. - 부모 클래스의 instance 메소드를 자식 클래스에서 static 메소드로, 부모 클래스의 static 메소드를 자식 클래스에서 instance 메소드로 변경할 수 없습니다. (변환 불가)
4. 오버라이딩된 메소드의 기본 동작
부모 클래스인 RGB를 상속받은 자식 클래스 RGBA는 alpha라는 변수가 추가되었습니다.
그래서 showColor() 메소드에서도 alpha값을 포함한 채로 값을 반환하고자 showColor()를 오버라이딩한 코드입니다.
여기서 중간에 나오는 super()은 이후에 따로 정리 후 업로드할 예정입니다.
부모 클래스 RGB
public class RGB {
prviate int red;
private int green;
private int blue;
public RGB(int red, int green, int blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
public String showColor() {
return red + ", " + green + ", " +blue;
}
}
자식 클래스 RGBA
public class RGBA extends RGB {
private double alpha;
public RGBA(int red, int green, int blue, double alpha) {
super(red, green, blue);
this.alpha = alpha;
}
@Override
public String showColor() { // 오버라이딩된 메소드
return super.showColor() + ", " + alpha;
// return red + ", " + green + ", " + blue + ", " + alpha; 과 같음
}
}
메인 클래스(테스트)
public static void main(String[] args) {
RGB rgb = new RGB(10, 20, 30); // 부모 객체 생성
RGB rgba = new RGBA(50, 60, 70, 0.5); // 자식 객체 생성
System.out.println("rgb.showColor() : " + rgb.showColor());
System.out.println("rgba.showColor() : " + rgba.showColor());
}
결과값
rgb.showColor() : 10, 20, 30
rgb.showColor() : 50, 60, 70, 0.5