본문 바로가기
Java

Java_인터페이스(oop)

by 유서담 2023. 11. 10.

인터페이스

 

  • 인터페이스란 하위클래스에서 구현할 기능을 정의해 둔 것
  • 인터페이스는 하위클래스에 특정한 메소드가 반드시 존재하도록 강제할 때 사용
  • 인터페이스는 모든 하위 클래스의 사용법(메소드의 실행방법)을 통일시키는 표준으로 사용
  • 하위클래스는 인터페이스에 정의된 추상화 메소드를 구현(오버라이딩)해야한다
  • 하위클래스는 동시에 여러 개의 인터페이스를 구현할 수 있다

 

인터페이스의 특징

 

  • 인터페이스는 상수, 추상메소드만 갖고있다 (자바 8버전부터 정적 메소드와 디폴트 메소드가 추가 )
  • 인터페이스끼리는 다중 상속이 가능하다
  • 인터페이스는 new 키워드를 사용해서 객체 생성할 수 없다
  • 인터페이스 타입의 참조변수로 객체를 참조할 수 있다

 

 

인터페이스 형식 및 인터페이스를 구현한 구현 클래스정의하기

 

public interface 인터페이스명 {

	// 구현부가 없는 추상메소드
    // 인터페이스에서는 추상메소드에 abstract 키워드를 생략가능
    반환타입 메소드명(매개변수, 매개변수);
    반환타입 메소드명(매개변수, 매개변수);
}

 

 

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

// 구현클래스는 하나 이상의 인터페이스를 구현할 수 있다
// (한 개 이상의 인터페이스를 받아올 수 있다)
// 같은 인터페이스를 구현한 구현클래스들은 사용법이 동일한 구현클래스가 된다

public class 클래스명 implements 인터페이스명, 인터페이스명, 인터페이스명 {

}

 

 

 

인터페이스의 활용

 

  • 인터페이스를 이용해서 하위 클래스의 사용법을 통일시킬 수 있다
  • 인터페이스를 이용하면 클래스 개발자와 클래스 사용자의 협업이 쉬워진다
  • 개발시간을 단축시킬 수 있다 
  • 표준화가 가능
    • 프로젝트에서 사용되는 구현클래스에 대한 기본 틀(기본 설계도)을 인터페이스로 작성한다
    • 개발자들에게 인터페이스를 기본 설계도로 삼아서 구현하게 하면 일관되고, 정형화된 프로그램 개발이 가능
  • 인터페이스를 사용하면 클래스간의 관계가 느슨하게 유지할 수 있다
    • 클래스간의 관계가 느슨하면 다른 클래스로 교체할 때, 수정할 코드가 줄어든다

 

 

인터페이스 예시

 

// 인터페이스 Phone
public interface Phone {
	
	void call(String number);
	void receive();
	void sms(String to, String message);
}

// 인터페이스 Phone을 구현한 NormalPhone
public class NormalPhone implements Phone{

	@Override
	public void call(String number) {
		System.out.println("["+number+"]번호로 전화를 겁니다");
		
	}

	@Override
	public void receive() {
		System.out.println("전화를 받습니다");
		
	}

	@Override
	public void sms(String to, String message) {
		System.out.println("["+to+"]로 ["+message+"]를 보냅니다");
		
	}
}

 

 

// 인터페이스 SmartPhone
public interface SmartPhone {

	void internet();
	void game();
}

// 위 코드블럭에 있는 Phone 인터페이스와 
// SmartPhone 인터페이스를 구현해서 만든 Iphone
public class Iphone implements Phone, SmartPhone{

	@Override
	public void internet() {
		System.out.println("아이폰으로 인터넷을 합니다");
		
	}

	@Override
	public void game() {
		System.out.println("아이폰으로 게임을합니다");
		
	}

	@Override
	public void call(String number) {
		System.out.println("아이폰으로 ["+number+"]로 전화를 겁니다");
		
	}

	@Override
	public void receive() {
		System.out.println("아이폰으로 전화를 받습니다");
		
	}

	@Override
	public void sms(String to, String message) {
		System.out.println("아이폰으로 ["+to+"]에게 ["+message+"]를 보냅니다");
		
	}

	
}

 

 

 

 

 

주석처리한 부분은 객체가 메소드를 상속받지 못해서 오류가 발생한다

 

p4.call("010-1111-2225");
p4.receive();
p4.sms("010-1111-2222", "안녕하세요");


p5.game();
p5.internet();

 

이 부분이 그러하다

 

참조변수 p4는 타입이 SmartPhone 이다. SmartPhone 인터페이스는 internet 추상메서드와 game 추상메서드만 갖고 있기 때문에  Phone 인터페이스에 속한 추상메서드 call, receive, sms 메서드 호출에서 오류가 발생한다

 

반대로  참조변수 p5는 타입이 Phone이다. Phone 인터페이스는 추상메서드 call, receive, sms 만 갖고있고

SmartPhone 인터페이스가 갖고있는 추상메소드를 갖지 못해 오류가 발생함을 알 수 있다