상속
이미 구현된 클래스보다 더 구체적은 기능을 가진 클래스 구현 시 기존 클래스 상속
용어 : 상위 클래스(A), 하위 클래스(B), A 클래스가 B 클래스에게 상속함, B 클래스가 A 클래스를 상속받음
extends 키워드 뒤에는 하나의 클래스만 올 수 있음 (단일 상속)
class B extends A { }
protected 접근 제어자
상위 클래스에 선언된 private 멤버 변수는 하위 클래스에서 접근 할 수 없음
외부 클래스는 접근 불가능, 하위 클래스는 접근 가능 -> protected 접근 제어자
하위 클래스 생성 과정
하위 클래스를 생성하면 상위 클래스가 먼저 생성 됨
클래스가 상속 받은 경우 하위 클래스 생성자는 반드시 상위 클래스 생성자 호출
super 키워드
하위 클래스에서 가지는 상위 클래스에 대한 참조 값
super() 는 상위 클래스의 기본 생성자 호출
super는 상위 클래스 인스턴스의 참조 값 가짐 -> 상위 클래스의 메서드나 멤버 변수에 접근 가능
형 변환(업캐스팅)
Customer lee = new VIPCustomer();
VIPCustomer vCustomer = new VIPCustomer();
addCustomer(vCustomer);
int addCustomer(Customer customer) { }
하위 클래스는 상의 클래스 타입 내포함 -> 상위 클래스로 묵시적 형 변환 가능
상속 관계에서 모든 하위 클래스는 상위 클래스로 형 변환(업캐스팅) 가능 (역은 성립 X)
형 변환과 메모리
VIPCustomer() 생성자 -> VIPCustomer 클래스의 모든 멤버 변수에 대한 메모리 생성
변수 타입이 Customer -> 실제 접근 가능한 변수나 메서드는 Customer의 변수와 메서드
Customer vc = new VIPCustomer();
하위 클래스에서 메서드 재정의 하기
@Overrding 애노테이션(annotation)
주석의 의미를 가짐
컴파일러에게 특별한 정보 제공 (@Overrdie : 재정의된 메서드라는 정보 제공)
형 변환과 오버라이딩 메서드 호출
자바에서는 항상 인스턴스의 메서드가 호출
자바의 모든 메서드는 가상 메서드(virtual method)
메서드는 어떻게 호출되고 실행 되는가?
메서드 이름은 주소값 나타냄
메서드는 명령어의 집합이고 프로그램 로드 시 메서드 영역(코드 영역)에 명령어 집합이 위치
해당 메서드 호출 시 명령어 집합이 있는 주소를 찾아 명령어 실행됨
메서드에서 사용하는 변수들은 스택 메모리에 위치함
다른 인스턴스라도 같은 메서드 코드는 같은 메서드 호출됨
인스턴스 생성 시 변수는 힙 메모리에 따로 생성됨
메서드 명령어 집합은 처음 한 번만 로드
가상 메서드 원리
가상 메서드 테이블(virtual method table)에서 해당 메서드에 대한 주소 가지고 있음
재정의 된 경우, 재정의 된 메서드 주소 가리킴
다형성을 사용하는 이유?
상위 클래스에서는 공통적인 부분 제공
하위 클래스에서는 각 클래스에 맞는 기능 구현
여러 클래스를 상위 클래스로 핸들링 할 수 있음
IS-A 관계 (is a relationship : inheritance)
일반적인 & 구체적인 개념 관계
상속
HAS-A 관계 (composition)
클래스가 다른 클래스를 포함하는 관계 (ex. Student, Subject / Library, ArrayList)
상속하지 않음
다운 캐스팅(downcasting)
Customer vc = new VIPCustomer(); // 업캐스팅
VIPCustomer vCustomer = (VIPCustomer)vc; // 다운캐스팅
추상 클래스란?
구현 코드 없이 메서드 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
메서드 선언(declaration) : 반환타입, 메서드 이름, 매개변수
메서드 정의(definition) : 메서드 구현과 동일한 의미, 구현부 가짐
abstract 예약어 사용
new (인스턴스화) 불가능
int add(int x, int y) // 선언
int add(int x, int y) {} // 구현부 존재, 추상 메서드 아님
abstract로 선언된 메서드 가진 클래스는 abstract로 선언
모든 메서드가 구현된 클래스여도 abstract로 선언되면 추상 클래스로 인스턴스화 불가능
추상 클래스의 추상 메서드는 하위 클래스가 상속하여 구현
템플릿 메서드
코드의 흐름(시나리오) 정의하는 메서드
final로 선언하여 하위 클래스에서 재정의 불가능 하게 함
프레임워크에서 많이 사용되는 설계 패턴
상위 클래스에서 메서드 및 추상 메서드 선언하고 final 키워드 이용해 run() 함수 구현
하위 클래스에서 추상 메서드 구현
final 예약어
final 메서드 : 하위 클래스에서 재정의 불가능한 베서드
final 클래스 : 상속할 수 없는 클래스
final 변수 : 값이 변경될 수 없는 상수
public static final double PI = 3.14;
인터페이스란?
모든 메서드가 추상 메서드로 선언 (ex. public abstract)
모든 변수는 상수로 선언됨 (ex. public static final)
자바8 부터 디폴트 메서드(default method)와 정적 메서드(static method) 기능의 제공으로 일부 구현 코드 존재
인터페이스 구현과 형 변환
인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 가능
상속에서의 형 변환과 동일한 의미
구현 코드가 없으므로 여러 인터페이스 구현 가능
형 변환되는 경우 인터페이스에 선언된 메서드만을 사용 가능
인터페이스가 하는 일
클래스나 프로그램이 제공하는 기능 명시적으로 선언
클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스 사용 가능
어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드 구현함을 의미
인터페이스를 구현한 다양한 객체 사용 - 다형성
ex. JDBC 인터페이스
상수
double PI = 3.14;
int ERROR = -9999;
추상 메서드
디폴트 메서드 (자바 8이후)
구현을 가지는 메서드
인터페이스 구현 클래스에서 공통으로 사용 가능한 기본 메서드
인터페이스 구현한 클래스의 인스턴스가 생성 되어야 사용 가능
default 키워드 사용, 구현하는 클래스에서 재정의 가능
default void description() { }
@Override
public void description() { }
정적 메서드
static int total(int [] arr) { ... }
private 메서드 (자바 9 이후)
인터페이스를 구현한 클래스에서 사용하거나 재정의 불가능
인터페이스 내부에서만 사용하기 위해 구현하는 메서드
default 메서드나 static 메서드에서 사용 가능
private void myMethod() { ... }
private static void mystaticMethod() { ... }
여러 인터페이스 구현
자바의 인터페이스는 구현 코드가 없음 -> 하나의 클래스가 여러 인터페이스 구현 가능
디폴트 메서드가 중복 되는 경우, 구현하는 클래스에서 재정의
여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환되는 경우, 인터페이스에 선언된 메서드만 사용 가능
디폴트 메서드가 중복 되는 경우
인터페이스의 상속
인터페이스 사이에도 상속 가능
extends 키워드 사용
다중 상속 가능, 구현 코드의 상속 불가능 -> 타입 상속이라고 함