Interface

YongJun·2023년 9월 14일

JAVA

목록 보기
17/24
post-thumbnail

Interface

인터페이스는 한마디로 말하자면 일종의 추상 클래스다. 추상 클래스처럼 추상메서드를 갖지만, 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 추상 메서드와 상수만을 멤버로 가질 수 있다.
추상 클래스를 부분적으로만 완성된 미완성 설계도라고 한다면 인터페이스는 밑그림만 그려져 있는 기본 설계도라고 할 수 있다.

  • 표준명세서의 역활
  • 상수와 추상메소드만 존재
    public static final는 생략가능
    abstract는 생략가능
    자바8부터 인터페이스에 default 메소드와 static 메소드를 추가할 수 있다.
  • interface를 implements 한 클래스는 반드시 추상메소드를 Override(재구현)해주어야 한다.
  • Override(재구현) 할때 반드시 public를 붙여야 한다.
  • 다중상속(부모가 2명 이상)이 가능(class는 다중상속X)
  • 상속과 같이 쓰일때는 extends, implements 순서로 쓴다.

형식

interface 인터페이스명 {
   .....
}
class 클래스명 implements 인터페이스명{
   ...
}

사용이유

그렇다면 바로 구현하면 되지 왜 귀찮게 서비스 인터페이스 만들고 구현 클래스를 따로 만드는 걸까?

개발 기간을 단축 시킬 수 있다
일단 인터페이스와 구현 클래스를 나누어서 작업하면, 인터페이스만 먼저 작성해놓으면 이 틀을 사용해서 프로그램을 작성할 수 있다. 또한, 한 쪽에서 구현 클래스를 작성하면서 동시에 다른 개발을 진행할 수 있다.

표준화가 가능하다
아까부터 틀이라는 단어를 계속 사용하고 있는데, 이렇게 인터페이스로 틀을 잡아 놓고 개발을 하게 되면 여러 명의 개발자가 작업을 할 때도 일관된 틀안 에서 그 안의 내용을 구현하면서 개발이 진행되므로 정형화된 작업이 가능하다.

서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다
서로 상속(extends)관계도 아니고 조상 클래스도 갖고 있지 않은 아무런 관계도 없는 클래스들이 하나의 인터페이스를 공통적으로 구현하게 하면 관계를 맺어줄 수 있다.

독립적인 프로그래밍이 가능하다
클래스의 선언(interface > Service)과 구현(class > ServiceImpl)을 분리시킴으로써 독립적인 프로그래밍이 가능하다. 만약 모든 클래스들을 직접 관계로 한다면, 한 클래스를 변경할 때마다 직접 관계로 맺어진 클래스를 모두 수정해야 할 것이다. 하지만 선언과 구현을 나누면서 간접적인 관계로 변경하면, 하나의 클래스를 변경하더라도 다른 클래스에 영향을 미치지 않게 된다.

예제

package interface_;

public interface InterA {
	//only 상수
	public static final String NAME = "홍길동";
	int AGE = 25; //public static final생략가능
	
	//only 추상 메소드
	public abstract void aa();
	public void b(); //abstract생략가능
}
/*
이렇게 전체적인 틀을 짜준 후, 실제 구현 클래스에서 메서드 내용 부분을 채워넣어 구현(implements)을 해주는 것이다.
*/
package interface_;

public interface InterB {
	public void cc();
	public void dd();
}
package interface_;

public interface InterC extends InterA, InterB{ //다중 상속 가능
	//추상 메소드 4개
//	@Override
//	default void aa() {
//		// TODO Auto-generated method stub
//		
//	}
//	
//	@Override
//	default void b() {
//			// TODO Auto-generated method stub
//			
//	}
//	
//	@Override
//	default void cc() {
//			// TODO Auto-generated method stub
//			
//	}
//	
//	@Override
//	default void dd() {
//			// TODO Auto-generated method stub
//			
//	}
	
/*
extends(상속) 하는 경우, 추상메소드는 반드시 Sub Class에서 Override 꼭 해 주어야 한다.
but, 하위 인터페이스(Inter C)에서는 상위 인터페이스(Inter A, Inter B)의 추상 메서드를 반드시 오버라이드(override)할 필요는 없다.
이 경우, 하위 인터페이스(InterC)를 구현(implement)한 클래스(InterMain)에서 상위 인터페이스(Inter A, Inter B)의 추상 메서드를 모두 구현해야 합니다.

interface간 상속 가능
class는 다중상속이 불가능하지만, interface는 다중상속 가능
단, 상속(extends)의 경우 class extends class, interface extends interface 만 가능(Mix X)

[EX] 맞는 문장을 모두 고르시오
class A{}
interface InterA{}

1. class B extends A { }   0
2. class B implements InterA { } 0
3. class B implements A { } x
4. class B extends InterA { } x
5. interface InterB  extends A { } x
6. interface InterB  implements InterA { } x --> class B implements InterA { }
7. interface InterB  implements A { } x
8. interface InterB  extends InterA { } o


상수와 추상메소드만 존재(필드 선언 X)
인터페이스만으로 객체 생성 X -> 인터페이스의 변수를 가지고 (인터페이스를 구현한)클래스의 객체를 참조, 익명 내부 클래스 사용
*/
}
package interface_;

public class InterMain implements InterC{
/*
interface를 implements 한 클래스는 반드시 추상메소드를 Override(재구현)해주어야 한다.
Override(재구현) 할때 반드시 public를 붙여야 한다.
 */
	public void aa() {
		
	}
	public void b() {
		
	}
	public void cc() {
		
	}
	public void dd() {
		
	}
	public static void main(String[] args) {
		
	}
}
profile
개(발자어)린이

0개의 댓글