이전에 배운 내용
[JAVA] 단일상속, 다중상속, final 클래스, final 메서드, object
[JAVA] 단일상속, 다중상속, final 클래스, final 메서드, object
이전에 배운 내용 [JAVA] 상속관계와 포함관계 [JAVA] 상속관계와 포함관계 이전에 배운 내용 [JAVA] 상속 개념 [JAVA] 상속 개념 이전에 배운 내용 [JAVA] package와 import [JAVA] package와 import 이전에 배운 내
dev-story93.tistory.com
오버라이딩(overriding)이란?
부모클래스로부터 상속받은 메서드의 내용을 재정의하는 것
부모클래스의 메서드를 그대로 사용가능하지만 자식클래스가 상황에 맞게 변경해야 하는 경우 오버라이딩을 사용한다.
오버라이딩의 조건
- 선언부가 부모클래스의 메서드와 일치해야 함
- 접근제어자를 부모클래스의 메서드보다 좁은 범의로 변경할 수 없다.
- 예외는 부모클래스의 메서드보다 많이 선언할 수 없다.
예제로 확인해 보자
부모클래스
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 String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
public double brakePedal() {
speed = 0;
return speed;
}
public char changeGear(char type) {
gear = type;
return gear;
}
public boolean onOffLights() {
lights = !lights;
return lights;
}
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();
}
}
Main클래스
public class Main {
public static void main(String[] args) {
// 부모 클래스 자동차 객체 생성
Car car = new Car();
car.horn(); // 경적
System.out.println();
// 자식 클래스 스포츠카 객체 생성
SportsCar sportsCar = new SportsCar("Orion");
// 오버라이딩한 brakePedal(), horn() 메서드 호출
sportsCar.brakePedal();
sportsCar.horn();
}
}
@이는 에노테이션(annotaion)이라고 한다.
super와 super()
this와 this()랑 비슷하다.(객체와 생성자랑 관련이 있겠구나) this는 나 자신을지칭
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
}
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;
}
자식이 객체를 생성할 때 매개변수에 매개값을 받아 super(...)를 사용해 부모클래스의 멤버를 먼저 초기화한다.
오버로딩된 부모클래스의 생성자가 없다고 하더라도 기본생성자를 호출한다.
컴파일러가 실행되면 자식클래스 생성자 첫 줄에 자동으로 super();를 추가해 준다.
오늘은 여기까지 공부한다.
내일은 이어서 다형성에 대해 배울 것이다.
또 개인과제의 키오스크 만들기도 슬슬 손대기 시작하려 한다!
'언어(language) > 자바(Java)' 카테고리의 다른 글
| [JAVA] 추상클래스 (0) | 2023.10.20 |
|---|---|
| [JAVA] 다형성과 instanceof (0) | 2023.10.20 |
| [JAVA] 단일상속, 다중상속, final 클래스, final 메서드, object (0) | 2023.10.19 |
| [JAVA] 상속관계와 포함관계 (2) | 2023.10.19 |
| [JAVA] 상속 개념 (0) | 2023.10.19 |