[자바 – Java] 자바 상속 예제 문제 생성자 오버라이딩 super 다형성

1. 클래스 상속

 

1) 새로운 클래스를 정의할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현된다.

2) 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할 때 기존 클래스를 상속한다.

2. A클래스가 B클래스에게 상속한다. (= B클래스가 A클래스를 상속받는다.)


상속하는 클래스

– 상위 클래스, parent class, base class, super class

 

상속받는 클래스

– 하위 클래스, child class, derived class, sub class

3. 상속의 문법

 

1) extends 키워드 뒤에는 단 하나의 클래스만 올 수 있다.

– 자바 단일 상속 (single inheritance)만을 지원한다.

2) 문법

class B extends A {

    }

4. 상속을 구현하는 경우

 

1) 상위 클래스는 하위 클래스보다 더 일반적인 개념과 기능을 가진다.

2) 하위 클래스는 상위 클래스보다 더 구체적인 개념과 기능을 가진다.

3) 하위 클래스는 상위 클래스의 속성과 기능을 확장(extend)한다는 의미이다.

 

5. 포함 관계

 

1) has a 관계 : ~은 ~를 가지고 있다. 보조적인 것은 포함관계로 정의한다.

2) 다중 상속을 대체하는 방법이다.

3) 클래스의 멤버변수로 다른 클래스를 선언하는 것

4) 규모가 적은 클래스를 먼저 만들고, 이것을 조합하여 규모가 큰 클래스가 만들어감.

6. Object 클래스

 

1) 모든 클래스의 최상위 클래스이다.

2) 사용자 정의 클래스는 아무것도 상속을 받지 않더라도 자동으로 Object를 상속받는다.

7. protected 예약어

 

1) 외부 클래스에는 private으로 하위 클래스에서 public의 기능을 구현한 키워드다.

2) 상위 클래스에 protected로 선언된 변수나 메서드는 다른 외부 클래스에서는 사용 불가하지만 상속을 받은 하위 클래에서는 사용이 가능하다.

8. 접근 제한자 (access modifier)의 가시성

  외부 클래스 하위 클래스 동일패키지 내부클래스
public O O O O
protected X O O O
선언되지 않음
(default)
X X O O
private X X X O

9. 상속에서 클래스가 생성 과정

 

1) 하위 클래스가 생성되는 과정 : 하위 클래스를  생성하게 되면 상위 클래스가 먼저 생성된다.



    

ex) VIPCustomer가 Customer클래스에 상속을 받아서  VIPCustomer()를 호출하면 Customer()가 먼저 호출된다.

– 상위 클래스의 생성자가 호출되고 하위 클래스의 생성자가 호출된다.

– 하위 클래스의 생성자에서는 무조건 상위 클래스의 생성자가 호출되어야 한다.

 

* 하위 클래스에서 상위 클래스의 생성자를 호출하는 코드가 없는 경우

– 컴파일러는 상위 클래스 기본 생성자를 호출하기 위한 super();를 추가한다.

                – super()로 호출되는 생성자는 상위 클래스의 기본 생성자이다.

– 만약 상위 클래스의 기본 생성자가 없는 경우 (매개 변수가 있는 생성자만 존재하는 경우)

                – 하위 클래스는 명시적으로 상위 클래스의 생성자를 호출해야 한다.

10. 상속 관계에서 인스턴스 메모리 상태

항상 상위 클래스의 인스턴스가 먼저 생성되고, 그다음 하위 클래스의 인스턴스가 생성된다.

 

 

11. 상위 클래스로의 묵시적 형 변환(Up Casting)

Customer customerX = new VIPCustomer(753421, “홍길동”);

1) Customer = 선언된 클래스 형(상위 클래스형) VIPCustomer = 생성된 인스턴스 생성자, 하위 클래스 생성자

2) 상위 클래스 형(Type)으로 변수를 선언하고 하위 클래스 인스턴스를 생성할 수 있다.

3) 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형 변환이 가능하다.

4) 상속관계에서 모든 하위 클래스는 상위 클래스로 묵시적 형 변환이 됨. 그 역으로는 성립하지 않는다.

5) VIPCustomer() 생성자의 호출로 인스턴스는 생성되었지만 타입이 Customer이므로 접근할 수 있는 변수나 메서드는 Customer의 변수와 메서드임.

12. 메서드 overriding(재정의)

 

1) 하위 클래스에서 메서드 재정의한다는 의미이다.

2) 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있다.

3) 부모 클래스에서 상속받은 메서드를 자식한테 맞게끔 구현부를 수정하는 것이다.

4) 반드시 메서드 선언부는 동일해야 한다.(리턴 타입, 메서드명, 매개 변수) 

5) modify, change의 개념을 갖고 있다.

 vs 오버로딩(overloading)

– 매개변수의 개수, 타입, 순서가 다른 경우이다.

– 매개변수의 이름과 리턴 타입은 영향을 주지 않는다,

– 새로운 메서드를 만드는 것이다. (new의 개념)

 

 

13. @ – 어노테이션(annotation)

 

1) 원래 주석이라는 의미이다.

2) 컴파일러에게 특별한 정보를 제공해주는 역할을 한다.

3) @override – 재정의된 메서드라는 정보를 제공한다.

14. 고객관리 기존 프로그램 – 멤버십(예) 

1) 고객의 등급에 따른 차별화된 서비스

2) 할인율, 적립금이 다르게 적용

3) 기존 데이터 : 

 

* 일반 고객(Customer) 클래스

– 속성 : 고객 아이디, 고객 이름, 고객 등급, 보너스 포인트, 보너스 포인트 비율

– 물품 구매 시 1%의 보너스 포인트 적립 예) 10000원짜리 물건을 구매 => 100원 적립

– 기본 등급은 SILVER

 

* 우수고객(VIPCustomer) 클래스 : 제품 구매 시 10% 할인

– 물품 구매 시 보너스 포인트 5% 적립

– 담당 상담원 배정

(참고) Customer 클래스와  VIPCustomer 클래스를 따로 구현하는 것이 좋다. Customer를 확장하여 구현한다.(상속)

            

4) 위의 데이터와 다형성을 활용한 기존 프로그램 확장 : 중간 등급 고객(GoldCustomer) 만들기 (+ 혜택 : 제품 구매시 10% 할인, 보너스 포인트 2% 적립, 담당 상담원 미배정)


15. 클래스 설계(정의) 시 클래스 간의 관계 선택

 

1) Is-A 관계 (is a relationship : inheritance)

– 일반적인(general) 개념과 구체적인(specific) 개념과의 관계이다.

– 상위 클래스 : 하위 클래스보다 일반적인 개념이다.

– 하위 클래스 : 상위 클래스보다 구체적인 개념들이 더해진 것이다.

– 상속은 클래스 간의 결합도가 높은 설계(디자인)이다.

– 상위 클래스의 수정이 하위 클래스에 영향을 미칠 수 있다.( AppCompatActivity vs Activity )

– 계층구조가 복잡하거나 hierarchy가 높으면 좋지 않다.

 

2) Has-A 관계 (Composition)

– 클래스가 다른 클래스를 포함하는 관계이다.(변수로 선언한다.)

– 코드 재사용의 가장 일반적인 방법이다.

– 상속하지 않는다.