참고 : 명품 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; // 업캐스팅
- 업캐스팅과 반대로 캐스팅하는 것
- 업캐스팅과 달리 명시적으로 타입을 변환해야 함
- 자바에서 레퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해 사용하는 연산자
- 슈퍼 클래스와 서브 클래스의 메소드 사이에 발생하는 관계
- 슈퍼 클래스에 선언된 메소드와 같은 이름, 리턴타입, 매개 변수 리스트를 갖는 메소드를 서브 클래스에 재작성 하는 것
- '슈퍼 클래스 메소드 무시하기 혹은 덮어쓰기'로 표현 할 수 있음 → 동적 바인딩
- 메소드 오버라이딩 제약 사항
- 슈퍼 클래스의 메소드와 동일한 원형으로 작성한다.
- 슈퍼 클래스 메소드의 접근 지정자보다 접근의 범위를 좁여 오버라이딩 할 수 없다.
- static, private, final로 선언된 메소드는 서브 클래스에서 오버라이딩 할 수 없다.
- 선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 껍데기만 있는 메소드
- abstract 키워드와 함께 원형만 선언하고 코드는 작성하지 않음
- 객체(인스턴스)를 생성할 수 없음
- 추상 클래스를 단순히 상속받는 서브 클래스는 추상 클래스가 됨
- 추상 클래스에서의 구현이란, 슈퍼 클래스에 선언된 모든 추상 메소드를 서브 클래스에서 오버라이딩하여
실행 가능한 코드로 구현하는 것을 말함
- 추상 클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있음
- 계층적 상속 관계를 가지는 클래스들의 구조를 만들 때 적합
- S/W를 규격화된 모듈로 만들고, 서로 인터페이스가 맞는 모듈을 조립하듯이 응용프로그램을 작성할 수 있음
- interface 키워드를 사용
- 필드(멤버 변수)를 만들 수 없음
- 추상 메소드는 public abstract로 정해져 있으며, 생략될 수 있고, 다른 접근 지정으로 지정될 수 없음
- default, private, static 메소드들은 모두 인터페이스 내에 코드가 작성되어 있어야 함
- default 메소드의 접근 지정은 public으로 고정
- private 메소드는 인터페이스 내에서만 호출 가능
- static 메소드의 경우 접근 지정이 생략되면 public이며, private로도 지정 가능
- 인터페이스는 객체를 생성할 수 없음
- 인터페이스 타입의 레퍼런스 변수는 선언 가능
- 인터페이스끼리 상속 가능
- 인터페이스를 상속받아 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현해야 함
- implements 키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현한 클래스
- 인터페이스의 상속은 extends 키워드 사용, 인터페이스의 다중 상속 허용
- 클래스는 하나 이상의 인터페이스를 구현할 수 있는데, 이 경우 콤마로 각 인터페이스를 구분하여 나열하며,
각 인터페이스에 선언된 모든 추상 메소드를 구현해야 함
- 공통점
- 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스로만 사용
- 클래스의 다형성을 실현하기 위한 목적
- 차이점
비교 |
목적 |
구성 |
추상 클래스 |
서브 클래스에서 필요로 하는 대부분의 기능을 구현하여 두고 서브 클래스가 상속받아 활용할 수 있도록 하되, 서브 클래스에서 구현할 수 밖에 없는 기능만을 추상 메소드로 선언하여, 서브 클래스에서 구현하도록 하는 목적(다형성) |
- 추상 메소드와 일반 메소드 모두 포함
- 상수, 변수 필드 모두 포함 |
인터페이스 |
객체의 기능을 모두 공개한 표춘화 문서와 같은 것으로, 개발자에게 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 목적(다형성) |
- 변수 필드(멤버 변수)는 포함하지 않음
- 상수, 추상 메소드, 일반 메소드, default메소드, static 메소드 포함
- protected 접근 지정 선언 불가
- 다중 상속 지원 |