본문 바로가기

JAVA

인터페이스

1. 인터페이스란?

 

인터페이스는 추상 메서드와 상수를 멤버로 같는 일종의 추상 클래스이다.

🖍 JDK1.8 부터는 static 메서드와 default 메서드를 추가함

앞서 추상 클래스를 미완성 설계도라고 하였는데,

인터페이스는 그보다 더 추상화 되어 있기 때문에 구상 클래스를 위한 '기본 설계도' 정도라고 생각하면 된다.

추상 메서드를 갖기 때문에 인터페이스를 상속하는 자식 클래스에서는 해당 추상 메서드를 구현해야 한다.

구상 클래스 : 완벽한 설계도
추상 클래스 : 미완성 설계도
인터페이스 : 기본 설계도

 

 

2. 인터페이스 구현

 

인터페이스는 class 대신 interface 키워드를 사용하여 작성할 수 있다.

또한 몇 가지 제한 사항이 있는데 다음과 같다.

1. 모든 멤버 변수는 public static final 이어야 하며, 생략 가능하다.
2. 모든 메서드는 public abstract 이어야 하며, 생략 가능하다.

생략이 가능한 이유는 모든 멤버에 강제되는 사항이기 때문에 가독성을 위하여 생략 처리하고 이를 컴파일러가 자동으로 추가하여 실행시킬 수 있도록 한다.

interface 인터페이스이름 {
	
    // 멤버 변수 : 전역 상수
    public static final 타입 상수이름 = 값;
    
    // 메서드 : 추상 메서드
    public abstract 메서드이름(매개변수);
}


class 클래스이름 implements 인터페이스이름 {
	
    // 인터페이스 구현
    
}

🖍 추상 메서드를 작성 시에는 반드시 블록을 작성하지 않아야 한다.

    블록을 작성하면 구현이 되어 있지 않아도 컴파일러는 구현이 완료된 메서드로 판단하게 된다.

 

만일 클래스에서 인터페이스의 일부만을 구현하고자 할 때는 마찬가지로 추상 메서드로 선언하면 되는데, 

여기서 주의할 점은 클래스가 추상 메서드를 가지려면 반드시 해당 클래스는 추상 클래스가 되어야 한다는 점이다.

 

 

3. 인터페이스의 장점

 

🔹 다형성

클래스의 다형성처럼 인터페이스 또한 자신의 참조 변수에

자신을 구현한 구상 클래스의 인스턴스의 주소값을 저장할 수 있다.

즉, 매개 변수, 리턴 타입으로도 활용이 가능하다는 것이다.

 

🔹 개발시간 단축

 인터페이스로 프로젝트에서 사용될 공통 코드를 추상 메서드로 작성해놓게 되면,

호출만을 하게 되는 쪽에서는 메서드의 구현부를 알 필요가 없기 때문에 선언부의 내용만으로

양쪽에서의 개발을 수월하게 진행할 수 있게 된다.

 

🔹표준화

 추상 메서드로 선언부를 강제하고 있기 때문에 형식에 있어서 일관성을 보장하게 된다.

 

🔹 클래스 간의 관계 생성

클래스 간의 상속은 한 번만 가능하지만, 인터페이스의 경우에는 다중 상속이 가능하기 때문에

연결지어 주는 것에 대해 비교적 쉽게 접근할 수 있다.

 

🔹 독립적인 프로그래밍

인터페이스로 구현하게 되면, 실제 구현을 제각기 인터페이스를 상속 받은 다른 클래스에서 하기 때문에 

클래스 간의 변경 사항에 서로 큰 영향을 받지 않게 된다. 

 

class A {
    public void methodA(B b) {
    	b.methodB();
    }
}

class B {
	public void mehodB() {
    	System.out.println("methodB()");
    }
}

이런 경우 A 클래스의 methodA 를 호출하기 위해서는 B 클래스 인스턴스가 반드시 필요하게 된다.

이러한 관계를 결합도가 높은 상태라고 한다.

클래스 간의 결합도가 높게 되면 한 쪽을 수정했을 경우 연관된 다른 한 쪽을 수정해야 한다는 단점이 생긴다.

클래스 간의 결합도를 낮추기 위해서는 다음과 같이 인터페이스를 활용할 수 있다.

 

interface I {
	public abstract void methodB();
}

class B implements I {
	public void methodB() {
    	System.out.println("methodB in B class");
    }
}

class A {
	public void methodA(I i) {
    	i.methodB();
    }
}

A 클래스에서 B 클래스 대신 인터페이스 I를 사용할 수 있도록 변경하였다.

이러한 경우 인터페이스 I 를 상속 받은 B 인스턴스도 메서드의 매개 변수로 활용이 가능해진다.

하지만 A 입장에서는 인터페이스 타입이기만 하면 되기 때문에

참조 변수가 어떤 인스턴스를 참조하고 있는지는 몰라도 된다.

이런 것을 결합도를 낮췄다고 할 수 있다.

'JAVA' 카테고리의 다른 글