🔎 상속관련 용어 정리
🔎 상속의 UML 표현

🔎 상속의 기본 구조
class <하위 클래스이름> extends <상위 클래스이름>
// 예시
class Man { // 상위 클래스
...
}
class BusinessMan extends Man { // 하위클래스
...
}
🔎 상속의 효과
private으로 선언된 경우는 접근이 불가능하다.class Man {
String name;
public void tellYourName() {
System.out.println("My name is " + name);
}
}
class BusinessMan extends Man {
String company;
String position;
public void tellYourInfo() {
System.out.println("My company is " + company);
System.out.println("My position is " + position);
tellYourName(); // 상속관계이므로 상위 클래스 멤버에 이름만으로 접근 가능
}
}
class MyBusinessMan {
public static void main(String[] args) {
BusinessMan man = new BusinessMan("jolly", "자취 컴퍼니", "Intern"); // 하위클래스 인스턴스 생성
man.tellYourInfo();
}
}
// 출력 결과
My company is 자취 컴퍼니
My position is Intern
My name is jolly

상속을 적용하면 하위 클래스의 생성자에서도 상위 클래스의 멤버변수에 대한 초기화를 포함시켜줘야 한다.
이 경우 모든 멤버의 초기화는 이뤄지지만, 생성자를 통한 초기화 원칙에는 어긋난다.
(모든 멤버는 그 멤버가 속한 클래스의 생성자를 통해서 초기화 되는 것이 이상적)
좋은 코드를 만들기 위해 자식 클래스에서 직접 부모클래스를 초기화 하는 것이 아닌 초기화를 위한 인자만 받아주고 상위클래스의 생성자의 생성자를 호출하는 방법을 사용한다.
class Man {
String name;
public void tellYourName() {
System.out.println("My name is " + name);
}
}
class BusinessMan extends Man {
String company;
String position;
/* 생성자 */
public BusinessMan(String name, String company, String position) {
// 상위 클래스 Man의 멤버 초기화
this.name = name;
// 클래스 BusinessMan의 멤버 초기화
this.company = company;
this.position = position;
}
public void tellYourInfo() {
System.out.println("My company is " + company);
System.out.println("My position is " + position);
tellYourName(); // 상속관계이므로 상위 클래스 멤버에 이름만으로 접근 가능
}
}
class MyBusinessMan {
public static void main(String[] args) {
BusinessMan man = new BusinessMan("jolly", "자취 컴퍼니", "Intern"); // 하위클래스 인스턴스 생성
man.tellYourInfo();
}
}
// 출력 결과
My company is 자취 컴퍼니
My position is Intern
My name is jolly
🔎 상속관계에 있는 생성자의 호출관계
class SperCls {
public SperCls() { // 상위 클래스 생성자
System.out.println("I'm Super Class");
}
}
class SubCls extends SperCls {
public SubCls() { // 하위 클래스 생성자
System.out.println("I'm Sub Class");
}
}
class SuperSubConExam {
public static void main(String[] args) {
new SubCls(); // 하위 클래스의 인스턴스 생성
}
}
// 출력 결과
I'm Super Class // 따로 상위 클래스 생성자를 호출하지 않았지만, 하위 클래스보다 먼저 호출된 것을 확인
I'm Sub Class
🔎 상위 클래스 생성자 명시적 호출방법
super를 사용한다.super는 생성자 내에서만 사용가능한 키워드이다.class SuperCls {
// 상위 클래스 생성자 오버로딩
public SuperCls() {
System.out.println("생성자 : SupeCls()");
}
public SuperCls(int i) {
System.out.println("생성자 : SupeCls(int i)");
}
public SuperCls(int i, int j) {
System.out.println("생성자 : SupeCls(int i, int j)");
}
}
class SubCls extends SuperCls {
// 하위 클래스 생성자 오버로딩
public SubCls() {
super(); // 상위 클래스의 생성자를 지정 및 호출
System.out.println("생성자 : SubCls()");
}
public SubCls(int i) {
super(i); // 상위 클래스의 생성자를 지정 및 호출
System.out.println("생성자 : SubCls(int i)");
}
public SubCls(int i, int j) {
super(i, j); // 상위 클래스의 생성자를 지정 및 호출
System.out.println("생성자 : SubCls(int i, int j)");
}
}
class SuperSubCon {
public static void main(String[] args) {
System.out.println("1. ");
new SubCls();
System.out.println();
System.out.println("2. ");
new SubCls(1);
System.out.println();
System.out.println("3. ");
new SubCls(1, 2);
System.out.println();
}
}
// 출력 결과
1.
생성자 : SupeCls()
생성자 : SubCls()
2.
생성자 : SupeCls(int i)
생성자 : SubCls(int i)
3.
생성자 : SupeCls(int i, int j)
생성자 : SubCls(int i, int j)
(static) 변수, 메소드와 상속class SuperCls {
protected static int count = 0; // 클래스 변수 선언
public SuperCls() {
count++;
}
}
class SubCls3 extends SuperCls {
public void showCount() {
System.out.println(count); // 상위 클래스에 위치한 클래스 변수 count에 접근
}
}
public class SuperSubStatic {
public static void main(String[] args) {
new SuperCls(); // count 값 1 증가
new SuperCls(); // count 값 1 증가
// 하위 클래스 인스턴스 생성과정에서 상위클래스 생성자 호출됨
SubCls3 obj = new SubCls(); // count 값 1 증가
obj.showCount();
}
}
// 출력 결과
3