인터페이스(Interface)는 객체 지향 프로그래밍에서 다른 클래스가 특정 메서드들을 구현하도록 강제하는 추상 형태의 일종으로 인터페이스는 클래스와 마찬가지로 데이터와 메서드를 가질 수 있지만, 메서드는 단순한 선언만을 포함하며 본문이 없다. 즉, 모든 메서드는 추상 메서드이다.
인터페이스의 주요 특징과 사용법
- 추상 메서드의 집합: 모든 메서드는 본문이 없는 추상 메서드로 정의됩니다. 구현은 해당 인터페이스를 구현하는 클래스에서 이루어집니다.
- 다중 상속 지원: 클래스는 하나의 클래스만 상속할 수 있지만, 인터페이스는 여러 개를 구현할 수 있습니다. 이는 다중 상속의 한 형태를 제공합니다.
- 구현 강제: 인터페이스를 구현하는 클래스는 인터페이스에 선언된 모든 메서드를 반드시 구현해야 합니다. 이는 강제적인 규약을 제공하여 일관성을 유지하고, 코드의 실수를 방지합니다.
- 인터페이스 간의 확장: 인터페이스도 다른 인터페이스를 확장할 수 있습니다. 이는 여러 인터페이스 간에 공통된 메서드나 속성을 정의할 때 사용됩니다.
인터페이스와 추상화 클래스는 둘 다 객체 지향 프로그래밍에서 공통된 기능을 추상화하고 일반화하기 위한 도구로 사용된다.
인터페이스는
interface
키워드를 사용하여 정의하며, 클래스에서는 implements
키워드를 사용하여 인터페이스를 구현한다. 리모콘 만들기 예제
처음 부터 너희 마음대로 못 만들게 인터페이스로 해줄께!
개발자가 인터페이스 설계도를 하나 준다.

이렇게 짠 설계도에 on(), off() 두개를 준다.
이건
abstract
추상 메서드이다. 

인터페이스는 추상 메서드를 가질 수 있다.
인터페이스 문법 상 앞에 --> public abstract; 안 적어도 된다.

그럼 이제 삼성과, 엘지한테 이제부터 리모콘 납품하려면 인터페이스 지켜! 라고 한다.
그럼 class SamsungRemocon extends Remocon 가 아니라
class SamsungRemocon implements Remocon 라고 리모컨을 쓴다.
근데 이제 만들려고 했더니 오류가 난다.
왜?? 일까? 추상 메서드를 구현해야 하기 때문이다.

그럼 여기서 오버라이드하면 추상 메서드가 구현이 된다.
메서드를 강제 시킨다.

class SamsungRemocon implements Remocon
class LgRemocon implements Remocon
그럼 이것도 다형성이랑 동일해서 타입 일치가 된다.
삼성 리모콘아 너 리모콘이니?
엘지 리모콘아 너 리모콘이니?
new 하면 둘 다 같이 뜬다.
동적 바인딩 메서드이다.
리모콘에 on을 하면 자식에 on 하는거다!
그럼 여기 on, off 절대 안 바뀌고 딱 통일 된다.
여기서 프로그래밍에서는 인터페이스는 추상화가 아니라 메서드 강제라는 것!
강제 시키면 좋은 점은 내가 동적 바인딩을 프로그램을 짤 수 있다는 것!
강제 안 시키면 언제는 이렇게 또 언제는 저렇게 마음대로 만들면 안된다.
package ex07.example; // 인터페이스는 오브젝트일까 ? 아니다 new 이다. interface Remocon { void on(); void off(); } class SamsungRemocon implements Remocon { // interface는 implements에서 만든다. // 인터페이스는 강제성을 띔 --> 메서드 무조건 강제화 시킨다! // 이 구조는 규칙을 만들어서 강제화 시키는 행위이다. @Override public void on() { System.out.println("삼성 리모콘 on"); } @Override public void off() { System.out.println("삼성 리모콘 off"); } } class LgRemocon implements Remocon { @Override public void on() { System.out.println("엘지 리모콘 on"); } @Override public void off() { System.out.println("엘지 리모콘 off"); } } /** * 작성자 : 홍길동 * 날짜 : 2023.12.26 * 구현체 : SamsungRemocon, LgRemocon (구현체가 누군지 적어 줘야함) */ class CommonRemocon { // Remocon <- SamsungRemocon // Remocon <- LgRemocon private Remocon r; // 인터페이스 or 추상 클래스 추측 // 라이브러리 위에는 캡슐화 되어 있고 CommonRemocon 부터 볼 수 있을때 // 리모콘은 오브젝트가 아니구나 // 여기서 디버깅 해보면 인터페이스 or 추상 클래스로 만들었구나 추측 해야한다. // 그럼 내가 직접 못 넣으니까 // 구현한 구현체만 넣을 수 있다. // 구현체는 상속을 한 자식이나 implements 한 구현체 // 그러면 클래스 위에 사용법을 반드시 적어줘야 한다. --> 추적할 수 있게 public CommonRemocon(Remocon r) { // 생성자로 객체 전달 this.r = r; } public void on() { r.on(); } public void off() { r.off(); } } public class InterEx01 { public static void main(String[] args) { // Remocon samsung = new SamsungRemocon(); // Remocon, SamsungRemocon 같이 뜸 // samsung.on(); // 라이브러리에 판매 하려고 한다. --> 생성자 하나 만들기 // CommonRemocon cr = new CommonRemocon(new Remocon()); // new가 떴는지? 왜 new가 안되지?? --> 여기서 라이브러리 사용법 확인 // 구현체 확인하고 // 그럼 이제 내가 공통 리모콘을 하나 만들껀데 삼성 티비를 킬꺼라면 CommonRemocon cr = new CommonRemocon(new SamsungRemocon()); cr.on(); // 호출 --> 이제 공통 리모콘이 만들어짐 } }
//실행 값 삼성 리모콘 on
interface
를 implements
로 오버라이드 시켜서 메서드를 강제 시킬 수 있고
타입을 일치 시켜서 동적 바인딩 시킬 수 있다.
메서드 이름 동일하게 해야한다.
문법은 반드시 알아야 된다.Share article