abstract
키워드abstract void person();
abstract
예약어를 사용{ }
)int add(int x, int y);
// 추상 메서드 선언int add(int x, int y){ }
// 추상 클래스 선언 // 구현부가 있음, 추상 메서드 아님public abstract class Desktop extends Computer { // Computer.java로 부터 상속받아서, Desktop에서 구현
@Override
public void display() {
System.out.println("Desktop display");
}
@Override
public void typing() {
System.out.println("Desktop typing");
}
// 상위클래스에서 구현된 것을 다시 여기서 재정의 해도됨
@Override
public void turnOff() {
System.out.println("Desktop typing");
}
}
유지보수를 위해!
객체지향의 핵심이자 Java 를 쓰는 이유이다..!
public abstract class TV {
TV() {
System.out.println("TV");
}
abstract void powerOn();
abstract void powerOff();
abstract void volumeUp();
abstract void volumeDown();
}
public class LgTV extends TV{
LgTV() {
System.out.println("LgTV");
}
void powerOn() {
System.out.println("LgTV powerOn");
}
void powerOff() {
System.out.println("LgTV powerOff");
}
void volumeUp() {
System.out.println("LgTV volumeUp");
}
void volumeDown() {
System.out.println("LgTV volumeDown");
}
}
public class SamsungTV extends TV{
LgTV() {
System.out.println("SamsungTV");
}
void powerOn() {
System.out.println("SamsungTV powerOn");
}
void powerOff() {
System.out.println("SamsungTV powerOff");
}
void volumeUp() {
System.out.println("SamsungTV volumeUp");
}
void volumeDown() {
System.out.println("SamsungTV volumeDown");
}
}
ublic class TVFactory {
TV makeTV(String tvId) {
if(tvId.equals("lg")) {
return new LgTV();
} else (tvId.equals("samsung")) {
return new SamsungTV();
}
return null;
}
}
public class TVClient {
public static void main(String[] args) {
TVFactory factory = new TVFactory();
TV tv = (TV) factory.makeTV(args[0]);
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
}
}
출력결과
LgTV
LgTV powerOn
LgTV powerOff
LgTV volumeUp
LgTV volumeDown
메서드에 final
이 쓰이면?
final
로 선언하여 하위 클래스에서 재정의 할 수 없게 함
클래스에 final
을 적용하면?
상속받을 수 없게 함
변수에 final
선언하면 ?
상수 로
// hook 훅 메서드
// 구현된 메서드인데, 구현 내용이 없는 것 => 자식 클래스에서 재정의(오버라이딩) 할때 사용
public void washCar() {}
// 우리가 변경할 수 없는 시나리오
// 주행을 하기 위해 필요한 메소드를 넣는다 -> 구현 메소드, 추상 메소드 상관없음
// 안에 추상 메서드 순서대로 동작해야함 -> 변하면(재정의하면) 안되기 때문에 final
final public void run() {
starCar(); // 구현된 메소드
drive(); // 추상 메소드
wiper(); // 추상 메소드
stop(); // 추상 메소드
turnOff(); // 구현된 메소드
washCar(); // 구현된 빈 메소드를 오버라이딩
}
⇒
final
로 선언해두기