상속과 다형성
상속이란
- 다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능
상속의 목적
- 클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약 정의
상속의 장점
- 보다 적은 양의 코드로 새로운 클래스 작성 가능
- 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경 용이
- 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여
상속의 특징
1. 모든 클래스는 Object 클래스의 후손
- Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 가능
ex) java.lang.String 클래스의 equals()와 toString()
2. 부모 클래스의 생성자, 초기화 블록은 상속 안 됨
- 자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행
- 자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶으면 super() 활용
3. 부모의 private 멤버는 상속은 되지만 직접 접근 불가
- 자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우, 자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가 super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나 setter, getter 메소드를 이용하여 접근
상속방법
- 클래스 간의 상속 시에는 extends 키워드 사용
표현식
- [접근제한자] class 클래스명 extends 클래스명{}
ex) public class Changhee extends Person{}
단일 상속과 다중 상속
1. 단일 상속(Single Inheritance)
- 클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드 작성
- 자바에서는 다중 상속 미지원 -> 단일상속만 지원
super()와 super
1. super()
- 부모 객체의 생성자를 호출하는 메소드로 기본적으로 후손 생성자에 부모 생성자 포함 후손 객체 생성 시에는 부모부터 생성이 되기 때문에 후손 클래스 생성자 안에는 부모 생성자를 호출하는 super()가 첫 줄에 존재 (부모 생성자가 가장 먼저 실행되어야 하기 때문에 명시적으로 작성 시에도 반드시 첫 줄에만 작성) 매개변수 있는 부모 생성자 호출은 super(매개변수, 매개변수)를 넣으면 됨
2. super.
- 상속을 통한 자식 클래스 정의 시 해당 자식 클래스의 부모 객체를 가리키는 참조변수 자식 클래스 내에서 부모 클래스 객체에 접근하여 필드나 메소드 호출 시 사용
다형성
- 객체지향 프로그래밍의 3대 특징 중 하나로 ‘여러 개의 형태를 갖는다’는 의미 하나의 행동으로 여러 가지 일을 수행하는 개념 상속을 이용한 기술로 부모 타입으로부터 파생된 여러 가지 타입의 자식 객체를 부모 클래스 타입 하나로 다룰 수 있는 기
업 캐스팅
- 상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있음
ex) Phone p = new Iphone();
* 자식 객체의 주소를 전달받은 부모타입의 참조변수를 통해서 사용할 수 있는 후손의 정보는 원래 부모타입이었던 멤버만 참조 가능
다운 캐스팅
- 자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우, 부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형 변환하는 것 자동으로 처리되지 않기 때문에 반드시 후손 타입 명시해서 형 변환
ex) Phone p = new Iphone();
((Phone)p).call();
* 클래스 간의 형 변환은 반드시 상속 관계에 있는 클래스끼리만 가능
추상 클래스(abstract class)
- 몸체 없는 메소드를 포함한 클래스
- 추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용
ex) [접근제한자] abstract class 클래스명 {}
추상 메소드(abstract method)
- 몸체 없는 메소드
- 추상 메소드의 선언부에 abstract 키워드 사용
- 상속 시 반드시 구현해야 하는, 오버라이딩이 강제화 되는 메소드
ex) [접근제한자] abstract 반환형 메소드명(자료형 변수명);
추상 클래스의 특징
1. 미완성 클래스(abstract 키워드 사용) 자체적으로 객체 생성 불가 → 반드시 상속하여 객체 생성
2. abstract 메소드가 포함된 클래스는 반드시 abstract 클래스 abstract 메소드가 없어도 abstract 클래스 선언 가능
3. 클래스 내에 일반 변수, 메소드 포함 가능
4. 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능
추상 클래스의 장점
- 일관된 인터페이스 제공
- 꼭 필요한 기능 강제화(공통적이나 자식클래스에서 특수화 되는 기능)
인터페이스
- 상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체 메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것으로 상속 시 인터페이스 내에 정의된 모든 추상메소드 구현해야 함
1. 특징
- 모든 인터페이스의 메소드는 묵시적으로 public이고 abstract
- 변수는 묵시적으로 public static final, 따라서 인터페이스 변수의 값 변경 시도 시 컴파일 시 에러 발생
- 객체 생성은 안되나 참조형 변수로는 가능
2. 장점
- 상위 타입 역할로 다형성을 지원하여 연결
- 해당 객체가 다양한 기능 제공 시에도 인터페이스에 해당하는 기능만을 사용하게 제한 가능
- 공통 기능 상의 일관성 제공
- 공동 작업을 위한 인터페이스 제공