본문 바로가기
개발/JAVA

자바 객체지향(6) - 상속(확장), 클래스의 객체 생성 과정 AND상속관계를 구현하고 있는 클래스의 객체 생성 과정

by chansungs 2020. 6. 14.
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
반응형