[자바] 인터페이스 예제 풀이

    자바에서는 다중 상속을 지원하지 않는다. 따라서 다중 상속이 필요할 경우, 인터페이스를 활용할 수 있다. 

    인터페이스는 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스와의 중간 매개 역할을 하는 추상 클래스를 의미한다. 

     

    추상클래스의 경우 추상 메서드, 생성자, 필드, 일반 메서드도 포함하지만

    인터페이스는 오로지 추상 메서드와 상수만을 포함하게 된다. 

    다만, 제어자는 생략이 가능하며, 생략된 제어자는 컴파일 시 자동 추가된다. 

     

     

    예제를 만들어 보자.

    package inter;
    
    interface Animal
    {
    	public static final int A = 10;
        public abstract void cry();
    }
    
    class Cat implements Animal
    {
    	public void cry()
        {
        	System.out.println("야옹");
        }
    }
    class Dog implements Animal
    {
    	public void cry(){
        	System.out.println("멍멍");
        }
    }
    
    public class MySample {
    	public static void main (String [] args){
        	// 인터페이스
            Cat c = new Cat();
            Dog d = new Dog();
            
            c.cry();
            d.cry();
        }
    }

    위는 간단한 인터페이스의 예제다. 

    강아지, 고양이 클래스는 인터페이스를 상속받았기 때문에 추상메서드인 cry()를 반드시 오버라이딩 해야 한다. 

    콘솔 창에는 아래와 같은 결과가 나온다. 

    야옹
    멍멍

     

     

     

    다음의 예제를 보자.

    package inter;
    interface Providable
    {
    	public abstract void leisureSports();
        public abstract void sightSeeling();
        public abstract void food();
    }
    
    class KoreaTour implements Providable
    {
    	public void leisurSports()
        {
        	System.out.println("한강에서 수상스키 투어");
        }
        public void sightSeeling()
        {
        	System.out.println("경복궁 관광 투어");
        }
        public void food()
        {
        	System.out.println("불고기 투어");
        }
    }
    class TourGuide
    {
    	private Providable tour = new KoreaTour();	// 다형성
        
        public void leisureSports()
        {
        	tour.leisureSports();
        }
        public void sightSeeling()
        {
        	tour.sightSeeling();
        }
        public void food()
        {
        	tour.food();
        }
    }

     

     

    Providable 이라는 인터페이스 클래스를 만든 후, 추상 메서드 세 가지를 선언한다. 

     

    이후, 위 인터페이스를 상속받는 KoreaTour를 선언하여, 위 세가지 메서드를 오버라이딩 한다. 

    그 아래 TourGuide 클래스는 위 메서드를 호출하기 위해 만든 메서드다. 클래스가 다르므로 객체를 생성해야 한다. 

    여기서 다형성을 이용하여 부모인 Providable 을 참조하여 자녀인 KoreaTour 를 객체생성한다. 

    이 때 접근제어자를 private으로 설정한 이유는, 현재 예제에서는 별 상관이 없지만 실제로 사용되는 코드에서는 데이터 보호를 위해 위와 같이 활용하는 경우가 많기 때문이다. (캡슐화)

     

    끝으로 메인 클래스를 작성해 보자. 

    public class MySample
    {
    	public static void main(String[] args)
        {
        	TourGuide guide = new TourGuide ();
            guide.leisureSports();
            guide.sightSeeling();
            guide.food();
        }
    }

     

    메인 메서드에는 단순하게 TourGuide 객체 생성을 한 후, 위 메서드를 차례로 호출하면 된다. 

    한강에서 수상스키 투어
    경복궁 관광 투어
    불고기 투어

    run하면 위와 같은 결과가 나온다. 

    단순하지만 캡슐화, 상속, 다형성이 모두 들어간 예제라고 할 수 있다. 

     

     

    댓글