728x90
반응형
객체지향 언어의 상속(확장)
// 객체지향 언어의 상속(확장)
// - 코드의 재활용을 위한 문법
// (기존에 작성된 클래스를 다른 클래스에서 재활용하는 문법)
// 예제 1
// 특정 클래스의 멤버를 재활하는 방법
// - 코드를 Copy & Paste 방법
// - 수정 / 유지보수가 어려움.
class PersonA {
String name;
int age;
String tel;
String address;
}
class StudentA {
String name;
int age;
String tel;
String address;
String id;
char grade;
}
// 상속문법을 적용해야 하는 경우
// - is - a 관계
// - 강아지 is 동물 (O)
// - 사람 is 동물 (O)
// - 자동차 is 동물 (X)
// 상속의 구현
// extends 키워드의 사용
// class SubClass명 extends SuperClass명
// 상속을 받는 클래스 : 서브클래스, 자식클래스, 하위클래스
// 상속을 해주는 클래스 : 슈퍼클래스, 부모클래스, 상위클래스
class AnimalA {
public String name;
public int age;
}
class DogA extends AnimalA {
}
public class Class_20_Extends {
public static void main(String[] args) {
DogA d = new DogA();
// 상속받은 자식클래스는 부모클래스의 모든 멤버를 자신의 멤버처럼
// 사용할 수 있습니다.
System.out.println(d.name);
System.out.println(d.age);
}
}
// 부모클래스의 정의
class Super21 {
private int n1;
public int n2;
}
// 자식클래스의 정의
class Sub21 extends Super21 {
public void display() {
// 부모클래스로부터 상속받은 멤버 중,
// private 멤버는 자식클래스에서 접근할 수 없는 멤버입니다.
// System.out.println(this.n1);
// 부모클래스의 public 멤버는 자식클래스에서 접근할 수 있는 멤버입니다.
System.out.println(this.n2);
}
}
public class Class_21_Extends {}
클래스의 객체 생성 과정 AND상속관계를 구현하고 있는 클래스의 객체 생성 과정
// 클래스의 객체 생성 과정
// 1. 해당 클래스의 class 파일이 메모리에 적재
// 2. 해당 클래스의 모든 멤버 필드(변수)들이 Heap 메모리에 적재
// (static 멤버는 제외)
// 3. 해당 클래스를 생성할 때 사용한 생성자의 호출
// 4. 해당 객체의 레퍼런스(참조값)을 반환
class Normal22 {
int num;
public Normal22(int num) {
System.out.println("Normal22 클래스의 생성자 실행!");
this.num = num;
}
public void display() {
System.out.printf("num = %d\n", this.num);
}
}
// 상속관계를 구현하고 있는 클래스의 객체 생성 과정
// 1. 멤버 필드(변수)의 메모리 로딩
// - 부모/자식 클래스의 모든 멤버 필드가 메모리 로딩
// 2. 생성자 호출( 자식 클래스의 생성자 호출 )
// 3. 자식 클래스 생성자의 첫 번째 실행 코드인 super() 에 의해
// 부모클래스의 생성자 호출(메소드)
// 4. 자식 클래스의 생성자 실행
// 기본적으로 객체지향 언어는 각각의 클래스가 고유의 업무(역할)을 담당하는 것이 일반적입니다.
// 만약 자식클래스에서 부모클래스의 모든 멤버에 접근하여 처리하는 경우
// 기본 로직이 중복될 가능성이 높습니다.
// - 부모클래스의 모든 멤버 필드 및 메소드를 활용하여 기본 로직의 확장을 취하는 방식이
// 자바언어의 상속 문법입니다.
class Super22 {
private int num;
public Super22() {
num = 10;
System.out.println("부모클래스의 생성자 실행!");
}
}
class Sub22 extends Super22 {
public Sub22() {
// 상속을 구현하고 있는 자식클래스의 생성자 첫번째 실행코드인 super()
// - 컴파일러에 의해서 자동으로 추가됩니다.
// super();
System.out.println("자식클래스의 생성자 실행!");
}
}
public class Class_22_Extends {
public static void main(String[] args) {
// Normal22 n = new Normal22(15);
// n.display();
Sub22 s = new Sub22();
}
}
class Super23 {
private int num;
// 상속관계를 고려한 더미 생성자
// - 의미없이 형식만 갖춘 생성자
// public Super23() {}
// 자바의 컴파일러는 개발자가 생성자를 선언하면
// 디폴트 생성자를 자동으로 만들지 않습니다.
public Super23(int num) {
System.out.println("부모클래스의 생성자 실행!");
this.num = num;
}
}
class Sub23 extends Super23 {
public Sub23() {
// 상속관계를 구현하고 있는 자식 클래스 생성자의 1번째 실행코드
// 만약 부모클래스에 디폴트 생성자가 존재하지 않는 경우
// 아래와 같이 super() 실행코드는 에러가 발생됩니다.
// super(); -> 부모클래스의 디폴트 생성자를 호출하는 코드이기 때문에
// super();
// 부모클래스에 디폴트 생성자가 존재하지 않는 경우에는
// 반드시 명시적으로 특정 생성자를 호출하도록 제어해야 합니다.
super(5);
System.out.println("자식클래스의 생성자 실행!");
}
}
public class Class_23_Extends {
public static void main(String[] args) {
Sub23 s = new Sub23();
}
}
상속의 예제
class Super24 {
public Super24() {
this(10);
System.out.println("부모클래스의 Super24() 생성자 실행!");
}
public Super24(int i) {
this(10.1);
System.out.println("부모클래스의 Super24(int) 생성자 실행!");
}
public Super24(double d) {
System.out.println("부모클래스의 Super24(double) 생성자 실행!");
}
}
class Sub24 extends Super24 {
public Sub24() {
// this를 통한 생성자 호출은 반드시 생성자의 첫번째 실행코드만 정의해야 합니다.
// - 상속관계를 구현하는 자식클래스의 경우
// 생성자의 첫번째 실행코드는 this / super 둘 중 하나만 가능합니다.
this(10);
System.out.println("자식클래스의 Sub24() 생성자 실행!");
}
public Sub24(int i) {
this(10.1);
System.out.println("자식클래스의 Sub24(int) 생성자 실행!");
}
public Sub24(double d) {
// 자식클래스의 생성자에서 this 를 사용한 생성자의 호출이 없다면
// 아래와 같이 부모클래스의 생성자를 호출하는 super가 자동으로 삽입됩니다.
// super();
System.out.println("자식클래스의 Sub24(double) 생성자 실행!");
}
}
public class Class_24_Extends {
public static void main(String[] args) {
Sub24 s = new Sub24();
}
}
728x90
반응형
'개발 > JAVA' 카테고리의 다른 글
자바 객체지향 (8) - 상속의 문제점 (0) | 2020.06.14 |
---|---|
자바 객체지향(7) - 상속의 형변환, (0) | 2020.06.14 |
자바 객체지향(5) - 싱글턴 패턴 (0) | 2020.06.14 |
자바 객체지향 (4) - static, static 멤버 변수의 활용, static 키워드가 정의된 메소드 (0) | 2020.06.14 |
자바 객체지향 (3) - this, (0) | 2020.06.14 |