📌 상속 (Inheritance)
부모가 자식에게 물려주는 행위
부모 클래스의 필드와 메소드를 자식 클래스에게 물려줌
부모 클래스 수정 -> 모든 자식 클래스 수정
중복되는 코드를 줄이고 개발 시간을 단축
📌 클래스 상속 방법
extends 부모클래스
다중 상속 허용 X -> extends 뒤에 단 하나의 부모 클래스만 가능 (extends 부모1, 부모2 불가능)
public class 자식클래스 extends 부모클래스 {
...
}
📌 super()
부모 객체가 먼저 생성된 후에 자식 객체 생성
자식 생성자 내부 맨 첫 줄에 숨겨진 super()가 부모 생성자 호출
컴파일 과정에서 자동 추가
부모 클래스에 기본 생성자가 없으면 자식 생성자 선언에서 컴파일 에러
//자식 생성자 선언
public 자식클래스(...) {
super(); //생략되어있음
...
}
//자식 객체 생성
자식클래스 변수 = new 자식클래스(); //자식 생성자 호출 -> 내부의 super()로 부모 생성자 호출
📌 매개변수가 있는 생성자 super()
//자식 생성자 선언
public 자식클래스(...) {
super(매개값, ...); //생략 불가, 직접 추가하기
}
📌 메소드 오버라이딩 (Method Overriding)
상속된 메소드를 자식 클래스에서 재정의하는 것
부모 메소드는 숨겨지고, 자식 메소드 우선적 사용
📌 메소드 오버라이딩 규칙
부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 함
접근 제한을 더 강하게 오버라이딩할 수 없음 (public -> private 변경 불가)
새로운 예외를 thorws 할 수 없음
📌 @Override
컴파일 시, 정확히 오버라이딩이 되었는지 체크해 줌
문제가 있을 시, 컴파일 에러
생략 가능
public class Computer extends Calculator {
//메소드 오버라이딩
@Override
public double areaCircle(double r) {
System.out.println("Computer의 areaCircle() 실행");
return Math.PI * r * r;
}
}
📌 공동 작업 처리 기법
메소드 재정의 시, 일부만 변경한다고 해도 중복된 내용을 자식 메소드도 가지고 있어야 함
자식 메소드 내에서 부모 메소드를 호출하여 해결 => 공동 작업 처리 기법
super 키워드와 도트(.) 연산자 사용
부모 메소드 재사용으로 자식 메소드의 중복 작업 내용 없앰
class Parent {
public void method() {
...
}
}
class Child extends Parent {
@Override
void method() {
super.method(); //위치는 로직에 따라 적절하게 넣으면 됨
...
}
}
📌 final 클래스
최종적인 클래스 -> 더 이상 상속할 수 없는 클래스
부모 클래스가 될 수 없어 자식 클래스를 만들 수 없음
📌 final 메소드
최종적인 메소드 -> 오버라이딩 할 수 없는 메소드
부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 불가
📌 protected
(접근 제한 강화) private << default << protected << public
(접근 제한 약화)
제한 대상 : 필드, 생성자, 메소드
제한 범위 : 같은 패키지이거나, 자식 객체만 사용 가능
다른 패키지의 자식 객체의 경우, new 연산자로 부모 객체 직접 호출 불가
대신, 자식 생성자에서 super()로 생성자 호출
//protect 필드, 생성자, 메소드를 가진 부모 클래스
package package1;
public class A {
protected String field;
protected A() {
...
}
protected void method() {
...
}
}
//protected 부모 클래스와 다른 패키지에 있는 자식 클래스
package package2;
import package1.A;
public class B extends A {
//생성자 선언
public B() {
//A 생성자 호출 가능
super();
}
//메소드 선언
public void method1() {
//A 필드값 변경
this.field = "value";
//A 메소드 호출
this.method();
}
//new로 직접 호출 불가
/*
public void method2() {
A a = new A();
a.field = "value";
a.method();
}
*/
}