[Design Pattern] 상속, 다형성 - 개념 정리

- 본 정리는 강의 공부를 위해 상속에 대해 요약한 자료입니다. -


상속, 다형성

* 부모 클래스(필드, 메소드) -> 자식클래스

* 상속의 장점

* 클래스 간결화
* 클래스 관리 용이
* 소프트웨어 생산성 향상

* 상속 선언

* 부모: public class Person{ … }
* 자식: public class Student extends Person{ … }
* 다중 상속 지원 X (부모 여러 개), 상속 횟수 무제한
* 상속의 최상위 조상 클래스 - java.lang.Object (컴파일러 자동)

* 접근 지정자

* public: 다른 모든 클래스 접근 허용
* protected: 같은 패키지 내 모든 클래스, 다른 패키지라도 서브클래스는 슈퍼클래스의 protected 멤버 접근 가능
* default: 패키지 내 모든 클래스
* private: 클래스 내의 멤버만 접근 허용
* 부모 클래스에 private 변수 --> public Setter, Getter 메소드 사용

* 생성자

* 서브 클래스 객체 생성시 슈퍼클래스/서브클래스 생성자 모두 실행
* 서브 호출 --> 슈퍼 호출 --> 슈퍼 실행 --> 서브 실행 (생성자)
* 여러 생성자 작성 가능, 슈퍼 생성자 없으면 기본 생성자 선택됨
* 서브 클래스에서 슈퍼 클래스 생성자 선택 ? super(param) 이용
* 서브에서 b(int x) 생성자 호출 시 슈퍼의 a() 생성자 호출됨
* 따로 지정하고 싶으면 서브의 생성자 첫 라인에 super() 호출

* 업캐스팅

* 서브 클래스 --> 슈퍼 클래스 type 변환
* Student s = new Student();
Person p = (Person) s; --> (Person) 생략가능
* 객체 내의 슈퍼 클래스 멤버만 접근 가능 (범위 좁아짐)
* 업캐스팅 레퍼런스가 가리키는 객체는 알 수 없음

* 다운캐스팅

* 업캐스팅된 것을 원상태로 돌리는 것
* 슈퍼 클래스 --> 서브 클래스 type 변환
* 명시적 타입 변환 표시 필요 - Student s = (Student) p;
* 슈퍼 클래스, 서브 클래스 멤버 모두 접근 가능 (범위 넓어짐)
* A instanceof B 연산자: A가 B의 타입인지 true/false 리턴

* 메소드 오버라이딩

* 슈퍼 클래스 메소드 --> 서브 클래스에서 재정의
* 슈퍼 클래스 메소드 이름, 매개변수 타입, 개수, 리턴 타입 모두 동일하게 작성
* 동적 바인딩 (다형성 실현)
* 서브 클래스에 오버라이딩된 메소드가 무조건 실행
* super 키워드: 정적 바인딩으로 처리 only 사용 in 서브클래스
         

* 추상 메소드

* 선언 O 구현 X 메소드 ? public abstract void set(~)
* 서브 클래스에서 오버라이딩하여 구현
* 추상 메소드 하나라도 가지면 클래스 앞에 abstract 선언
* 추상 메소드 없어도 추상 클래스 사용하려면 abstract 선언

* 추상 클래스

* 실체 클래스의 공통적인 부분 (변수, 메소드) 추출해서 선언함
* 추상 클래스는 객체 생성 불가 ? 아직은 실체성이 없기 때문
* 추상 클래스의 상속
* 단순 상속: 서브 클래스도 abstract 선언, 추상 클래스 상속받아서 추상 메소드 구현하지 않으면 추상 클래스 됨
* 구현 상속: 서브 클래스는 추상 클래스 X, 서브 클래스에서 슈퍼 클래스의 추상 메소드 구현 (오버라이딩)
* 설계, 구현 분리 ? 원형의 형태 정의
* 슈퍼 클래스: 추상적 개념, 서브 클래스: 구체적 행위

* 인터페이스 (규격 선언 - 다형성)

* 클래스가 구현할 메소드들이 선언되는 추상형 (객체 생성 불가)
* 목적: 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록
* public interface driver { … } - 필드, 선언 불가



* 구성 요소

* 상수: public만 허용, public static final 생략
* 추상 메소드: public abstract 생략
* default 메소드: 인터페이스 구현 클래스에 자동 상속, public 생략
* private: 인터페이스 내에 메소드 코드 작성 필요, 다른 메소드에 의해서만 호출 가능
* static: public, private 모두 지정 가능, 생략 시 public
* 인터페이스 상속받는 클래스 - 인터페이스의 모든 추상 메소드 구현
* Class Samsung implements PhoneInterface { … }
* 레퍼런스 변수 선언 가능 - PhoneInterface galaxy;
* 인터페이스가 다른 인터페이스 상속 가능
* 다중 상속 가능 - ~ extends interface1, interface2 { … }

* 추상 클래스 VS 인터페이스

* 공통점: 다형성 실현, 객체 생성 X, 상속 위한 슈퍼클래스로만 사용
* 차이점


# References
https://limkydev.tistory.com/188
http://tcpschool.com/java/java_inheritance_overriding

x

댓글 없음:

Powered by Blogger.