개발계발
상속 본문
상속이란?
말 그대로 부모가 자식에게 물려주는 행위로, 부모 클래스의 필드와 메소드를 자식 클래스에 물려줄 수 있다.
이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여 개발 시간을 단축한다.
사용법은 아래와 같다.
public class Parent {
int field1;
void method1() {
// 함수 로직
}
}
public class child extends Parent {
String field2;
void method2() {
// 함수 로직
}
}
위와 같이 하면 child 클래스에서 field1과 method1()를 사용할 수 있다.
자바는 다중 상속을 허용하지 않아서, extends 뒤에는 단 하나의 부모 클래스만이 올 수 있다.
그럼 자식 클래스는 어떻게 부모 클래스의 필드와 메서드를 사용하는 가?
부모 생성자 호출
부모 생성자는 자식 생성자의 맨 첫 줄에 super()에 의해 호출된다(숨겨져 있음)
아래 코드와 같다.
// 자식 생성자
public 자식클래스() {
super();
}
super()는 개발자가 따로 명시할 필요 없이, extends 키워드를 통해 컴파일 과정에서 자동 추가돼서 부모의 기본 생성자를 호출한다.
근데 부모 클래스에 생성자를 개발자가 따로 명시해놨다면?
-> 에러가 발생한다. super()키워드를 아래와 같이 명시해줘야한다.
// 자식 생성자
public 자식클래스() {
super(매개값, ...);
}
메소드 재정의
자식 클래스마다 부모 클래스의 메소드를 다르게 사용해야할 경우가 있다.
이럴 경우, 자식 클래스에서 부모 클래스의 메소드를 재정의해서 사용하는데, 이를 오버라이딩이라고 한다.
메소드를 오버라이딩해서 사용하는 경우 부모 클래스의 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.
오버라이딩할 경우 아래와 같은 규칙을 지켜야한다.
1. 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)가 부모 클래스의 메소드와 동일해야 한다.
2. 접근 제한을 더 강하게 오버라이딩할 수 없다.(public -> private으로 변경 불가)
아래 예시 코드를 보자
// 부모 클래스
public class Calculator {
// 메소드
public double areaCircle(double r) {
return 3.14159 * r * r
}
}
// 자식 클래스
public class Computer extends Calculator {
// 메소드 오버라이딩
@Override // 컴파일 시 오버라이딩이 규칙에 어긋나지 않았는지 체크해 줌(생략 가능)
public double areaaCircle(double r) {
return Math.PI * r * r;
}
}
위 코드를 보면, 부모 클래스인 Calculator의 3.14159를 자식 클래스인 Computer에서 보다 명확하게 사용하기 위해 Math.PI로 변경했다.
final 클래스, final 메소드
필드 선언 시 final을 붙이면 초기값 설정 후 값을 변경할 수 없었는데, 클래스와 메소드에도 final 키워드를 사용할 수 있다.
final 클래스
- 최종 클래스가 되어 더 이상 상속이 불가능 하다.(자식 클래스를 만들 수 없음)
final 메소드
- final 클래스와 마찬가지 개념으로, 최종적인 메소드가 되어 오버라이딩이 불가능한 메소드가 된다.
protected 접근 제한자
이전 포스팅에서 소개한 접근 제한자 중에 protected는 같은 패키지에서는 default처럼 접근 가능하나, 다른 패키지에서는 자식 클래스만 접근이 가능하다.(필드, 생성자, 메소드에 적용 가능)
아래 예시를 보자
public class Parent {
// 필드
protected String field;
// 생성자
protected A() {
}
// 메소드
protected void method() {
// 함수 로직
}
}
위와 같이 부모 클래스를 작성했을 경우, 같은 패키지에 있는 클래스와 다른 패키지에 있지만 상속받은 자식 클래스는 위의 필드, 생성자, 메소드를 사용가능하다.
'자바' 카테고리의 다른 글
인터페이스 (0) | 2024.05.02 |
---|---|
추상 클래스와 봉인 클래스 (0) | 2024.04.26 |
접근 제한자 (0) | 2024.04.26 |
final 키워드 (0) | 2024.04.26 |
인스턴스 멤버와 정적 멤버 (0) | 2024.04.26 |