상속(inheritance) 이란?

: 부모의 생물학적 특성을 물려받는 유전과 유사하다고 생각할 수 있습니다. 즉, 부모클래스에 만들어진 필드, 메소드를 자식클래스가 물려받는 것을 의미합니다. 상속을 통해 간결한 자식 클래스 작성하게 되면 동일한 특성을 재정의할 필요가 없어 자식 클래스가 간결하게 만들 수 있습니다.

 

 

위의 예시와 같이 상속이 없는 경우 중복된 멤버를 가진4 개의 클래스 만들어야 합니다.

 

 

상속을 이용한 경우 중복이 제거되고 클래스의 구조가 간결해집니다.

 

 

상속의 장점

 

1) 클래스의 간결화

: 멤버의 중복 작성이 불필요 합니다.

 

2) 클래스 관리 용이

: 클래스들이 계층적으로 분류됩니다.

 

3) 소프트웨어의 생산성 향상

: 클래스 재사용과 확장 용이합니다.

: 새로운 클래스의 작성 속도가 빠르게 진행됩니다.

 

● 상속 선언하기

: extends 키워드 사용하여 상속 받습니다.

public class Person {
}
public class Student extends Person { // Person을 상속받는 클래스 Student 선언
}
public class StudentWorker extends Student { // Student를 상속받는 StudentWorker 선언
}

 

● 상속자와 접근제어어 사용

 

위와 같이 저장되어있는 class를 상속 받았을 때 각각의 접근제어어의 수행결과를 알아보겠습니다.

 

1) private

System.out.println("num1 = " + num1); 
error : private(접근불가) - 정보 은닉이 우선순위로 작동 

 

2) default

System.out.println("num2 = " + num2);
error : default - 같은 package 안에 있어야 함으로 다른 package에서 접근 불가.

 

3) protected

System.out.println("num3 = " + num3 );
protected int num3;(접근가능) 부모와 자식의 상속 관계 이므로 error 나지 않는다. 

 

4) public

System.out.println("num4 = " + num4);
public int num4; (접근가능) 어디서든 호출 가능. 

 

추가설명 )

참조자료형 field는 private 으로 method 는 public 으로 한다고 합니다. 그 이유는?

 

- method를 통해서 접근 할 수 있도록 하는 이유 내가 만든 것이기 때문에 조건을 제시하여 값을 체크할 수 있는 안정성을 확보 하도록 하기 위함입니다.

-  field 로 접근하도록 하면 정보 은닉 및 변경이 가능해지기 때문에 접근하지 못하도록 하는 것입니다.

 

● 서브클래스에서 슈퍼 클래스의 멤버 접근

 

 

 

● 자바 상속의 특징

- 기존에 정의된 클래스에 메소드와 변수를 추가하여 새로운 클래스를 정의하는 것입니다. (문법적 측면에서의 상속)

 

1) 클래스의 다중 상속을 지원하지 않습니다.

 

2) 상속 횟수는 무제한 입니다.

 

3) 상속의 최상위 클래스는 java.lang.object 클래스 입니다.

 

 - 모든 클래스는 자동으로 java.lang.Object상속받습니다.

 - 자바 컴파일러에 의해 자동으로 이루어집니다.

 

추가 설명)

new에 의해 자녀 클래스의 객체가 생성될 때, 부모 클래스 생성자와 자녀 클래스 생성자 모두 실행됩니다.

호출 순서 : 자녀 클래스의 생성자가 먼저 호출, 자녀 클래스의 생성자는 실행 전 부모 클래스 생성자 호출합니다.

○실행 순서 : 부모 클래스의 생성자가 먼저 실행된 후 자녀 클래스의 생성자 실행합니다.

 

 

 

● 상속 관계에 있는 인스턴스의 생성 예 

class Adder { 
		public static int val = 0; 
		Adder(){}
		public void add(int num) {
			val += num; }
}
	class AdderFriend extends Adder{
		AdderFriend(){super();} 
		public void friendAdd(int num) {val += num ;}	
			public void showVal() {System.out.println(val);}
    }

 class Adder 가 부모 class 이고, AdderFriend 가 자식 class로 extends Adder(class Adder의 값을 자신의 값으로 확장)사용하여 상속 관계를 만듭니다.

 

그때, 자식 class가 부모의 class를 field 를 초기화 해줘야하는 의무를 가지고 있는데, 생성자는 직접 가져 올수도 없고, java에서 선언하는 것이 때문에 super() 라는 예약어를 사용하여 그 의무를 수행합니다.  

 

super() : 자녀 클래스에서 명시적으로 부모 클래스의 생성자 선택 호출합니다.

- 인자를 이용하여 부모 클래스의 적당한 생성자 호출합니다.

- 반드시 자녀 클래스 생성자 코드의 제일 첫 라인에 와야 합니다.

 

 

● 상속을 위한 기본 조건인  IS-A 관계의 성립 

 

1) 상속 관계에 있는 두 클래스 사이에는 IS-A  관계가 성립해야 합니다.

 

2) IS-A 관계가 성립하지 않는 경우에는 상속의 타당성을 면밀히 검토해야 합니다.

 

3) IS-A 이외에 HAS-A 관계도 상속으로 표현 합니다. 그러나 HAS-A를 대신해서 Composition 관계를 유지하는 것이

   보다 적절한 경우가 많습니다. 

 

○ IS - A 관계의 예

package 상속;

class Computer{
	 Computer(){	 
	 }
}
class Notebook extends  Computer{
	Notebook(){
		super();
		}
}
class TabletPC extends Notebook{
	TabletPC(){
		super();
		}
}

노트북 is a 컴퓨터 - 노트북은 컴퓨터를 상속하고 , 테블릿 is a 노트북  - 테블릿은 노트북을 상속하는 것입니다.

일반적으로 IS-A 관계가 성립되면, 불필요한 상 속관계는 형성될 수 있으나, 잘못된 상속관계가 형성된다고는 이야기하지 않습니다.

 

○ HAS-A

상속은 강한 연결고리를 형성합니다. 그렇기 때문에 총을 소유하지 않는 경찰, 또는 총이 아닌 경찰봉을 소유하는 경찰등 다양한 표현에 한계를 가질 수 있습니다. 복합관계는 강한 연결 고리를 형성하지 않습니다. 따라서 HAS -A 관계는 복합관계로 표현하는 것또한 좋은 방법입니다.

 

 

 

'빅데이터 > JAVA' 카테고리의 다른 글

[JAVA] Abstract 클래스, Interface  (0) 2020.05.13
[JAVA] 메서드 오버라이딩(Method Overriding) , Instanceof연산자  (0) 2020.05.07
[JAVA] 콘솔 출력  (0) 2020.05.04
[JAVA] 배열 (array)  (0) 2020.05.02
[JAVA] String  (0) 2020.05.02

+ Recent posts