* 공부 정리일자 (2022년 8~12월)
- 책 : 명품 자바 에센셜
- 개인적으로 공부 및 복습하면서 정리한 내용입니다. (사진 제외)
* 목차
5장. 상속
5.1 상속의 개념
5.2 클래스 상속과 객체
5.3 protected 접근 지정
5.4 상속과 생성자
5.5 업캐스팅과 instanceof 연산자
5.6 메소드 오버라이딩
5.7 추상 클래스
5.8 인터페이스
1. 복습 (중요 키워드 위주)
5) 5강. 상속 (책 191p)
5.1) 상속의 개념 (책 191p)
* 상속 (inheritance)
- 객체 지향 상속
- 자식이 부모 유전자를 물려 받는 것과 유사한 개념
* 상속의 필요성
- 상속이 없는 경우 중복된 멤버를 가진 4 개의 클래스 구성해야 함
- 상속을 이용한 경우 중복이 제거되고 간결해진 클래스 구조
5.2) 클래스 상속과 객체 (책 192p)
(1) 자바의 상속 선언
- extends 키워드로 선언
-- 부모 클래스를 물려받아 확장한다는 의미
* 부모 클래스 -> 슈퍼 클래스(super class)
* 자식 클래스 -> 서브 클래스(sub class)
- ColorPoint는 Point를 물려 받으므로, Point에 선언된 필드와 메소드 선언 필요 없음
(2) 상속과 객체
* 예제 5-1 : 클래스 상속
- (x, y)의 한 점을 표현하는 Point 클래스와 이를 상속받아 점에 색을 추가한 ColorPoint 클래스를 만들고 활용해보자.
* 서브 클래스 객체의 모양 (194p)
- 슈퍼 클래스 객체와 서브 클래스의 객체는 별개
- 서브 클래스 객체는 슈퍼 클래스 멤버 포함
* 서브 클래스에서 슈퍼 클래스 멤버 접근
(3) 자바 상속의 특징
* 클래스 다중 상속(multiple inheritance) 불허
- C++는 다중 상속 가능
-- C++는 다중 상속으로 멤버가 중복 생성되는 문제 있음
- 자바는 인터페이스(interface)의 다중 상속 허용
* 모든 자바 클래스는 묵시적으로 Object클래스 상속받음
- java.lang.Object는 클래스는 모든 클래스의 슈퍼 클래스
5.3) protected 접근 지정 (책 197p)
(1) 슈퍼 클래스의 멤버에 대한 서브 클래스의 접근
* 슈퍼 클래스의 private 멤버
- 서브 클래스에서 접근할 수 없음
* 슈퍼 클래스의 디폴트 멤버
- 서브 클래스가 동일한 패키지에 있을 때, 접근 가능
* 슈퍼 클래스의 public 멤버
- 서브 클래스는 항상 접근 가능
* 슈퍼 클래스의 protected 멤버
- 같은 패키지 내의 모든 클래스 접근 허용
- 패키지 여부와 상관없이 서브 클래스는 접근 가능
* 슈퍼 클래스 멤버의 접근 지정자
(2) protected 멤버
* protected 멤버에 대한 접근
- 같은 패키지의 모든 클래스에게 허용
- 상속되는 서브 클래스(같은 패키지든 다른 패키지든 상관 없음)에게 허용
5.4) 상속과 생성자 (책 198p)
(1) 서브 클래스/슈퍼 클래스의 생성자 호출과 실행
* 서브 클래스의 객체가 생성될 때
- 슈퍼클래스 생성자와 서브 클래스 생성자 모두 실행
* 서브 클래스의 객체가 생성 - 호출 순서
- 서브 클래스의 생성자 먼저 호출,
- 서브 클래스의 생성자는 실행 전 슈퍼 클래스 생성자 호출
* 서브 클래스의 객체가 생성 - 실행 순서
- 슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자 실행
* 슈퍼 클래스와 서브 클래스의 생성자 호출 및 실행 관계
(2) 서브 클래스와 슈퍼 클래스의 생성자 선택 (책 199p)
* 슈퍼 클래스와 서브 클래스
- 각각 여러 개의 생성자 작성 가능
* 서브 클래스의 객체가 생성될 때
- 슈퍼 클래스 생성자 1 개와 서브 클래스 생성자 1개가 실행
* 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 결정되는 방식
1. 개발자의 명시적 선택
- 서브 클래스 개발자가 슈퍼 클래스의 생성자 명시적 선택
- super() 키워드를 이용하여 선택
2. 컴파일러가 기본생성자 선택
- 서브 클래스 개발자가 슈퍼 클래스의 생성자를 선택하지 않는 경우
- 컴파일러가 자동으로 슈퍼 클래스의 기본 생성자 선택
(2.1) 컴파일러에 의해 슈퍼 클래스의 기본 생성자가 묵시적 선택 (2.1.1) 아래
* 개발자가 서브 클래스의 생성자에 대해
슈퍼 클래스의 생성자를 명시적으로 선택하지 않은 경우
* 슈퍼 클래스에 기본 생성자가 없어 오류 난 경우
(2.1.2) 서브 클래스의
매개 변수를 가진 생성자에 대해서도
슈퍼 클래스의 기본 생성자가 자동 선택 ->
* 개발자가 서브 클래스의 생성자에 대해
슈퍼 클래스의 생성자를 명시적으로 선택하지 않은 경우
(2.2) super()로 슈퍼 클래스의 생성자 명시적 선택
* super()
- 서브 클래스에서 명시적으로 슈퍼 클래스의 생성자 선택 호출
* 사용 방식
- super(parameter);
- 인자를 이용하여 슈퍼 클래스의 적당한 생성자 호출
- 반드시 서브 클래스 생성자 코드의 제일 첫 라인에 와야 함
(2.2.1) super()로 슈퍼 클래스의 생성자를 명시적으로 선택한 사례
(2.2.2) 예제 5-2 : super()를 활용한 ColorPoint 작성
- super()를 이용하여 ColorPoint 클래스의 생성자에서 서브 클래스 Point의 생성자를 호출하는 예를 보인다.
5.5) 업캐스팅과 instanceof 연산자 (책 204p)
(1) 업캐스팅 개념
* 업캐스팅 (upcasting)
- 서브 클래스의 레퍼런스를 슈퍼 클래스 레퍼런스에 대입
- 슈퍼 클래스 레퍼런스로 서브 클래스 객체를 가리키게 되는 현상
* 업캐스팅 사례
(2) 다운캐스팅 (downcasting)
- 슈퍼 클래스 레퍼런스를 서브 클래스 레퍼런스에 대입
- 업캐스팅된 것을 다시 원래대로 되돌리는 것
- 반드시 명시적 타입 변환 지정
(2.1) 다운캐스팅 사례
(3) instanceof 연산자와 객체 구별 (업캐스트 레퍼런스)
* 업캐스팅된 레퍼런스로는 객체의 실제 타입을 구분하기 어려움
- 슈퍼 클래스는 여러 서브 클래스에 상속되기 때문
- 예) 아래의 클래스 계층 구조에서, p가 가리키는 객체가 Person 객체인지, Student 객체인지, Professor 객체인지 구분하기 어려움
(3.1) instanceof 연산자 사용
* instanceof 연산자
- 레퍼런스가 가리키는 객체의 타입 식별
* instanceof 연산자 사용 사례
(3.2) 예제 5-3 : instanceof 연산자 활용
5.6) 메소드 오버라이딩 (책 210p)
(1) 메소드 오버라이딩의 개념
* 메소드 오버라이딩 (Method Overriding)
- 서브 클래스에서 슈퍼 클래스의 메소드 중복 작성
- 슈퍼 클래스의 메소드 무력화, 항상 서브 클래스에 오버라이딩한 메소드가 실행되도록 보장됨
- “메소드 무시하기”로 번역되기도 함
* 오버라이딩 조건
- 슈퍼 클래스 메소드의 원형(메소드 이름, 인자 타입 및 개수, 리턴 타입) 동일하게 작성
(1.1) 서브 클래스 객체와 오버라이딩된 메소드 호출 - 오버라이딩한 메소드가 실행됨을 보장
(2) 오버라이딩의 목적, 다형성 실현
* 오버라이딩으로 다형성 실현
- 하나의 인터페이스(같은 이름)에 서로 다른 구현
- 슈퍼 클래스의 메소드를 서브 클래스에서 각각 목적에 맞게 다르게 구현
* 사례
- Shape의 draw() 메소드를 Line, Rect, Circle에서 오버라이딩하여 다르게 구현
(2.1) 예제 5-4 : 메소드 오버라이딩으로 다형성 실현
- Shape의 draw() 메소드를 Line, Circle, Rect 클래스에서 목적에 맞게 오버라이딩하는 다형성의 사례를 보여준다.
* 예제 5-4 실행 과정
(3) 동적 바인딩 사례 - 오버라이딩된 메소드 호출
(4) 오버라이딩과 super 키워드
- super 키워드로 슈퍼 클래스의 멤버 접근
* super
- 슈퍼 클래스의 멤버를 접근할 때 사용되는 레퍼런스
super.슈퍼클래스의멤버
- 서브 클래스에서만 사용
- 슈퍼 클래스의 필드 접근
- 슈퍼 클래스의 메소드 호출 시
- super로 이루어지는 메소드 호출 : 정적 바인딩
(5) 오버로딩과 오버라이딩
5.7) 추상 클래스 (책 218p)
(1) 추상 메소드 (abstract method)
- abstract로 선언된 메소드, 메소드의 코드는 없고 원형만 선언
(2) 추상 클래스 (abstract class)
- 추상 메소드를 가지며, abstract로 선언된 클래스
- 추상 메소드 없이, abstract로 선언한 클래스
(3) 추상 클래스의 인스턴스 생성 불가
- 추상 클래스는 온전한 클래스가 아니기 때문에 인스턴스를 생성할 수 없음
(4) 추상 클래스의 상속과 구현
(4.1) 추상 클래스 상속
- 추상 클래스를 상속받으면 추상 클래스가 됨
- 서브 클래스도 abstract로 선언해야 함
(4.2) 추상 클래스 구현
- 서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)
- 추상 클래스를 구현한 서브 클래스는 추상 클래스 아님
(5) 추상 클래스의 목적
* 추상 클래스의 목적
- 상속을 위한 슈퍼 클래스로 활용하는 것
- 서브 클래스에서 추상 메소드 구현
- 다형성 실현
(5.1) 예제 5-5 : 추상 클래스의 구현
- 추상 클래스 Calculator를 상속받는 GoodCalc 클래스를 구현하라.
(5.2) 예제 5-5 정답
5.8) 인터페이스 (책 223p)
(0) 인터페이스의 필요성
(1) 자바의 인터페이스
* 자바의 인터페이스
- 클래스가 구현해야 할 메소드들이 선언되는 추상형
* 인터페이스 선언
- interface 키워드로 선언
- Ex) public interface SerialDriver {…}
* 자바 인터페이스에 대한 변화
- Java 7까지
-- 인터페이스는 상수와 추상 메소드로만 구성
- Java 8부터
-- 상수와 추상메소드 포함
-- default 메소드 포함 (Java 8)
-- private 메소드 포함 (Java 9)
-- static 메소드 포함 (Java 9)
* 여전히 인터페이스에는 필드(멤버 변수) 선언 불가
(1.1) 자바 인터페이스 사례
(1.2) 인터페이스의 구성 요소들의 특징
* 인터페이스의 구성 요소들
* 상수
- public만 허용, public static final 생략
* 추상 메소드
- public abstract 생략 가능
* default 메소드
- 인터페이스에 코드가 작성된 메소드
- 인터페이스를 구현하는 클래스에 자동 상속
- public 접근 지정만 허용. 생략 가능
* private 메소드
- 인터페이스 내에 메소드 코드가 작성되어야 함
- 인터페이스 내에 있는 다른 메소드에 의해서만 호출 가능
* static 메소드
- public, private 모두 지정 가능. 생략하면 public
* 인터페이스의 객체 생성 불가
* 인터페이스 타입의 레퍼런스 변수 선언 가능
(2) 인터페이스 상속
* 인터페이스 간에 상속 가능
* 인터페이스를 상속하여 확장된 인터페이스 작성 가능
- extends 키워드로 상속 선언
* 인터페이스 다중 상속 허용
(3) 인터페이스 구현
* 인터페이스의 추상 메소드를 모두 구현한 클래스 작성
- implements 키워드 사용
- 여러 개의 인터페이스 동시 구현 가능
* 인터페이스 구현 사례
- PhoneInterface 인터페이스를 구현한 SamsungPhone 클래스
- SamsungPhone 클래스는 PhoneInterface의 default 메소드상속
(3.1) 예제 5-6 인터페이스 구현
- PhoneInterface 인터페이스를 구현하고 flash() 메소드를 추가한SamsungPhone 클래스를 작성하라.
(3.2) 예제 5-7 : 인터페이스 구현과 동시에 슈퍼 클래스 상속
'프로그래밍 공부 > Java' 카테고리의 다른 글
[ Java 프로그래밍 ] 공부 정리 - 8강. 자바 GUI 스윙 기초 (0) | 2023.04.30 |
---|---|
[ Java 프로그래밍 ] 공부 정리 - 6강. 모듈과 패키지 개념, 자바 패키지 활용 (0) | 2023.04.30 |
[ Java 프로그래밍 ] 공부 정리 - 4장 본문 퀴즈 및 연습문제 (0) | 2023.04.30 |
[ Java 프로그래밍 ] 공부 정리 - 3장 본문 퀴즈 및 연습문제 (0) | 2023.04.30 |
[ Java 프로그래밍 ] 공부 정리 - 2장 본문 퀴즈 및 연습문제 (0) | 2023.04.30 |