상속을 위한 두 클래스의 관계
하위 클래스는 상위 클래스의 모든 특성(변수, 메소드)을 지닌다. 상속 관계에 있는 두 대상은 IS-A 관계를 가져야 한다. IS-A관계란 A is a B의 관계로, A는 일종의 B라는 의미를 가진다. 예를 들어 "사과는 일종의 과일이다"처럼 실제 관계를 가진 대상끼리 상속(extends) 해야 한다. 만약 코드 상 지우개라는 클래스가 노트북이라는 클래스에 상속(extends)됐다고 가정해보면, 문법적으로 오류는 없지만 IS-A관계가 성립하지 않으므로 상속을 사용하면 안된다. IS-A 관계는 상속을 위한 일종의 규칙이다.
메소드 오버라이딩
상위 클래스 참조변수(ph2)는 하위 클래스 인스턴스(SmartPhone)을 참조 가능하지만, 하위 클래스의 변수/메소드에 접근할 수 없다.
오버라이딩
오버라이딩은 일종의 가림이다. 부모 클래스의 메소드와 똑같은 메소드(반환형, 메소드의 이름, 매개변수 선언이 똑같은 메소드)를 자식 클래스가 가지고 있으면 오버라이딩 관계에 있다고 한다. 오버라이딩 관계에서, 상위 클래스의 메소드를 "오버라이딩된 메소드", 하위 클래스의 메소드를 "오버라이딩한 메소드"라고 한다. 자바에서 메소드 오버라이딩을 통해 상속받은 부모 클래스의 메소드를 자식 클래스에 직접 재정의 할 수 있다. 오버라이딩했다고 해서 기존 부모 클래스의 메소드가 사라진 것은 아니다.
class Sex{
public void info(){
System.out.println("Sex in the beach");
}
}
class Man extends Sex{
public void info(){
System.out.println("Man in the beach");
}
}
public class Solution {
public static void main(String[] args) {
Sex s= new Man();
Man m= new Man();
s.info();
m.info();
}
}
//출력:
//Man in the beach
//Man in the beach
오버라이딩된 메소드를 인스턴스 외부에서 호출하는 방법은 없다. 그러나 인스턴스 내부에서는 키워드 super를 이용해 호출 가능하다. 내가 상속하고 있는 클래스의 메소드를 호출하겠다. 이런 식으로 부모 클래스를 상속한 자식 클래스 내에서 호출이 가능하다.
인스턴스 변수는 오버라이딩 되지 않는다. 따라서 참조변수의 형에 따라 접근하는 멤버가 결정된다. 이런 코드는 문제가 심각해질 수 있기 때문에 각종 문서에서 추천하지 않는다. 하지만 메소드 오버라이딩은 실무에서 많이 사용하므로 중요하다.
'Programming > Java' 카테고리의 다른 글
JAVA 17(1) 인터페이스 (0) | 2021.08.04 |
---|---|
JAVA 16 상속이 도움 되는 상황 (0) | 2021.08.04 |
JAVA 14 상속 (0) | 2021.08.04 |
JAVA 13 1차원 배열의 이해와 활용 (0) | 2021.08.04 |
JAVA 12 toString 메소드 (0) | 2021.08.04 |