상속?
부모 클래스의 멤버를 자식 클래스에게 물려준다
class 자식클래스 extends 부모클래스 {
...
}
extends 후 기본생성자 만들때 생기는 super가 부모의 기본 생성자를 호출한다
Java 상속 특징
- 여러개의 부모 클래스를 상속할 수 없다. (다중상속 허용 x)
- 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외
- 부모 클래스와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한을 갖는 필드와 메소드도 상속 x
예제
package chap07;
public class Cellphone {
String model;
String color;
void powerOn() {System.out.println("전원을 켭니다");}
void powerOff() {System.out.println("전원을 끕니다");}
void bell() {System.out.println("벨이 울립니다");}
void sendVoid(String message) {System.out.println("Me: " + message);}
void receiveVoid(String message) {System.out.println("Friend: " + message);}
void hangUp() {System.out.println("전화를 끊습니다");}
}
package chap07;
public class DmbCellPhone extends Cellphone{
int channel;
public DmbCellPhone(String model, String color, int channel) {
this.model = model;
this.color = color;
this.channel = channel;
}
void turnOnDmb() {
System.out.println("채널 " + channel + "번 방송 수신을 시작합니다");
}
void changeChannelDmb(int channel) {
this.channel = channel;
System.out.println("채널 " + channel + "번으로 바꿉니다");
}
void turnOffDmb() {
System.out.println("방송 수신을 멈춥니다");
}
}
package chap07;
public class DMbCellPhoneEx {
public static void main(String[] args) {
DmbCellPhone cellPhone = new DmbCellPhone("갤럭시", "검정", 22);
System.out.println("모델: " + cellPhone.model);
System.out.println("색상: " + cellPhone.color);
System.out.println("채널: " + cellPhone.channel);
cellPhone.powerOn();
cellPhone.powerOff();
cellPhone.sendVoid("여보세욥");
cellPhone.receiveVoid("안녕하세요 저는 홍길동입니다");
cellPhone.sendVoid("예 반갑습니다~");
cellPhone.hangUp();
cellPhone.turnOnDmb();
cellPhone.changeChannelDmb(86);
cellPhone.turnOffDmb();
}
}
CellPhone클래스를 상속해서 DMB폰 클래스를 작성한 예제
(DMB 오랜만이네..)
메소드 재정의
자식 클래스에서 부모 클래스의 메소드를 다시 정의 하는 것.
- 부모의 메소드와 동일한 시그니처(리턴타입, 메소드이름, 매개변수목록)를 가져야 한다.
- 접근 제한을 더 강하게 재정의 할 수 있다.
- 새로운 예와를 throws 할 수 없다.
package chap07;
public class Calculator {
double areCircle(double r) {
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r ;
}
}
package chap07;
public class Computer extends Calculator{
@Override
double areCircle(double r) {
//재정의
System.out.println("Computer 객체의 areCircle() 실행");
return Math.PI * r * r;
}
}
package chap07;
public class ComputerEx {
public static void main(String[] args) {
int r = 10;
Calculator calculator = new Calculator();
System.out.println("원면적: " + calculator.areCircle(r));
System.out.println();
Computer computer = new Computer();
System.out.println("원면적: " + computer.areCircle(r));
}
}
Calculator의 areaCircle() 메소드는 3.14159로 계산했지만 좀 더 정밀한 계산을 위해 Computer areaCircle()메소드를 Math.PI 상수로 계산했다.
Math
수학 계산과 관련된 필드와 메소드를 가지고 있는 자바 표준 API
부모 메소드 호출
super 는 부모 객체를 참조하고 있기 때문에 부모 메소드에 접근 가능하다.
package chap07;
public class Airplane {
public void land() {
System.out.println("착륙합니다");
}
public void fly() {
System.out.println("일반비행합니다");
}
public void takeOff() {
System.out.println("이륙합니다");
}
}
package chap07;
public class SupersonicAirplane extends Airplane{
public static final int NORMAL = 1;
public static final int SUPERSONIC = 2;
public int flyMode = NORMAL;
@Override
public void fly() {
if (flyMode == NORMAL) {
System.out.println("초음속비행합니다");
}else {
super.fly();
}
}
}
package chap07;
public class SupersonicAirplaneEx {
public static void main(String[] args) {
SupersonicAirplane sa = new SupersonicAirplane();
sa.takeOff();
sa.fly();
sa.flyMode = SupersonicAirplane.SUPERSONIC;
sa.fly();
sa.flyMode = SupersonicAirplane.NORMAL;
sa.fly();
sa.land();
}
}
상속할 수 없는 final 클래스
가장 대표적인 예는 자바 표준 API에서 제공하는 String 클래스.
//상속불가
public class NewString extends String {...}
클래스 선언시 final 키워드를 붙여서 이후 extends를 통한 자식 클래스를 만들 수 없다
재정의 할 수 없는 final 메서드
메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 최종적인 메소드이므로 재정의 할 수 없다.
즉, 부모 클래스를 상속해서 자식 클래서를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 불가
package chap07;
public class Car {
public int speed;
public void speedUP() {speed += 1;}
public final void stop() {
System.out.println("차를 멈춤");
speed = 0;
}
}
package chap07;
public class SportCar extends Car{
@Override
public void speedUP() {
speed += 10;
}
@Override
public void stop() {
System.out.println("스포츠카를 멈춤");
speed = 0;
}
}
Multiple markers at this line
- Cannot override the final method from Car
- overrides chap07.Car.stop
참고:
- 혼자 공부하는 자바(신용권), 한빛미디어
'개발 > JAVA' 카테고리의 다른 글
[Java] 추상(abstract) 클래스 (0) | 2022.07.12 |
---|---|
[Java] 타입 변환과 다형성 (0) | 2022.07.11 |
[Java] Getter & Setter (0) | 2022.07.08 |
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2022.07.07 |
[Java] 메소드 (0) | 2022.07.06 |