상속 (inheritance) :
기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것.
상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.
상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.
이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class)라고 한다. 그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고 부른다.
상속의 특징 :
- 상속의 상속(다중상속) 은 허용되지 않는다.
→ class 자식클래스이름 extend 부모클래스이름, 다른부모클래스이름 { ... } 이렇게 문법 구현 할 수 없다. - 대를 이어서 만들어진 상속은 가능하다.
- 부모가 하나 자식이 여러명은 가능 하다.
- 자식객체가 생성 되면 부모객체는 자동으로 생성된다.
상속의 장점 :
- 기존에 작성된 클래스를 재활용할 수 있다.
- 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면,
자식 클래스에서는 해당 멤버를 작성하지 않아도 되기에 편리하다. - 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련한다.
자식 클래스 작성 문법 :
class 자식클래스이름 extend 부모클래스이름 { ... }
자식 클래스에는 부모 클래스의 필드와 메소드만이 상속되며, 생성자와 초기화 블록은 상속되지 않는다.
또한, 부모 클래스의 접근 제어가 private이나 default로 설정된 멤버는 자식 클래스에서 상속받지만 접근할 수 없다.
package inherit;
class GrandParent{
int num;
String name;
public GrandParent() {
System.out.println("GrandParent 생성자");
num = 123;
name = "GrandParent";
}
}
class Parent extends GrandParent {
private int a; //상속안됨
int b;
public int c;
protected int d; //같은 패키지에서는 public 이라고 생각하면 됨
// 다른 패키지로 나가면 이런 상속관계 클래스에만 보인다.
public Parent() { //생성자는 상속안됨
System.out.println("Parent 생성자");
a=1;
b=2;
c=3;
d=4;
}
public void f1() {
System.out.println("Parent method");
System.out.println("a : " +a );
System.out.println("b : " +b );
System.out.println("c : " +c );
System.out.println("d : " +d );
System.out.println("num : " + num );
System.out.println("name : " + name );
}
}
class Child extends Parent {
int x;
public Child () {
System.out.println("Chlid 생성자");
// a=10; private 접근제어자 라서 상속 안됨
b=20;
c=30;
d=40;
}
public void f2() {
System.out.println("Child method");
// System.out.println("a : " +a ); private 접근제어자 라서 상속 불가
System.out.println("b : " +b );
System.out.println("c : " +c );
System.out.println("d : " +d );
System.out.println("num : " + num );
System.out.println("name : " + name );
}
}
public class inherit {
public static void main(String[] args) {
// TODO Auto-generated method stub
Parent p = new Parent();
p.f1();
Child c = new Child(); //객체를 생성할때 생성자가 실행된다.
//그래서 각 상위클래스들의 생성자가 실행 되는 걸 볼 수 있음
c.f1(); //상속받은 것 f1 "public Parent ()
//매서드는 호출 할때 실행 된다.
//자식이 생성자를 통해 해당 값을 재정의 하였다면 재정이 된 값이 실행 된다.
c.f2(); //자기것 f2 "child method"
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 객체지향 - 메소드 오버라이딩 (method overriding) (0) | 2023.03.01 |
---|---|
[JAVA] 객체지향 - super와 super() (0) | 2023.03.01 |
[JAVA] 객체지향 - 문자열 비교 (0) | 2023.03.01 |
[JAVA] 객체지향 - 싱글톤(Singleton) 패턴 (0) | 2023.03.01 |
[JAVA] 객체지향 - getter 와 setter (0) | 2023.02.28 |