ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 알기 쉬운 JAVA 인터페이스(Interface)에 대해 알아보자
    프로그래밍/JAVA 2020. 5. 10. 12:31

    인터페이스(Inferface)

     

     인터페이스는 USB 인터페이스, SATA 인터페이스 하드디스크 등 컴퓨터 주변 장치와 실생활에서도 많이 사용되며, 서로 다른 하드웨어 장치들이 상호 데이터를 주고받을 수 있는 규격을 의미한다.

     

    이러한 규격이 필요한 이유는 무엇일까? 

     

    규격을 정해 놓으면 서로 다른 회사가 만든 장치일지라도 주변 장치를 문제없이 결합할 수 있기 때문이다. 가령 실생활에서 사용하고 있는 220V를 예로 들 수 있다. 220V를 표준 규격으로 사용하고 있는 우리나라에서는 다양한 회사들이 이 규격에 맞추어 제품을 만들고 있기 때문에 규격에 맞기만 하면 언제나 연결이 가능하게 된다. 

     

     자바에서 인터페이스란 규격과 같은 역할을 한다. 인터페이스를 만들고 그 안의 속성(변수)과 기능(메소드)을 각 클래스에서 구현하면 인터페이스에 나열된 메소드와 동일한 이름의 메소드를 구현하지만, 구현한 내용은 서로 다르게 되며 인터페이스로 인한 다형성이 실현된다. 

     

    인터페이스란, 

    여러 명의 개발자가 하나의 프로그램을 개발할 때 변수와 메소드의 이름을 다르게 설정하는 것을 막기 위해 처음부터 규격화해서 정해 놓은 것이다.

     

    final인 상수와 추상 메소드로만 구성되어있는 클래스를 말한다.

    class 대신에 interface로 명시한다.

    // public을 생략하면 자동으로 붙는다.
    interface PhoneInterface {
    	// public static final은 생략가능하다.
    	public static final int TIMEOUT = 10000;
        // 추상메소드, public abstract은  생략가능하다.
        public abstract void sendCall();
        public abstract void receiveCall();
    }

    인터페이스를 구성했으니 상속받는 클래스를 만들어보자

    인터페이스를 상속받기 위해 implements 키워드를 사용한다.

    class SamsungPhone implements PhoneInterface {
    	// 인터페이스의 모든 메소드들을 오버라이딩해야 한다.(추상 클래스이기 때문)
        @Override
        public void sendCall() {
        	System.out.println("띠리링");
        }
        
        @Override
        public void receiceCall() {
        	System.out.println("전화가왔습니다")
        }
        
        // 메소드를 추가 작성할 수 있다. ( class이기 때문)
        public void flash() {
        System.out.println("전화기에 불이 켜졌습니다.");
    }    
        
        
        

     인터페이스의 메소드는 상속받은 클래스에서 모두 오버라이드 해야 한다. 그 이유는 추상 메소드로만 작성되어 있기 때문이다. abstract가 붙은 추상 메소드는 오버라이드 해서 사용해야하기 때문이다.

     

    인터페이스 규칙

    1. 인터페이스는 객체를 생성할 수 없다.

    인터페이스의 상속

    클래스는 인터페이스를 상속할 수 없고 implements 키워드를 통해 구현할 수 있었다. 상속은 인터페이스 끼리만 상속이 가능하다. 인터페이스의 상속은 기존 상속 키워드인 extends 키워드를 사용한다.

    interface MobilePhoneInterface extends PhoneInterface {
    
        void sendSMS(); // 추상 메소드, public abstract는 생략
        void receiveSMS(); // 추상 메소드
        
    }

    기존의 PhoneInterface를 상속받은 MobilePhoneInterface를 만들었다. 상속받은 MobilePhoneInterface은 부모 클래스가 가지고 있던 TIMEOUT, sendCall(), receiveCall() 과 함께 MobilePhoneInterface에서 추가한 sendSMS(), receiveSMS()까지 사용할 수 있다.

     

    1. 인터페이스는 다중 상속이 가능하다.

    자바에서는 기본적으로 다중 상속을 지원하지 않지만, 인터페이스에서는 가능하다.

    interface MP3Interface {
    
        void play();
        void stop();
    } //
    
    interface MobilePhoneInterface extends PhoneInterface, MP3Interface {
    
        void sendSMS(); // 추상 메소드, public abstract는 생략
        void receiveSMS(); // 추상 메소드
        
    }

    2. 다중 인터페이스 구현이 가능하다.

    여러 개의 인터페이스를 상속받는 클래스를 구현할 수 있다.

    // MyInter 인터페이스
    public interface MyInter {
    	
    	void sub();
    } //
    
    // YourInter 인터페이스
    interface YourInter{
    	
    	String STR = "HELLO"; // public static final 이 자동으로 붙는다.
    	String bar(); // 자동으로 public 과 abstract 가 붙는다.
    
    } //
    
    // MyInter와 YourInter 인터페이스를 다중으로 구현할 수 있다.
    public class Mydemo extends Object implements MyInter, YourInter {
    
    	@Override
    	public void sub() { // MyInter의 메소드를 오버라이드
    		System.out.println("sub()");
    	}
    	
    	@Override
    	public String bar() {
    		return STR;
    	}
    	
        
    	public static void main(String[] args) {
    		Mydemo md = new Mydemo();
    		md.sub();
    		String a = md.bar();
    		System.out.println(a);
    		System.out.println(Mydemo.STR);
            
     } //

    인터페이스의 효과

    1. 다중 상속 가능

    2. 인터페이스와 로직이 명확하게 분리된다.

     실제 메소드의 구현은 인터페이스를 상속받은 자식 클래스에서 담당한다.

    3. 부모 클래스 코드가 깔끔해진다.

    4. 인터페이스와 로직이 명확히 분리 되어 외부에 노출할 필요 없는 로직을 캡슐화 한다.

    인터페이스 구현 목적

    인터페이스와 추상 클래스는 비슷한 점이 많다. 객체를 생성할 수 없고, 상속을 위한 부모 클래스로만 사용할 수 있다.

    구현 목적은 다형성을 실현하기 위함이다.

    댓글

Designed by Tistory.