언어/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();
    }
}

 

결과는 이렇다.

반응형