JAVA _기초

[JAVA] Inheritance : 상속 _01

Journey Jeong 2023. 2. 21. 13:00

상속 (inheritane)

- 부모클래스: 상위클래스, 슈퍼클래스

- 자식클래스: 하위클래스, 서브클래스

 

01. 개념 : 부모의 멤버를 상속받아 자식이 쓸수 있게 해준다.

02. 목적 : 코드의 중복, 효율적으로 개발하여 작업 시간을 줄여준다. 

 

03. 예외적인 항목

부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없습니다.

부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없습니다.

(default 접근 제한은 같은 패키지에 있는 클래스만 접근이 가능하게끔 하는 접근 제한자이기 때문입니다.)

그 이외의 경우는 모두 상속의 대상이 됩니다.

 

04. 상속 방법

: 상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적습니다. 자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야 합니다.

 

-- 클래스 만들기 

package inheritance;

public class Super { // 상위클래스, 부모클래스, super클래스
	
	int a;
	double b;
	
	void disp() {
		System.out.println("a="+a);
		System.out.println("b="+b);
	}

	

}
package inheritance;

public class Sub extends Super{ //하위 클래스, 자식클래스, sub클래스
	// : class대 class extends 단일상속 

	int c;
	double d;
	
	void display() {
		System.out.println("c"+c);
		System.out.println("d"+d);
	}
}
package inheritance;

public class Sub02 extends Super{
	
	int e; 

}

 

-- 활용 예제

package inheritance;

public class ExtendsTest01 {

	public static void main(String[] args) {
		
		Sub sub=new Sub(); //1. 변수 선언
	//	System.out.println("c: "+sub.c); // sub 프로젝트에서 정보 가지고 올 수 있다. 
	//	System.out.println("d: "+sub.d); // 단 private 는 가지고 올 수 없음 
		
		sub.display(); // sub display 는 public 이므로 가지고 올 수있다. 
		sub.disp();
		System.out.println("a= "+sub.a);
		System.out.println("b= "+sub.b);
		System.out.println("---------");
		Sub02 sub2=new Sub02();
		System.out.println("e= "+sub2.e);
		System.out.println("super a:"+sub2.a);
		System.out.println("super b:"+sub2.b);
		sub2.disp();
	}

}

 

관련 참고 링크 

 

https://chanhuiseok.github.io/posts/java-1/

 

자바(JAVA) - 상속(Inheritance) (1) 클래스 상속, 부모 생성자의 호출

상속이란?

chanhuiseok.github.io

https://tlo-developer.tistory.com/97

 

Chapter 06. 상속 _ 프로그래밍 01

[쉽게 배우는 자바 프로그래밍] Chapter 06. 상속 프로그래밍 문제 1. 다음 표와 실행 결과를 참고해 자식 클래스인 Circle과 ColoredCircle을 작성하시오. 그리고 Circle과 ColoredCircle 객체의 show() 메서드를

tlo-developer.tistory.com

 

* 예제 02.

 

- super 

package inheritance;

public class Animal {
	
	int a; 
	
	public Animal() {// 초기화 담당 
		System.out.println("Animal 클래스의 생성자 실행");
	}
}

- sub 1 

package inheritance;

public class Reptile extends Animal { //is a relationship

	int b;
	//상속관계가 구현된 자식 클래스의 생성자 첫 줄에는 super() 가 기본적으로 생략이 되어있음 
	//super(); -> 부모의 기본생성자를 뜻함 
	public Reptile() {
		super();  
		System.out.println("Reptile 클래스의 생성자 실행");
	}
	// 생성자 오버로딩
	// 기본적으로 super(); 생략이 되어있으나, this(); 를 명시하면 super();는 무효화됨  
	public Reptile(int b) {
		this();
		System.out.println(b+" Reptile 클래스의 생성자 실행");
	}
}

 

- sub 2

package inheritance;

public class Memmal extends Animal { //is a relationship

	int c; 
	
	public Memmal() { // 초기화 담당 
		super(); // 가 생략이 되어있음 
		System.out.println("Memmal 클래스의 생성자 실행");
		
	}
}

- main 

package inheritance;

public class ExtendTest02 {

	public static void main(String[] args) {
			//애니멀 객체 만들기 1. 변수 선언  
		//Animal animal=new Animal(); // 2. 메모리 할당
			//"Animal 클래스의 생성자 실행" 이 뜸 
		
		//Reptile 객체 만들기 
		Reptile reptile = new Reptile();
		// 'Animal 클래스의 생성자 실행' 이 뜸
		// 'Reptile 클래스의 생성자 실행' 이 뜸 
		
		System.out.println("---------");
		//Memmal 객체 만들기 
		Memmal memmal = new Memmal();
		// 'Animal 클래스의 생성자 실행' 이 뜸
		// 'Reptile 클래스의 생성자 실행' 이 뜸 
		System.out.println("---------");
		Reptile reptile2 = new Reptile(10);
		// 'Animal 클래스의 생성자 실행' 이 뜸
		// 'Reptile 클래스의 생성자 실행' 이 뜸 
		// '10 Reptile 클래스의 생성자 실행' 이 뜸 
	}
}

reptile2의 경우 해당 생성자에 this 가 있기에, reptile 이 먼저 실행되고, repile 의 (b+"retile~") 이 실해됨 

 

- 출력창 

Animal 클래스의 생성자 실행
Reptile 클래스의 생성자 실행
---------
Animal 클래스의 생성자 실행
Memmal 클래스의 생성자 실행
---------
Animal 클래스의 생성자 실행
Reptile 클래스의 생성자 실행
10 Reptile 클래스의 생성자 실행

 

예제 03. 상속의 상속 

Animal > Memmal > Dog 

package inheritance;

public class Animal {
	
	int a=10; 
	
	public Animal() {// 초기화 담당 
		System.out.println("Animal 클래스의 생성자 실행");
	}
}
package inheritance;

public class Memmal extends Animal { //is a relationship

	int c=30; 
	
	public Memmal() { // 초기화 담당 
		super(); // 가 생략이 되어있음 // 첫줄에만 허용 
		System.out.println("Memmal 클래스의 생성자 실행");
		
	}
}
package inheritance;

public class Dog extends Memmal{
	
	int d= 40; 
	
	public Dog() {
		//memmal 생성자 생략 
		//memmal 은 animal 자식임 
		System.out.println("Dog 클래스의 생성자 실행");
	}
}

- main 

package inheritance;

public class ExtendTest03 {

	public static void main(String[] args) {
		
		// 자식 객체를 생성시키면, 부모 객체가 먼저 생성되고 자식객체도 생성된다. 
		Dog dog = new Dog();
			// super 생략 
	}

- 출력 

Animal 클래스의 생성자 실행
Memmal 클래스의 생성자 실행
Dog 클래스의 생성자 실행

'JAVA _기초' 카테고리의 다른 글

[JAVA] Inheritance : 상속_03  (0) 2023.02.23
[JAVA] Inheritance : 상속_02  (0) 2023.02.22
[JAVA] Exceptions: 예외  (0) 2023.02.20
[JAVA] 자바의 Enum, 열거형 이란  (0) 2023.02.17
[JAVA] 문자열 (String)  (0) 2023.02.15