오버라이딩(Overriding)이란?
: 상속시에 적용되는 개념 즉, 부모로부터 상속 받은 메소드를 재정의해서 사용하는 것을 말한다.
오버라이딩 규칙
- 메소드명이 동일해야 한다.
- 메소드의 매개변수 갯수, 데이터타입, 순서 및 반환타입이 모두 같아야 한다.
- 부모 메소드의 접근 지정자가 public이거나 protected인 경우에만 오버라이딩이 된다.
- 부모메소드가 default 지정자나 private지정자를 가진 메소드를 오버라이딩 한 경우 자식 고유의 메소드로 처리된다.
오버라이딩의 개념을 예제로 알아보기위해 부모와 자식클래스를 각각 만들어보자.
▲ Parent메소드의 맴버변수와 기본생성자, 인자생성자를 만들자.
▲ 각각의 메소드를 만들면서 접근지정자를 모두 다르게 설정해서 만들었으며, static메소드와 출력용 메소드2개까지 만들었다.
이번에는 자식클래스를 만들자.
▲ Parent에는 없는 자식만이 가지고 있는 즉 확장한 맴버와 메소드 그리고 기본생성자가 아닌 인자생성자를 만들었다.
또한 상속을 받기위해 extends Parent를 추가해야한다. 만약 extends가 없다면 Parent가 아닌 Object를 기본적으로 상속받게 된다.
이번에는 Parent에 있는 메소드를 Child에서 오버라이딩 해보자.
▲ 첫번째 메소드 eat은 부모에도 있는 메소드이다. 하지만 부모에서 접근지정자가 private으로 되어있으므로 자식클래스에서는 보이지 않는다. 따라서 자식에서 만든 eat()메소드는 그냥 새롭게 확장한 메소드인 것이다.
sleep()메소드는 오버라이딩 규칙에 부합한다. 받는 매개변수의 타입은 동일하며 매개변수명만 다르고, 중괄호 내부의 출력문이 변경되었으므로 같은 이름의 메소드가 오버라이딩 된 것이다.
walk메소드는 언뜻봐서는 오버라이딩 같지만 매개변수의 타입이 부모클래스에서는 Date였지만 자식클래스에서는 int형인 것으로 보아 오버라이딩 규칙에 맞지않아 오버라이딩 된 것이 아니며 그냥 새로 확장된 메소드이다.
exercise()는 오버라이딩 규칙에 맞기 때문에 오버라이딩 된 메소드이다.
▲ 출력용 메소드는 부모클래스 것을 오버라이딩하여 사용할 것이고 정적메소드도 하나 추가해보았다.
이제 출력해보자
▲ 호모 지니어스란 인스턴스변수와 메모리의 타입이 동일한 것을 말한다. 위 코드에서는 Child child = new Child()를 말하는 것이다.
▲ 헤테로 지니어스란 인스턴스변수의 타입과 메모리의 타입이 다른 것을 말한다.
위 코드에서는 Parent parent = new Child()를 뜻한다.
위 헤테로 지니어스에서 parent는 parent라는 메모리를 참조하고 있으므로 Child에만 있는 맴버들을 볼 수 없다. 따라서 Child로 형변환을 해야 Child클래스에 있는 맴버들을 사용할 수 있다.
'Java' 카테고리의 다른 글
[Java]Heterogenious(이질화) & Homogenious(동질화) (2) | 2022.03.15 |
---|---|
[Java]InstanceOf (0) | 2022.03.15 |
[Java]Super() - 부모의 기본생성자 (0) | 2022.03.14 |
[Java]상속(Inheritance) (0) | 2022.03.14 |
[Java]String Constructor (0) | 2022.03.14 |