🐎OverRiding
오버라이딩이란 부모로부터 상속받은 메서드의 기능을
재정의하는 것처럼 보이는 현상을 의미한다
특정 클래스에 extends를 활용하여 부모 클래스를 상속한 경우
해당 클래스는 상속한 부모의 메서드를 사용 가능하게 되는데
이 때 상속받은 메서드의 기능이 아닌 다른 기능을 필요할 때
overriding을 활용하여 상속받은 메서드를 같은 이름으로
원하는 새로운 기능의 메서드를 생성하여 마치 같은 메서드이지만
재정의한 것 처럼 활용할 수 있다.
overriding이 적용되는 방식은 절차적인 접근순서에 의해 적용된다.
// Parent.java
public class Parent {
public void walk() {
System.out.println("let's walk!");
}
}
// IHaveParent.java
public class IHaveParent extends Parent {
public void wait() {
System.out.println("now wait for parent");
}
public void stay() {
System.out.println("and i stay here.");
}
}
// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();
위 예시코드를 보면 Parent 클래스는 walk라는 메드를 가지고 있다.
이러한 경우 IHaveParent 인스턴스에서 walk를 호출하면
가장 먼저 IHaveParent클래스 자기 자신에서 부터 해당 메서드를
탐색하게 된다.
이 후 탐색할 수 없다면 상속된 부모클래스에서 walk 메서드를
탐색하게 되고 있다면 실행하게 된다.
// Parent.java
public class Parent {
public void walk() {
System.out.println("let's walk!");
}
}
// IHaveParent.java
public class IHaveParent extends Parent {
// 자식 요소에도 있는 walk 메서드
public void walk() {
System.out.println("let's walk, alone.");
}
public void wait() {
System.out.println("now wait for parent");
}
public void stay() {
System.out.println("and i stay here.");
}
}
// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();
위는 overriding이 적용된 예시 코드이다.
마찬가지로 특정 메서드를 찾기 위해 메서드를 탐색하고 이 때
"자기 자신이 가진 메서드를 먼저 탐색한다"는 절차적 순서로
호출된 메서드명을 가진 메서드가 부모 뿐만 아니라
자식 클래스에서도 가지고 있다면
자식클래스(자기 자신)에서 우선 탐색 후 실행되어 부모가 가진
메서드가 마치 재정의 되어 실행되는 것처럼 보이는 현상을
overriding이라고 한다.
서술한대로 탐색 순서에 의해 발생되는 현상이지만
JAVA 개발자들은 이를 의도하여 활용하고자
Override 라는 어노테이션이 만들었다.
부모가 상속된 클래스 내부에서 부모가 가진
메서드명으로 다른 기능의 메서드를 만들고
상단에 Override어노테이션을 사용한다면
해당 메서드명이 부모에 존재한다면 정상 실행되지만
해당 메서드명이 존재하지 않는다면 에러를 발생시켜
상속관계를 가진 클래스에서 분명한 의도를 가진
프로그래밍 설계가 가능하도록 활용할 수 있다.
// Parent.java
public class Parent {
public void walk() {
System.out.println("let's walk!");
}
}
// IHaveParent.java
public class IHaveParent extends Parent {
// Override 어노테이션을 활용
@Override
public void walk() {
System.out.println("let's walk, alone.");
}
public void wait() {
System.out.println("now wait for parent");
}
public void stay() {
System.out.println("and i stay here.");
}
}
// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();
✍️마치며...
자바를 공부하며 새로운 프로그래밍 개념에 대해서 알아가며 새삼 프로그래밍 자체가 가진 프로세스, 로직은 얼추 비슷하게 적용되고 있음을 깨닫게 되는 것 같다. 특히나 자바와 (타입스크립트 + JS)는 무척이나 유사한 것 같다... 자바를 공부하며 기존에 다루었던 NestJS와도 많이 닮았다는 생각을 했는데 결과적으로는 타입스크립트가 자바를 이해하는데 크게 기여한 것을 느낄 수 있었다. 앞으로도 배워보고 싶은 언어, 프레임워크가 많은 만큼 더 열심히 해야겠다!