상속(Inheritance)
상속에 대해 알아보고자 다음과 같은 class를 작성하였다.
일단 !! 모든 클래스는 하나의 클래스를 무조건~ 상속하고 있다. 바로 Object Class이다. (toString이나 equals와 같은 메서드를 따로 정의하지 않고도 사용할 수 있었던 이유)
먼저 상속이란 무엇일까?
상속은 쉬운 의미로 재사용이다. 기존의 클래스를 재사용해 새로운 클래스를 작성하는 것이다.
단지 재사용한다고 해서 장점이 뭐지??
상속을 사용하게 되면 먼저, 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있다.
코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우!! 용이하다.
x
public class GrandFa //상속 관계를 보기 위해 할아버지 클래스를 만들었다.
{
private int nai = 80;
public String gabo = "상감청자";
protected String gahun = "자바를 정복하자";
// protected를 가지고 있는 class라는 건 부모 class고 자식을 가지고 있어 그런 의사 표현
public final int ABC = 1; // 영원히 1이다
public GrandFa()
{
System.out.println("할아버지 생성자");
}
GrandFa(int nai)
{
this();
this.nai = nai;
}
public String say() //method override, say는 자식에서는 오버라이드 불가
{
return "할아버지 말씀 : 상속은 중요해";
}
public void eat()
{
System.out.println("밥은 맛있게....");
}
public int getNai()
{
return nai;
}
}
xxxxxxxxxx
public class Father extends GrandFa //상속(단일 상속만 가능)
{
public String gabo = "상감무늬 물병"; //은닉화
private int nai = 55;
private int house = 1;
public Father()
{
super(); //부모의 생성자를 호출
System.out.println("아버지 생성자");
}
public String say() // 조상 클래스가 protected라면 자손에서는 protected나 public
{
String ss = "아버지 말씀";
return ss + " : 다형성이 등장하려고 함!";
}
public void eat() //오버라이드 - > 다형성을 구현한다.
{
System.out.println("밥은 먹자");
}
protected int getHouse()
{
return house;
}
public int getNai()
{
return nai;
}
public void showData()
{
System.out.println(nai);
System.out.println(getNai());
System.out.println(this.getNai());
System.out.println(super.getNai()); //자식이 부모 멤버를 부르는 것
eat();
this.eat();
super.eat();
System.out.println(say());
System.out.println(super.say());
}
}
x
public class Me extends Father
{
public Me()
{
System.out.println("내생성자");
}
}
class FamilyMain
{
public static void main(String[] args)
{
GrandFa grandFa = new GrandFa();
System.out.println();
Father father = new Father();
System.out.println(father.gabo); //은닉화 부모의 멤버과 자식의 멤버로서 숨어버리는 것
father.eat();
System.out.println();
father.showData();
System.out.println("----------나에 대해");
Me me = new Me();//출력 할아버지 -> 아버지 -> 나
System.out.println("가보 : " + me.gabo); // ME에 정의된게 없기 때문에 Father class에 정의된 것으로 출력
System.out.println("가훈 : " + me.gahun); //위와 같다
System.out.println(me.say()); //위와 같다
me.eat(); //위와 같다
}
}
오버라이딩(Overring) @Override
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우가 많다.
조건(자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와)
이름이 같아야 한다.
매개변수가 같아야 한다.
반환타입이 같아야 한다.
접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- public > protected > (default) > private
예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
단일 상속
C++은 다중 상속을 허용, 자바는 단일 상속만 허용한다.
다중 상속은 이러한 장단점을 가진다.
장점 : 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다
단점 : 클래스간의 관계가 매우 복잡해진다
'공부 > 개발' 카테고리의 다른 글
GO 프로그래밍 - 기초 1편 환경 설정 (0) | 2020.11.11 |
---|---|
swap (0) | 2018.01.10 |
헷갈리는 String (0) | 2017.12.26 |
List, Map, Set의 차이점 (0) | 2017.08.21 |
인터페이스 강제 타입 변환(casting) (4) | 2017.06.13 |