interface

Yoon·2022년 7월 20일
0

java

목록 보기
4/8

인터페이스(interface) 란?

  • 현업에서 소스코드 작성 시 클래스를 처음부터 구현하게 된다면 코드의 가독성도 떨어지고 시간도 오래걸릴 것입니다. 또 한 팀별로 각각 다른 모듈을 만들 시 팀마다 방법이 다르기 때문에 서로 호환성이 없고 일관성이 떨어지게 된다.
  • 인터페이스를 통해 기본적으로 구현해야 할 메소드에 대한 규격들을 알려준다면 훨씬 효율적일 것이다.
  • 즉, 인터페이스란 특정 기능을 개발하는데 있어 공통적인 기능을 명시하고 강제적으로 구현하게끔 하는 역할입니다.
  • 인터페이스를 사용하게 된다면 자바의 다형성을 이용할 수 있고 이를 통해 유지보수성을 높일 수 있습니다.

인터페이스 정의

public interface Phone {
	int version = 13;
    
    String getManufacture();
    String getOS();
}
  • 인터페이스는 interface라는 키워드를 사용해서 정의할 수 있습니다.
  • 접근제어자로 public 또는 default가 명시될 수 있습니다.
  • 인터페이스의 변수의 값은 "public static final" 키워드가 생략된 상수이므로 주어진 값으로만 사용가능 합니다.
  • getManufacture와 getOS는 "public abstract" 키워드가 생략된 메소드로 인터페이스를 구현하는 곳에서 오버라이딩을 강제시킵니다.

인터페이스 구현

public class IPhone implements Phone {
	@Override
    public String getManufacture() {
    	return "Apple";
    }
    
    @Override
    public String getOS(){
    	return "MacOS";
    }
}
public class Galaxy implements Phone {
	@Override
    public String getManufacture() {
    	return "Samsung";
    }
    
    @Override
    public String getOS(){
    	return "Android";
    }
}
  • 인터페이스 구현은 implements 키워드를 통해 일반 클래스에서 인터페이스를 구현.
  • IPhone 클래스와 Galaxy 클래스는 Phone 인터페이스의 규격에 맞게 재정의하고 있음.

인터페이스 레퍼런스를 통해 구현체 사용하는 방법

public class Main {
	public static void main(String[] args) {
    	Phone galaxy = new Galaxy();
        Phone iphone = new IPhone();
        
        System.out.println(galaxy.getManufacture());
        System.out.println(galaxy.getOS());
        
        System.out.println(iphone.getManufacture());
        System.out.println(iphone.getOS());
    }
}
  • 자바의 다형성을 이용하여 인터페이스 참조변수로 다양한 클래스를 표현할 수 있다.
  • 예시에서 보는 것 처럼 Phone 인터페이스 참조변수에 Galaxy 클래스와 IPhone 클래스로 여러 타입의 객체로 참조할 수 있다.

인터페이스 상속

  • 인터페이스는 다중 상속이 가능하여 여러 인터페이스를 상속받아 하나의 인터페이스를 만들 수 있다.
  • 이럴경우 모든 인터페이스에 존재하는 메소드를 재정의 해야 한다.
public interface Phone {
	int version = 13;
    
    String getManufacture();
    String getOS();
}

public interface Watch {
	String getAppearance();
}

public interface Device extends Phone,Watch { }
public class Machine implements Device{
    @Override
    public String getManufacture() {
        return null;
    }

    @Override
    public String getOS() {
        return null;
    }

    @Override
    public String getAppearance() {
        return null;
    }
}
  • Phone과 Watch 인터페이스를 상속받은 Device 인터페이스를 생성하였다.
  • Device 인터페이스를 구현하는 일반 클래스에서는 Phone 인터페이스와 Watch 인터페이스에 있는 메소드들을 모두 구현해야만 한다.

추상클래스와 인터페이스 비교

  • 인터페이스는 특정 기능을 구현하기 위한 필수 규격을 주는 것으로 추상클래스는 미완성 설계도, 인터페이스는 기본 설계도로 보면 된다.
  • 모든 클래스를 인터페이스를 사용한다면 공통된 기능을 모두 구현해야 하기 때문에 번거로운 작업이다. 이럴경우 추상 클래스를 이용해야 한다.
  • 하지만, 추상클래스만 사용하기에는 다중상속이 불가하기 때문에 각각 다른 추상 클래스를 구현하는데 공통된 기능이 존재 할 경우는 인터페이스가 필요하다.
profile
나의 공부 일기

0개의 댓글