○ 상속
- 정의 : 새로 설계(생성)하고자 하는 클래스가 이미 설계되어 있는 다른 클래스의 기능과 중복되는 경우, 이미 설계된 클래스의 일부분이나 전체 구조를 공유할 수 있도록 하는 기능을 의미한다.
[특징]
- 즉, 상속은 객체를 좀 더 쉽게 만들 수 있는 고수준의 재사용성(reusability)을 확보하고 객체간의 관계를 구성함으로써 객체 지향의 또 다른 큰 특징인 다형성의 문법적 토대가 된다.
- 상속은 기존 프로그램의 클래스 내용을 공유함으로써 중복된 코드들을 재작성할 필요 없이, 반복적이고 세부적인 작업을 처리하지 않기 때문에 프로그램을 작성하는 시간을 절약할 수 있고 유지보수를 편리하게 할 수 있으며, 프로그램의 길이도 짧아지게 된다.
- 또한, 이미 작성된 프로그램들은 앞서 테스트되었기 때문에 오류를 줄일 수 있어 현재 작성중인 프로그램에만 전념할 수 있다.
- [주의] 자바는 다중상속을 지원하지 않기 때문에 두 개 이상의 클래스로부터 상속받을 수 없다.
- 실무에서는 가이드라인을 제시하는 개념으로 많이 쓰인다.
- 상속은 부모가 아닌, 자식에 의해 결정된다. (부모의 의지와 상관 없이 자식이 상속 받겠다 하면 상속 가능)
- 상속 제외 대상 : 생성자, private
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
class SuperTest106 {
protected double area;
// 부모 클래스의 생성자
SuperTest106() {
System.out.println("Super Class...");
}
void write(String title) {
System.out.println(title + "-" + area);
}
}
// 자식 클래스
// 자바는 단일 상속만 지원되며, 다중 상속은 허용하지 않는다.
public class Test106 extends SuperTest106 { //, SuperTest107, SuperTest108 불가. 다중상속 안됨!
// 사용자 정의 생성자가 없으니 디폴트 생성자가 만들어 졌을거고,
// 자식클래스 생성자 안에서 상속받은 부모클래스의 생성자를 호출한 것
// 자식 클래스의 생성자
Test106() {
// 부모 클래스의 생성자 호출
// super();
System.out.println("Sub Class...");
// 항상 예외없이 부모클래스인 "Super Class"가 먼저 실행됨
// 생성자 안에서 생성자 호출할때는 생성자 내부에서 가장 먼저 실행되어야 함
// 상속받았으면 자바클래스가 자동으로 부모클래스의 생성자를 가장 먼저 호출해줌
// super();
//--==>> 에러 발생(컴파일 에러)
}
public void circle() {
int r = 10;
super.area = r * r * 3.141592; // 원칙적으로는 super.area라고 써야한다
super.write("원");
}
public void rect() {
int w = 20, h = 5;
super.area = w * h;
super.write("사각형");
}
public static void main(String[] args) {
// Test106 클래스 기반 인스턴스 생성
Test106 ob = new Test106();
//--==>>Super Class...
// Sub Class...
ob.circle();
//--==>> 원-314.1592
ob.rect();
//--==>> 사각형-100.0
}
}
|
cs |
- 49번 Line : 자식클래스 기반 인스턴스 생성 -> 자식클래스의 생성자가 호출(22번 Line) -> 자식클래스의 생성자 내부적으로 부모클래스의 생성자가 항상 먼저 호출 됨(24번 Line) -> 5번 Line의 부모 생성자 호출되며 "Super class..." 가 출력된 이후 다시 26번 Line으로 되돌아와 "Sub class..."가 출력된다.
- 53번 Line : 자식클래스 객체 ob로 circle()메소드를 호출 -> circle메소드 내에서는 지역변수 r과 상속받은 area를 모두 쓸 수 있음(36번 Line) -> super로 부모클래스의 write()메소드를 호출할 수 있음(37번 Line) -> 인자값으로 "원"을 넘겨주었기 때문에 "원"타이틀로 출력 됨(54번 Line)
- 56번 Line : 자식클래스 객체 ob로 rect()메소드를 호출 -> rect메소드 내에서는 지역변수 w, h와 상속받은 area를 모두 쓸 수 있음(42번 Line) -> super로 부모클래스의 write()메소드를 호출할 수 있음(43번 Line) -> 인자값으로 "사각형"을 넘겨주었기 때문에 "사각형"타이틀로 출력 됨(57번 Line)
- 49번에서 객체 생성시, 부모클래스 기반으로 SuperTest106 ob = new SuperTest106(); 이렇게 인스턴스를 생성하였을 경우에는 상속의 개념이 무의미하다. 부모는 누가 자신을 상속했는지 모르기 때문이다.
'스터디 > 개념정리' 카테고리의 다른 글
다형성이란?/업캐스팅/다운캐스팅/상속/java (0) | 2020.02.15 |
---|---|
메소드 오버로딩과 오버라이딩/java (0) | 2020.02.15 |
배열과 난수/java (0) | 2020.02.11 |