1. 상속이란 ?
- 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만드는 방법.
- 다시 말해, 부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 하는 것.
- 따라서 중복이 되는 코드를 줄여줄 수 있고, 개발 시간을 절약해 주기 때문에 효율적이고, 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오기 때문에 유지 보수 시간을 최소화할 수 있다는 장점이 있다.
- 부모 클래스를 상위 클래스, 자식 클래스를 하위 클래스 또는 파생 클래스라고 부른다.
2. 클래스 상속
- 프로그램에의 상속은 자식이 부모를 선택한다.
- 선택된 부모클래스는 extends 뒤에 기술한다.
- 단 하나의 부모클래스만 상속할 수 있다.
- 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
- 부모 클래스와 자식 클래스의 패키지가 다르다면, default 접근 제한을 갖는 필드와 메소드도 상속대상에서 제외된다.
3. 부모 생성자 호출
- 모든 객체는 클래스의 생성자를 호출해야만 생성된다.
- 부모 생성자는 자식 생정자의 맨 첫 줄에서 호출된다.
- super();는 부모의 기본 생성자를 호출한다.
- 만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성한다.
- super(매개값, ...)는 매개값의 타입과 일치하는 부모 생성자를 호출한다. - 일치하지 않으면 컴파일에러
- super(매개값, ...)는 반드시 자식 생성자 첫 줄에 위치해야 한다. - 아니면 컴파일 에러 발생
4. 메소드 재정의 (Overriding)
- 자식 클래스에서 부모 클래스의 메소드를 사용하기 적합하도록 수정해서 사용하는 방법.
- 즉, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것
① 메소드 재정의 규칙
- 부모의 메소드와 동일한 시그너처 ( 리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
- 접근 제한을 더 강하게 재정의할 수 없다.
- 새로운 예외(Exception)를 throws할 수 없다.
※ 접근 제한을 더 강하게 재정을 할 수 없다 ?
더보기
부모 메소드가 public 접근 제한을 가지고 있을 경우 재정의하는 자식 메소드는 default 나 private 접근 제한으로 수정할 수 없다는 의미. 단, 반대는 가능. 부모 메소드가 default 접근 제한을 가지면 재정의하는 자식 메소드는 default 또는 public으로 접근 제한을 가질 수 있다.
② @Override 어노테이션
- 해당 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄여 준다.
//부모 클래스
public class Calculator {
double areaCircle(double r) {
System.out.println("Calculator 개체의 areaCircle()실행");
return 3.14159 * r * r ;
}
}
//자식 클래스 // 재정의
public class Computer extends Calculator {
@Override //어노테이션 생략 가능
double areaCircle(double r) {
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r;
}
}
//메소드 재정의 테스트
public class ComputerExample {
public static void main(String[] args) {
int r = 20;
Calulator calculrator = new Calculator();
System.out.println(calculatro.areaCircle(r)); //314.159
Computer computer = new Computer();
System.out.println(computer.areaCircle(r)); //314.1592653589793
}
}
③ 부모 메소드 호출
- 자식 클래스에서 부모 클래스 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨진다.
- 그러나 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 한다면, 명시적으로 super 키워드를 븉여서 부모 메소드를 호출 할 수 있다.
- super.부모메소드();
5. Final 클래스와 Final 메소드
- 클래스와 메소드를 선언할 때 final 키워드가 지정되면 상속과 관련이 있다는 의미
- final 클래스는 부모 클래스가 될 수 없다. 즉, 자식 클래스를 만들 수 없다.
- final 키워드 때문에 최종적인 클래스가 되기 때문이다.
- 마찬가지로, 부모 클래스 내부의 final 메소드도 최종적인 메소드가 되기 때문에 자식 클래스에서 재정의 할 수 없다.
//재정의 할 수 없는 final 메소드
public class Car {
//필드
public int speed;
//메소드
public void speedUp(){ speed += 1; }
//final 메소드
public final void stop() {
System.out.println("차를 멈춤");
speed = 0;
}
}
public class SportCar extends Car {
@Override
public void speedUp(){ speed += 10; }
@Override
public void stop(){
System.out.println("스포츠카를 멈춤"); //stop()은 final 메소드기 때문에 재정의 할 수 없음
speed = 0;
}
}
6. protected 접근 제한자
- protected 는 public과 default 접근 제한의 중간
- 같은 패키지에서는 default와 같이 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
- 단, 자식 클래스에서 부모 클래스의 생성자를 호출할 때, new 연산자를 사용해서 직접 호출할 수 없고, super(); 를 이용해야 한다.
'Coding > Java' 카테고리의 다른 글
[22] JAVA 추상클래스 (0) | 2022.12.03 |
---|---|
[21] JAVA 타입변환과 다형성 (1) | 2022.12.02 |
[19] JAVA 패키지와 접근 제한자 (0) | 2022.11.29 |
[18] JAVA 인스턴스(객체) Instance (0) | 2022.11.27 |
[17] JAVA 자료구조 ArrayList (0) | 2022.11.25 |