상속
상속은 기존의 클래스를 재사용 해서 새로운 클래스를 작성하는 과정이다. 쉽게 말해서 부모 클래스를 상속extends받아 자식 클래스에서 부모 코드를 재사용 할 수 있는 것이다. 프로그램을 설계하다보면, 공통된 부분으로 인하여 중복되는 코드들이 계속 나올 수 있다. 이때 상속을 사용하여, 비슷한 객체끼리 하나의 묶음으로 묶어주고, 공통된 부분을 상위 개념의 부모 클래스로 생성하게 되고 이 객체들이 부모 객체를 상속하면 중복된 코드들을 줄일 수 있고 공통된 방식으로 프로그램을 설계할 수 있다.
class 자손클래스 extends 조상클래스 {
// ...
}
class Point{
int x;
int y;
}
//class Point3D{
// int x;
// int y;
// int z;
//}
//▼상속받아서 사용
class Point3D extends Point {
int z;
}
상속의 의의
상속을 사용하는 이유
클래스간의 관계
상속관계Inheritance
두 클래스가 조상과 자손으로써 관계를 가지게 되면 상속 관계에 있다고 한다. 상속 관계의 특징은 아래와 같다.
class Parent { }
class Child extends Parent { }
class Child2 extends Parent { }
class GreandChild extends childe { }
포함관계Composite
포함이란 한 클래스의 멤버변수로 다른 클래스를 선언하는 것을 말한다. 포함관계는 작은 단위의 클래스를 먼저 만들고, 이 들을 조합해서 하나의 커다란 클래스를 만든다.
상속관계
IS-A 관계
말 그대로 IS-A관계는 "~는 ~이다."가 성립되는 관계이다.
class Computer {
String owner;
public Computer(String name) { }
public void calculate() { }
}
부모클래스
class NotebookComputer extends Computer {
int battary;
public NotebookComputer(String name, int initChag) {
super(name);
}
public void charging() { }
public void movingCal() { }
}
노트북은 컴퓨터 이다.
class TabletNotebook extends NotebookComputer {
String regstPenModel;
public TabletNotebook(String name, int initChag) {
super(name, initChag);
}
public void write(String penInfo) { }
}
타블렛은 노트북 이다.
HAS-A 관계
클래스 내에 다른 클래스를 "포함" 함으로써 기능적인 것을 사용하고자 했을 때 HAS-A 관계를 이용한다.
class Gun {
int bullet; //장전된 총알의 수
public Gun(int bnum) { bullet=bnum; }
public void shut(){
System.out.println("BANG@@");
bullet--;
}
}
class Police extends Gun {
int handcuffs; //소유한 수갑의 수
public Police(int bnum, int bcuff) {
super(bnum);
handcuffs=bcuff;
}
public void putHandcuff(){
System.out.println("SNAP!");
handcuffs--;
}
}
경찰은 총을 소유하고 있다.
상속은 강한 연결고리를 형성한다. 때문에 총을 소유하지 않는 경찰 또는 총이 아닌 경찰봉을 소유하는 경찰 등 다양한 표현에 한계를 보인다는 단점이 있다.
단일상속Single Inheritance관계
Java는 단일상속만을 허용한다. (C++은 다중상속 허용한다.)
class Police extends Gun, Handcuffs { //이와같은 다중상속을 허용하지 않는다.
...
}
비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
Object클래스
Object클래스는 모든 클래스의 최고 조상으로 자바 클래스가 아무것도 상속하지 않으면 java.lang 패키지의 Object 클래스를 자동으로 상속한다. 때문에 모든 자바 클래스는 Object 클래스를 직접적 혹은 간접적으로 상속하게 된다.
예제
-
Code
StringTest.javapublic class StringTest { public static void main(String[] args) { // ==는 객체의 참조값 비교, Object 클래스의 equals()도 참조값비교 // String 클래의 equals()는 오버라이딩 되어있음->문자열 내용비교 String aa = "aa"; String bb = "aa"; String cc = new String("aa"); String dd= bb; System.out.println(aa.equals(bb)); System.out.println(aa.equals(cc)); System.out.println(aa==bb); System.out.println(bb==cc); System.out.println(aa==cc); System.out.println(dd==bb); System.out.println(dd.equals(cc)); } } -
Result