Programming/Java

10. 인터페이스

주죵 2021. 1. 7. 22:18
728x90
반응형

인터페이스란?

1) 인터페이스는 객체와 객체의 소통수단이다. 하나의 클래스에서 객체를 여러개 만들 수 있다. 인터페이스는 그 객체 사이간의 소통수단이다.

2) 함께 일을 한다면 '~을 해라!'를 정해주는 작업명세서로도 볼 수 있다.

3) 다형성 : Java에서 다형성을 가능하게 한다. 다양한 형태의 type을 취할 수 있게한다. (상속받은 클래스 객체 생성시 부모클래스, 자식클래스 두가지의 타입이 가능했던것처럼!)

4) 디자인 패턴과 프레임 웍을 통해 습득하는 것이 최선!

5) 객체를 부속품화 - 다양한 객체를 제품의 부속품처럼 개발자 마음대로 변경할 수 있다.

 

인터페이스 문법

1) 실제 기능은 없다 - 구현된 기능이 없다. 추상메소드와 상수만이 존재한다. (클래스가 아님!)

2) Private는 안된다! = 상수를 만들 때 private 제한자는 안된다.

3) 추상화 :메소드는 무조건 추상 메소드만 존재한다.

4) 객체타입 : 인터페이스는 객체가 아니다. 다만 객체 타입으로만 사용된다.

5) 구현은 실행되는 객체의 메소드에서 한다.

 

간단한 예시를 보자

 

public interface InterfaceEx {
	
	public static int CONSTANT_NUM = 1000;
	public void calculate();

}


public interface InterfaceEx2 {
	public static final String CONSTANT_STRING = "HelloWorld";
	
	public String getStr();

}

public class InterfaceClass implements InterfaceEx, InterfaceEx2 {
	@Override
	public void calculate() {
		// TODO Auto-generated method stub
		System.out.println("실제구현은 여기");
		
	}
	
	@Override
	public String getStr() {
		// TODO Auto-generated method stub
		System.out.println("실제구현은 여기 2");
		return null;
	}
	

}

public class MainClass {
	
	public static void main(String[] args) {
		InterfaceClass intclass = new InterfaceClass();
		intclass.getStr();
		intclass.calculate();
		
		//다형성 : 같은생성자이지만 type이 다름
		InterfaceEx ife = new InterfaceClass();
		InterfaceEx2 ife2 = new InterfaceClass();
		
		//동시에 타입설정을 통해 사용하는 메소드에 접근 제한이 가능하다.
		ife.calculate(); //InterfaceEx에만 있는 calculate 메소드만 사용가능
		ife2.getStr(); //Ex2에만 있는 getStr메소드만 사용가능
	}

}

 

인터페이스 설정을 통해 class에서 추상메소드 정의를 의무화한다. 실제로 이러한 부분때문에 '작업명세서'라는 표현을 한것도 있다.

내가 팀장이고 팀원에게 프로젝트에 필요한 class하나를 만들어달라고 부탁한다면, 인터페이스를 생성해놓고 부탁하면 되는것처럼. (인터페이스에 선언한 모든 메소드를 팀원이 만들어야하니까!)

또한 다형성의 특징도 가진다.

MainClass에서 보면 같은 클래스의 생성자로부터 왔지만 서로 다른 타입을 갖는 객체들이 존재하는 것을 볼 수 있다.

여기서 타입마다 접근할 수 있는 메소드가 다르단 점도 눈여겨보자. 타입에 따라 접근할 수 있는 메소드가 다르다.(각 interface 타입 객체의 경우 인터페이스에 정의된 메소드에만 접근가능하다)

이는 곧 다형성을 이용한 접근 제한에도 활용이 가능함을 나타낸다.

 

한가지 예시를 더 살펴보자.

아래의 표와 같은 시나리오에 기반해 코딩한다고 해보자

  전화 송/수신 4G TV리모컨 기능
a제품 가능 3G 미탑재
b제품 가능 4G 탑재
c제품 가능 4G 미탑재
public interface IFunction {
	void callSenderReceive();
	void canLTE();
	void canRemote();

}


public class Aphone implements IFunction {
	@Override
	public void callSenderReceive() {
		// TODO Auto-generated method stub
		System.out.println("available");
	}
	@Override
	public void canLTE() {
		// TODO Auto-generated method stub
		System.out.println("Not available");
	}
	@Override
	public void canRemote() {
		// TODO Auto-generated method stub
		System.out.println("Not Included");
	}

}

public class Bphone implements IFunction{
	@Override
	public void callSenderReceive() {
		// TODO Auto-generated method stub
		System.out.println("available");
	}
	@Override
	public void canLTE() {
		// TODO Auto-generated method stub
		System.out.println("available");
	}
	@Override
	public void canRemote() {
		// TODO Auto-generated method stub
		System.out.println("Included");
	}
}

public class Cphone implements IFunction{
	@Override
	public void callSenderReceive() {
		// TODO Auto-generated method stub
		System.out.println("available");
		
	}
	@Override
	public void canLTE() {
		// TODO Auto-generated method stub
		System.out.println("available");
	}
	@Override
	public void canRemote() {
		// TODO Auto-generated method stub
		System.out.println("Not Included");
	}

}

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		IFunction aphone = new Aphone();
		IFunction bphone = new Aphone();
		IFunction cphone = new Aphone();
		
		IFunction[] ifunc = {aphone,bphone,cphone};
		
		for (int i=0; i<ifunc.length;i++) {
			ifunc[i].callSenderReceive();
			ifunc[i].canLTE();
			ifunc[i].canRemote();
			System.out.println("############");
		}
	}

}

  인터페이스에 기반하여 3개의 폰에 대한 클래스를 만들었다. 이제 이를 출력할 MainClass를 보자.

여기서 다형성이 빛을 발한다! 3개의 폰에서 나온 객체의 타입을 모두 통일시켰다.

타입이 모두 같으므로 list에 넣을수도 있고 for 문도 쉽게 돌릴수 있다. 얼마나 간편한가!!

복잡한 수준의 코딩은 서로 다른 클래스에서 객체를 만들텐데 타입이 다르면 함께 처리하기 어려울 수 있다. 인터페이스기능은 다형성을 이용해 이를 용이하게한다.

 

인터페이스와 다중상속

자바에서는 다중상속이 불가능하다. 그러나 인터페이스를 통해 여러가지 타입으로 객체를 선언할 수 있다. (이것때문에 다자바는 다중상속이 존재한다 말하기도 한다.) 정확히는 다중상속이 아닌 '다형성' 이 존재하여 '다중구현'이 가능하다고 하는게 맞는 표현이다.

 

 

인터페이스 vs 추상클래스

공통점

  • 추상메소드를 가지고 있어 하위클래스에서 구현해야 한다
  • 데이터 타입이 목적 : 객체생성이 아닌 데이터 타입 정의가 목적이다
  • 객체 생성은 anonymose를 이용해야한다

차이점

  • 상속/구현 : 추상메소드는 상속을 통한 사용 vs 인터페이스는 구현을 통한 사용
  • 구성요소 : 추상클래스는 일반클래스와 동일하게 변수, 메소드 기능 수행 가능 vs 인터페이스는 상수와 추상메소드만 존재
  • 단일상속, 다중구현 : 추상클래스는 상속이므로 단일 상속만 지원 vs 인터페이스는 다중 구현이 가능

 

출처 : 신입 SW인력을 위한 실전 자바(by 블스)

728x90

'Programming > Java' 카테고리의 다른 글

12. API  (0) 2021.01.11
11. 패턴을 통한 객체지향 언어의 이해  (0) 2021.01.10
9. 추상클래스  (0) 2021.01.07
8. 상속  (0) 2021.01.04
7. Static  (0) 2021.01.03