언어/Java
기초 #9. 인터페이스 Soldier (인터페이스 예제편)
뭉지(moonz)
2020. 9. 1. 15:53
반응형
이전 글에서 적은 예제인 RemoteControl 인터페이스보다 더 기본에 충실한 예제를 적어보겠다.
1. 인터페이스 Soldier 코드
▶인터페이스에는 기본적으로 상수와 추상메서드가 있다.
▶인터페이스에는 구현할 클래스들의 공통요소를 정의만 해놓는 역할을 한다.
▶군인의 공통점으로는 팔다리가 있고, 먹고,일하고,놀고,자고,경례를 한다는 점이다.
public interface Soldier {
final static int arm = 2;
int Legs = 2; //컴파일과정에서 자동으로 final static이 붙어, 외부에서 변경 불가능하다.
public abstract void eat();
void work(); //abstract키워드를 쓰지않아도 추상메서드. why? body {}가 없으니까.
void play();
void sleep();
void salute();
}
2. 구현 클래스 Private(이등병), Pfc(일병), Corporal(상병), Sergent(중사) 코드
▶인터페이스의 모든 추상메서드를 재정의해야하는 강제성이 부여된다.
public class Private implements Soldier {
public void eat() { System.out.println("90도로 허리와 하단을 만든 후 숟가락을 직각으로 펼치며 식사한다."); }
public void work() { System.out.println("마치 일을 안하면 안되는 것처럼 아주 열심히 뛰며 일한다."); }
public void play() { System.out.println("선임들과 함께 하고 싶으나, 아직 일이 덜 끝났을 때에는 잘 쉬지 못한다."); }
public void sleep() { System.out.println("불침번을 서기 전까지 아주 잘 잔다."); }
public void salute() { System.out.println("충~~~~~~~~~~~~~~~~~~~~~~~~~~~~~성!"); }
}
public class Pfc implements Soldier {
public void eat() { System.out.println("빠르고 정확하게 먹는다."); }
public void work() { System.out.println("이등병에게 일을 알려주며 열심히 일한다."); }
public void play() { System.out.println("노래방과 사이버 지식방, 오락기를 사용한다."); }
public void sleep() { System.out.println("푸욱~ 잘 잔다. 자다말고 가끔 이등병과 어디 간다."); }
public void salute() { System.out.println("충!, 성!"); }
}
public class Corporal implements Soldier {
public void eat() { System.out.println("편하게 먹는다."); }
public void work() { System.out.println("잘 안한다. 하지만 책임감을 가지고 후임들을 관리한다."); }
public void play() { System.out.println("신나게~ 논다. 취미활동이 생긴다."); }
public void sleep() { System.out.println("잠을 잘 못잔다. 이미 낮에 잤기 때문이다."); }
public void salute() { System.out.println("ㅊㅅ"); }
}
public class Sergent extends Army { //추상클래스는 전체 구현할 필요 없음. 필요한 것만.
public void eat() { System.out.println("냠냠"); }
public void play() { System.out.println("계속 논다."); }
public void sleep() { System.out.println("계속 잔다."); }
public void salute() { System.out.println("ㅊ"); }
}
3. Sergent 클래스의 상위클래스이자 Soldier 인터페이스를 구현하는 추상클래스 코드
▶work()를 하지않는 Sergent(중사) 클래스는 인터페이스의 모든 메서드를 재정의하고 싶지 않다.
▶그럴 경우, Soldier인터페이스를 구현하는 추상클래스를 생성하여 상속(extends)받고 그 추상클래스에서 원하는 메서드를 선택해 재정의하면된다. (why? 추상클래스에서는 하위클레스가 추상메서드를 무조건 재정의해야하는 강제성은 있지만, 일반 메서드일 경우 그런 강제성이 부여되지 않기 때문)
▶추상클래스에서 일반메서드로 선언된 것은 무조건 재정의할 필요없음.
▶추상클래스는 하위클래스에게 블록 {}이 구현되지 않은 추상 메서드에 대한 재정의 강제성 부여.
public abstract class Army implements Soldier { //인터페이스를 구현하는 추상클래스.
public abstract void eat() {} //블록{} 있으므로 구현한 일반메서드임.
void work() {}
void play() {}
void sleep() {}
void salute() {}
}
//이 추상클래스를 상속받는 Sergent 클래스는 (일반메서드에 한해서)원하는 메서드만 오버라이딩해도 된다.
단지 인터페이스와 추상클래스, 하위클래스간의 관계를 보여주기 위한 예제이기 때문에, main코드는 따로 적지 않았다. 대충 적어보자면,
public class Main {
public static void main(String[] args) {
Soldier s = new Pfc();
s.eat();
Soldier sg = new Sergent(); //Army sg = new Sergent(); 로 해도 접근 가능하다. 상위클래스이기 때문.
sg.salute();
}
}
결과는 이렇다.
반응형