클래스 간의 관계와 상속
- 상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수 있다.
- 이러한 특성 때문에 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가하여 생산성과 유지보수성에 매우 유리해진다.
1. 클래스 간의 상속은 extends 키워드를 사용하여 정의할 수 있다.
public class 자식클래스 extends 부모클래스 {
}
2. 클래스간의 관계
- 상속관계 : is - a (~은 ~이다)
- 포함관계: has - a (~은 ~를 가지고 있다)
** final 키워드를 클래스와 메서드에 선언하면 더 이상 상속, 오버라이딩 할 수 없는 클래스, 메서드가 된다.
3. 오버라이딩 : 부모 클래스로부터 상속받은 메서드의 내용을 재정의
- 부모 클래스의 메서드를 그대로 사용 가능하지만 자식 클래스의 상황에 맞게 변경을 해야 하는 경우 오버라이딩을 사용
- 조건 :
- 선언부가 부모 클래스의 메서드와 일치해야 함
- 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경 불가
- 예외는 부모 클래스의 메서드 보다 많이 선언할 수 있음
// 부모 클래스
public class Car {
String company; // 자동차 회사
private String model; // 자동차 모델
private String color; // 자동차 색상
private double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear = 'P'; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
public double brakePedal() {
speed = 0;
return speed;
}
public void horn() {
System.out.println("빵빵");
}
}
//자식 클래스
public class SportsCar extends Car{
String engine;
public void booster() {
System.out.println("엔진 " + engine + " 부앙~\n");
}
public SportsCar(String engine) {
this.engine = engine;
}
@Override
public double brakePedal() {
speed = 100;
System.out.println("스포츠카에 브레이크란 없다");
return speed;
}
@Override
public void horn() {
booster();
}
}
*** 오버로딩과 오버라이드 차이점?
오버로딩은 클래스내에서 하나의 함수로 여러 가지 타입의 매개변수를 받을 수 있도록 메서드를 정의하는 것
오버라이드는 부모-자식간의 관계에서 부모 클래스의 메서드를 자식 클래스가 재정의 하고 싶을 때 자식 클래스에서 오버라이드 한다.
4. super : 부모 클래스의 멤버를 참조할 수 있는 키워드
- 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용
- 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 구분하기 위해서 사용
// 부모 클래스 Car
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
// 자식 클래스 SportsCar
String model = "Ferrari"; // 자동차 모델
String color = "Red"; // 자동차 색상
double price = 300000000; // 자동차 가격
//자식 클래스의 메서드
public void setCarInfo(String model, String color, double price) {
super.model = model; // model은 부모 필드에 set
super.color = color; // color는 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}
5. super(): 부모 클래스의 생성자를 호출할 수 있는 키워드
- 객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스 생성자를 호출하기 위해 사용
- 자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져서 하나의 인스턴스가 생성됨
- 이때 부모 클래스의 멤버들의 초기화 작업이 먼저 수행되어야 함
- 따라서 자식 클래스의 생성자에서는 부모 클래스의 생성자가 호출
- 또한 부모 클래스의 생성자는 가장 첫 줄에서 호출이 되어야 함
// 부모 클래스 Car 생성자
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
// this.engine = engine; // 오류 발생
super(model, color, price);
this.engine = engine;
}
'개발 공부 > Java' 카테고리의 다른 글
Java 문법 정리 9. 추상클래스, 인터페이스 (0) | 2023.10.31 |
---|---|
Java 문법 정리 8. 다형성 (1) | 2023.10.19 |
Java 문법 정리 6. 객체지향 프로그래밍, 클래스 (0) | 2023.10.19 |
Java 문법 정리 **length vs length() vs size() - 길이 값 불러오기 (0) | 2023.10.13 |
Java 문법 정리 5. 컬렉션(List, Stack, Queue, Set, Map) (0) | 2023.10.13 |