[Java] 상속과 인터페이스
참고 : 명품 JAVA Programming (개정 4판) 저자 황기태, 김효수
- 상속
- 클래스가 위 클래스를 상속받아 확장(extends)함을 의미
- 코드 중복을 제거하여 클래스를 간결하게 구현 가능
- 장점
- 클래스의 간결화
- 클래스 관리 용이
- S/W의 생산성 향상
- 부모 클래스를 슈퍼 클래스(super class), 상속받는 자식 클래스를 서브 클래스(sub class)라고 부름
- 상속을 선언할 때 확장한다는 뜻을 가진 extends 키워드를 사용
- 서브 클래스 객체 생성
Point p = new Point();
ColorPoint cp = new ColorPoint();
- 자바 상속의 특징
- 클래스의 다중 상속을 지원하지 않는다.
- 상속의 횟수를 제한을 두지 않는다.
- 계층 구조의 최상위에 java.lang.Object 클래스가 있다.
- 슈퍼 클래스의 접근 지정
슈퍼 클래스 멤버에 접근하는 클래스 종류 |
슈퍼 클래스 멤버의 접근 지정자 | |||
private | default | protected | public | |
같은 패키지에 있는 클래스 |
X | O | O | O |
다른 패키지에 있는 클래스 |
X | X | X | O |
같은 패키지에 있는 서브 클래스 |
X | O | O | O |
다른 패키지에 있는 서브 클래스 |
X | X | O | O |
- super()를 이용하여 명시적으로 슈퍼 클래스의 생성자 선택
- 서브 클래스의 생성자에서 super()을 이용하면, 슈퍼 클래스 생성자를 명시적으로 선택할 수 있음
- super()는 슈퍼 클래스 생성자를 호출하는 코드
- 업캐스팅
- 캐스팅(casting) : 타입 변환
- 업캐스팅(upcasting) 서브 클래스의 객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것
Person p;
Student s = new Student();
p = s; // 업캐스팅
- 다운캐스팅
- 업캐스팅과 반대로 캐스팅하는 것
- 업캐스팅과 달리 명시적으로 타입을 변환해야 함
- instanceof
- 자바에서 레퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해 사용하는 연산자
- 메소드 오버라이딩
- 슈퍼 클래스와 서브 클래스의 메소드 사이에 발생하는 관계
- 슈퍼 클래스에 선언된 메소드와 같은 이름, 리턴타입, 매개 변수 리스트를 갖는 메소드를 서브 클래스에 재작성 하는 것
- '슈퍼 클래스 메소드 무시하기 혹은 덮어쓰기'로 표현 할 수 있음 → 동적 바인딩
- 메소드 오버라이딩 제약 사항
- 슈퍼 클래스의 메소드와 동일한 원형으로 작성한다.
- 슈퍼 클래스 메소드의 접근 지정자보다 접근의 범위를 좁여 오버라이딩 할 수 없다.
- static, private, final로 선언된 메소드는 서브 클래스에서 오버라이딩 할 수 없다.
- 추상 클래스(abstract method)
- 선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 껍데기만 있는 메소드
- abstract 키워드와 함께 원형만 선언하고 코드는 작성하지 않음
- 객체(인스턴스)를 생성할 수 없음
- 추상 클래스를 단순히 상속받는 서브 클래스는 추상 클래스가 됨
- 추상 클래스에서의 구현이란, 슈퍼 클래스에 선언된 모든 추상 메소드를 서브 클래스에서 오버라이딩하여
실행 가능한 코드로 구현하는 것을 말함
- 추상 클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있음
- 계층적 상속 관계를 가지는 클래스들의 구조를 만들 때 적합
- 인터페이스(interface)
- S/W를 규격화된 모듈로 만들고, 서로 인터페이스가 맞는 모듈을 조립하듯이 응용프로그램을 작성할 수 있음
- interface 키워드를 사용
- 인터페이스 구성
- 필드(멤버 변수)를 만들 수 없음
- 추상 메소드는 public abstract로 정해져 있으며, 생략될 수 있고, 다른 접근 지정으로 지정될 수 없음
- default, private, static 메소드들은 모두 인터페이스 내에 코드가 작성되어 있어야 함
- default 메소드의 접근 지정은 public으로 고정
- private 메소드는 인터페이스 내에서만 호출 가능
- static 메소드의 경우 접근 지정이 생략되면 public이며, private로도 지정 가능
- 인터페이스는 객체를 생성할 수 없음
- 인터페이스 타입의 레퍼런스 변수는 선언 가능
- 인터페이스끼리 상속 가능
- 인터페이스를 상속받아 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현해야 함
- 인터페이스 구현
- implements 키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현한 클래스
- 인터페이스의 상속은 extends 키워드 사용, 인터페이스의 다중 상속 허용
- 클래스는 하나 이상의 인터페이스를 구현할 수 있는데, 이 경우 콤마로 각 인터페이스를 구분하여 나열하며,
각 인터페이스에 선언된 모든 추상 메소드를 구현해야 함
- 인터페이스 vs 추상 클래스
- 공통점
- 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스로만 사용
- 클래스의 다형성을 실현하기 위한 목적
- 차이점
비교 | 목적 | 구성 |
추상 클래스 | 서브 클래스에서 필요로 하는 대부분의 기능을 구현하여 두고 서브 클래스가 상속받아 활용할 수 있도록 하되, 서브 클래스에서 구현할 수 밖에 없는 기능만을 추상 메소드로 선언하여, 서브 클래스에서 구현하도록 하는 목적(다형성) | - 추상 메소드와 일반 메소드 모두 포함 - 상수, 변수 필드 모두 포함 |
인터페이스 | 객체의 기능을 모두 공개한 표춘화 문서와 같은 것으로, 개발자에게 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 목적(다형성) | - 변수 필드(멤버 변수)는 포함하지 않음 - 상수, 추상 메소드, 일반 메소드, default메소드, static 메소드 포함 - protected 접근 지정 선언 불가 - 다중 상속 지원 |
'Study > Java' 카테고리의 다른 글
[Java] 모듈과 패키지, 자바의 기본 패키지 (0) | 2022.06.22 |
---|---|
[Java] 클래스와 객체 (0) | 2022.05.27 |
[Java] 예외처리 (0) | 2022.05.17 |
[Java] 배열 (0) | 2022.05.17 |
[Java] 반복문 (0) | 2022.05.17 |