상속 코드로 한번에 보기
package 상속;
public class Man {
String name;
public void sayName(){
System.out.println(name);
}
public int add(int a, int b){
return a+b;
}
}
class BusinessMan extends Man{
//super 키워드는 부모의 객체를 찾는다.
public String getParentsName(){
return super.name;
}
// Man을 상속받아서 sayName을 호출
public void say2(){
sayName();
}
@Override // Override = 재정의
public void sayName() {
System.out.println("재정의");
}
//Overrode // 과적, 부모의 add도 사용가능, 다른역할을 하는 같은 이름의 메소드
public int add(int a, int b, int c) {
return a+b+c;
}
}
- BusinessMan은 Man을 상속받는다. extends를 이용하여 상속.
- super 키워드는 부모의 객체를 찾는다.
- Override는 부모의 메소드를 재정의한다. ( 자식 객체 생성시 부모메소드는 사용불가능)
- Overrode는 과적의 의미로 부모의 메소드에서 기능을 추가한거나 재정의한다.( 자식 객체 생성시 부모메소드 사용가능)
@Override 어노테이션(Annotations) 사용하는 이유
자바에는 어노테이션(Annotations) 이라는 것이 있다. 이와 관련된 내용은 다음에 정리하도록 하고... 다음과 같은 상황을 보자
사진과 같이 자식클래스인 Child는 OvRide 부모클래스 상속을 받고 있고, add를 Override 하고있다. 문제없이 잘 작동 된다. 만약 여러 메소드가 있으면 이 메소드가 Overriding 된 메소드인지 아닌지 가독성이 떨어진다.
다음과 같이 @Override 어노테이션을 명시하면 여러 메소드들이 존재해도 이 메소드는 부모로 부터 재정의 된 것! 이라는 걸 단번에 알 수 있는 장점이 있다.
또한 Override 특징으로는 메소드명, 매겨변수, 반환형을 같이 써줘야 제대로 Overriding이 된다. 만약 백엔드 단의 대규모 업데이트중 상속 메소드의 변수명을 바꿨다고 가정해보자. 아마도 끔찍하다.. :(
부모의 메소드명은 metho_D인데 자식은 metho_d이다. metho_d는 문제없이 작동한다. 후덜덜....
다음과 같이 @Override를 명시해주면
컴파일을 해보면 메소드에 Override를 명시 해놓았는데 부모메소드에 해당 메소드가 없다고 오류를 반환해준다.
Override할 때 빼먹지 말고 쓰는 것이 좋을 것 같다. 제대로 Override가 수행되었는지, 수많은 코드에서 저 메소드는 Overriding 된 것인지 가독성을 높여주니 적어도 손해보는 일은 없을 것이다.!
instanceof 연산자
instanceof는 참조변수가 참조하는 인스턴스의 '클래스' 나 '상속하는 클래스'를 묻는 연산자 이다.
기본형식 아래와 같이 쓴다.
if( 인스턴스 instanceof 클래스)
인스턴스가 클래스 소속이거나, 인스턴스를 상속하는 클래스 소속인지 확인 한다.
예시를 살펴보자
class People{};
class Boy extends People{}; // boy는 사람을 상속받음
class Girl extends People{}; // girl은 사람을 상속받음
class He extends Boy{}; // He는 Boy를 상속받음
class She extends Girl{}; // She는 Girl을 상속받음
public class instOf {
public static void main(String[] args) {
People people = new He();
if(people instanceof People){
System.out.println("People을 상속하는 인스턴스"); //true
}
if(people instanceof Boy){
System.out.println("Boy를 상속하는 인스턴스"); // true
}
if(people instanceof He){
System.out.println("He 인스턴스"); //true
}
if(people instanceof Girl){
System.out.println("Girl를 상속하는 인스턴스"); //false
}
}
}
people 객체의 People 클래스는 최상위 클래스이다. 그림을 살펴보자
현재 people 인스턴스는 People이 상속하고 있는 He의 인스턴스 소속이다.
그래서 if문의 3절까지는 모두 True이며 출력을 하고,
He와 Girl은 관계가 없기 때문에 False를 반환하며 출력하지 않는다.
'Language > Java' 카테고리의 다른 글
[Java] Interface 정리(2) (0) | 2023.07.18 |
---|---|
[Java] InterFace 정리(1) (0) | 2023.07.17 |
[Java] foreach문 사용하기 (0) | 2023.07.12 |
[Java] 접근 수준 지시자(Access-level Modifiers) (0) | 2023.07.03 |
배열로 Stack 구현해보기 (0) | 2022.12.17 |