1. What is Inheritance?
- 소프트웨어 재사용 형태
- 객체지향 프로그래밍의 주요 특성
- 기존의 클래스로부터 새로운 클래스를 만드는 것 : 기존의 클래스 데이터와 메소드를 그대로 흡수하고, 수정이나 새로운 메소드 또는 데이터 등을 추가하여 향상 시킴
- 중복 코드를 제거하기 위해 사용함 No redundant code
- general class -> special case class
class Animal:
// general class - general features
move
legs
speed
feed
class Dog:
// special class, inherits Animal class features
fetch
...
2. Subclass and Superclass
자바는 다중상속을 허용하지 않음 (vs. C++은 가능)
Subclass (Child, derived class)
- 한 객체 그룹의 특정한 클래스
- superclass로부터 데이터와 메소드를 상속
- 메소드를 추가하거나 수정 가능 = override
Superclass (Parent, base class)
- 한 객체 그룹의 대표가 되는 클래스
- 서브클래스에 데이터와 메소드를 제공
- direct or indirect
class hierarchy
- superclass는 공통적, 일반적인 특징을 가지도록 디자인
- subclass는 특정한 특징을 가지도록 디자인
- 각 클래스의 특별한 속성은 area 구하는 공식이 모두 다르기 때문에 각 클래스가 그렇게 각자만 가지고 있는 특징을 가지고 있어야 함
Object class
- java.lang
- 자바 클래스 계층의 최상위
- 모든 자바 클래스들이 상속하는 최상위 클래스로
- .toString(), .clone(), .equals() 등을 자동으로 상속
// 하나의 파일에 여러 클래스를 선언하는건 권장하지 않음.
public class TwoDShape{
// parent = java.lang.object
}
class TestShape {
/* public 불가능 - 이 파일 외부에서 접근 불가 */
public static void main(String[] args) {
TwoDShape object1 = new TwoDShape();
object1.toString();
}
}
3. Is-a vs. has-a relationships
public class ClassName extends SuperClass{
...
}
ex)
public class Dog extends Animal{
...
}
- superclass에서 상속받은 메소드를 수정하는 것 = override
- 새로운 메소드 추가 가능
클래스 변수는 private으로 하고, public get, set 메소드를 선언해서 직접 접근하지 못하도록 하는 것 권장
Is-a
- 상속을 나타내는 표현
- subclass is a superclass
- extends, implements
Has-a
- 조합을 나타내는 표현 Composition
- 객체는 하나 이상의 객체나 다른 클래스를 멤버로 가지고 있음
- ex) Car has 4 Steering Wheels
요구사항 정의는 인간의 언어로 표현되기 때문에 그것을 해석해서 프로그래밍하기 위해서 다음과 같은 관계를 정의할 수 있어야 함.
4. Strategy for coding with inheritance
- 공통 특징을 superclass에
- 특별한 특징을 subclass에
- public 멤버는 모두 subclass에서 상속받아 사용 가능
- private 멤버, constructor은 subclass에서 사용 불가능
- static 메소드은 경우 상속되지만 override (수정) 할 수 없음
5. Protected members
- protected 멤버는 서브클래스에서 상속, 오버라이드 가능
- public - private의 중간 단계 키워드
- superclass, subclass, 같은 패키지의 클래스들에서 접근 가능
- super. : 서브 클래스 메소드에 의해 오버라이드되는 수퍼클래스 메소드에 접근하기 위해 사용
- protect 인스턴스 변수 사용하는것 권장되지 않음
- 외부 패키지에 있는 클래스 상속하고 싶으면 extends ExternalPackageName.SuperClass 로 상속 가능
public class TwoDShape{
// parent = java.lang.object
protected String Name;
private String Color;
private double dimension1;
private double dimension2;
// constructor
public TwoDShape(String name, String color, double dimension1, double dimension2) {
Name = name;
Color = color;
this.dimension1 = dimension1;
this.dimension2 = dimension2;
}
// set. get methods
...
public String toString() {
return "Base class to string";
}
}
class Circle extends TwoDShape {
// 위와 같이 디폴트가 아닌 constructor를 선언한 경우
public Circle(String name, String color, double dimension1, double dimension2) {
// 이렇게 필요한 인자를 다 전달해서 초기화해주어야 함
super(name, color, dimension1, dimension2);
}
public double getArea() {
// dimension 변수들은 private이기 때문에 get 메소드로만 접근 가능
return Math.PI * getDimension1() * getDimension2();
}
// override
public String toString() {
return "subclass class to string calling " + super.toString();
// >> subclass to class to string calling base class to string
}
}
class TestShape {
public static void main(String[] args) {
Circle object = new Circle("Circle", "red", 5);
// object는 TwoDShape, Circle의 모든 변수와 메소드 사용 가능
System.out.println(object.getName());
System.out.println(object.getColor());
System.out.println(object.getArea());
// protected 키워드를 쓰면 직접 수정 가능
object.Name = "New Circle";
System.out.println(object.getName());
}
}
6. Constructors in subclasses
- constructor는 상속 불가
- super()로 호출 가능
- 모든 인스턴스 변수는 상속 가능하지만 private 변수는 직접 접근이 불가능 (get, set으로만!)
7. Full example with inheritance
References
- 성균관대학교 소프트웨어학과 타메르 교수님 2021-1 <자바 프로그래밍 실습>
'프로그래밍 언어 > Java' 카테고리의 다른 글
Week6) Java Programming Lab : Polymorphism (0) | 2021.03.29 |
---|---|
Java programming 자바 프로그래밍 실습 : 은행 계좌 ATM (0) | 2021.03.24 |
Java programming 자바 프로그래밍 실습 : Employee Salary (0) | 2021.03.22 |
Java programming 자바 프로그래밍 실습 : Bank Account Class (withdraw, transfer) (0) | 2021.03.22 |
Java programming 자바 프로그래밍 실습 : Invoice Calculation (0) | 2021.03.22 |