나는개발자니까
[Java] Chapter 7.1 상속 본문
상속의 개요
상속은 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 떄문에 중복되는 코드를 줄여준다.
또한 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져와 유지 보수 시간을 최소화할 수 있다.
클래스 상속
프로그램에서의 상속은 자식클래스가 부모클래스를 선택한다. 자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정하고 extends 뒤에 작성한다.
class 자식클래스 extends 부모클래스 {
// 클래스의 3요소
// 1. 필드
// 2. 생성자
// 3. 메소드
}
* 상속 시 주의해야 할 점
1. 여러 개의 부모 클래스를 상속할 수 없다. extends 뒤에는 하나의 부모클래스만 작성할 수 있다.
2. 필드, 생성자, 메서드에 붙는 접근제한자를 주의해야한다. 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다. 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외된다.
부모 생성자 호출
자바에서 자식 객체를 생성하면 부모 객체가 먼저 생성되고 그 다음에 자식 객체가 생성된다.
객체를 생성하기 위해서는 생성자를 호출해야하는데 자식 객체를 생성할때 어떻게 부모 객체가 먼저 생성될까?
자식클래스의 첫번째 줄에 부모클래스의 생성자가 호출되기 때문이다.
자식클래스에서 부모클래스의 생성자를 호출하는 방법은 2가지가 있다.
1 ) 부모클래스에 생성자가 선언되어 있을 경우
부모클래스에 생성자가 선언되어 있을 경우, 자식 클래스에서 컴파일러가 super 메서드를 사용해 부모클래스의 기본 생성자를 자동으로 호출한다.
public 부모클래스() {
// 생성자
public ..() {
}
}
public 자식클래스() {
// 컴파일러에서 부모의 생성자를 호출하는 super() 메서드를 호출한다.
// super();
}
2 ) 부모클래스에 생성자가 선언되어 있지 않을 경우
public 부모클래스() {
// 생성자 선언 X
}
public 자식클래스() {
super();
}
메소드 재정의
부모 클래스에서 사용하는 메서드가 자식 클래스에서 변경할 필요가 없다면 좋지만 자식 클래스에 적합하지 않을 경우 변경해야 할 때도 있다. 이럴 경우 상속된 일부 메서드는 자식 클래스에서 다시 수정해서 사용해야 하는데 이것을 메소드 재정의라고 한다.
메소드 재정의는 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것이다.
* 메소드 재정의 방법
1. 부모와 메소드와 동일한 리턴 타입, 메소드 이름, 매개 변수 목록이 있어야한다.
2. 접근 제한을 더 강하게 재정의할 수 없다. public 접근 제한을 가지고 있는 경우 재정의하는 자식 메소드는 default나 private 접근 제한으로 수정할 수 없다.
* 반대로, 부모 메소드가 default 접근 제한을 가지면 재정의하는 자식 메소드는 default 또는 public 접근 제한을 가질 수 있다.
3. 새로운 예외 (Exception)을 throws 할 수 없다.
부모 메소드 호출
자식 클래스에서 부모 클래스의 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨지고 재정의된 자식 메소드만 사용된다. 하지만 부모 클래스의 메소드를 호출하고 싶을때 super.부모메소드( )를 사용한다.
class Parent {
void method1() { ... }
void method2() { ... }
}
class Child extends Parent {
void method2() { ... }
void method3() { ... }
method2(); // 재정의된 메서드를 호출한다.
super.method2(); // 부모 클래스의 재정의되기 전 메소드를 호출한다.
}
static 필드 vs static 클래스 vs static 메소드
static 필드
객체를 생성하지 않고 클래스로 호출할 수 있다.
메모리를 공유하기 때문에 여러 객체들이 동일한 데이터를 사용할 수 있다. 스태틱 영역에 저장되어 프로그램이 종료될 때까지 메모리상에 남는다.
static 클래스
new 키워드를 사용해서 객체를 만들 수 없습니다.
static 클래스의 모든 멤버는 static으로 선언되어야 합니다.
static 클래스는 생성자를 포함할 수 없습니다.
static 메소드
객체를 생성하지 않고 클래스로 호출할 수 있다.
this 키워드를 사용할 수 없다.
메소드 재정의를 할 수 없습니다.
final 필드 vs final 클래스 vs final 메소드
final 필드
final 필드는 초기값이 저장되면 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다.
상속할 수 없는 final 클래스
final 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스이다. 따라서 부모 클래스가 될 수 없고 자식 클래스를 만들 수 없다는 것이다.
public final class Person {
...
}
public class NewPerson extends Person {
...
// 클래스 Person은 final 키워드가 붙어 최종적인 클래스이므로
// 상속 받을 수 없는 상태이다.
}
재정의할 수 없는 final 메소드
final 메소드는 최종적인 메소드이므로 재정의할 수 없는 메소드이다. 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다.
public class Car {
public final void stop() {
System.out.println("멈춰!");
}
}
public class SportsCar extends Car {
// 메소드 stop은 final 키워드가 붙어 최종적인 메소드이므로
// 자식 클래스에서 메소드를 재정의할 수 없다.
@Override
public void stop() {
System.out.println("스포츠카 멈춰!");
}
}
출처 : 혼자 공부하는 자바 | 신용권
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=heartflow89&logNo=220959033435
'Java' 카테고리의 다른 글
[Java] Chapter 8.2 인터페이스의 타입 변환과 다형성 (0) | 2023.04.24 |
---|---|
[Java] Chapter 8.1 인터페이스 (0) | 2023.04.17 |
[Java] Chapter 7.3 추상 클래스 (1) | 2023.04.11 |
[Java] Chapter 7.2 타입 변환과 다형성 (0) | 2023.04.10 |
[Java] 스택영역과 힙영역의 차이점 (0) | 2023.03.29 |