Programming 언어/JAVA

12. 인터페이스(interface)

하냥집사 2023. 8. 30. 18:25

1. 인터페이스

인터페이스란?

추상 클래스(abstract class)와 마찬가지로 추상화된 데이터나 동작을 정의하는데 사용되는 중요한 개념

1. 모든 메서드가 추상 메서드로 선언됨 -> public abstract

2. 모든 변수는 상수로 선언됨 -> public static final

3. 자바 8부터 디폴트 메서드와 정적 메서드 기능 제공으로 일부 구현 코드가 있다.

인터페이스 구현

쩜쩜쩜 화살표는 구현이라는 뜻

오른쪽처럼 구현하면 implements를 사용해줘야함

// implements 키워드 //

java에서 implements 키워드는 인터페이스를 구현할 때 사용, 클래스나 추상 클래스는 extends 키워드를 이용하여 상속받지만, 인터페이스는 implement 키워드를 이용하여 구현

즉, 인터페이스에 선언된 모든 메서드를 클래스에서 구현하게 되면, 클래스는 해당 인터페이스를 구현했다고 말할 수 있다.

인터페이스 형 변환

1. 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있음 

-> Calc calc = new CompleteCalc(); Calc 형

2. 상속에서의 형 변환과 동일한 의미

3. 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스 구현 가능

4, 형 변환되는 경우 인터페이스에 선언된 메서드만 사용 가능

클래스와 인터페이스의 차이

인터페이스와 클래스는 모두 객체 지향 프로그래밍에서 사용되는 개념이지만, 목적과 특징이 다름

인터페이스 

1. 추상화를 통해 어떤 객체가 가지고 있는 기능이 무엇인지를 나타내는 일종의 계약서

2. 인터페이스는 뼈대만 제공하고 구현을 강제하지 않기에, 다양한 객체들이 같은 인터페이스를 구현하여 서로 다른 구현 제공 가능

3. 자바에서 인터페이스는 interface라는 키워드로 선언하며, 다른 클래스에서는 해당 인터페이스를 구현하기 위해 implements 키워드 사용

클래스

1. 객체를 생성하기 위한 설계도

2. 멤버 변수와 메서드를 가질 수 있으며, 객체 생성 후 해당 객체의 메서드를 호출하여 작업 수행 가능

3. 여러 개의 클래스를 상속받아 여러 개의 속성과 메소드를 한 클래스에서 사용 가능

즉, 인터페이스는 객체가 가져야 할 기능 정의에 초점, 클래스는 객체를 생성하고 사용하기 위한 설계도를 제공하는데 초점

2. 인터페이스를 왜 쓰는가?

인터페이스가 하는 일

1. 클래스나 프로그램이 제공하는 기능을 명시적으로 선언

2. 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세

3. 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음

-> 클라이언트가 서버를 사용하려는데 서버가 어찌 구현되어 있는지는 인터페이스를 보고 알 수 있는것

4. 어떤 객체가 하나의 인터페이스 타입이라는 것은, 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미

5. 인터페이스를 구현한 다양한 객체를 사용함 -> 다형성

6. ex) JDBC 인터페이스

어떤 객체가 그 인터페이스 타입이다!! 라는 것은 인터페이스가 제공하는 모든 메서드를 구현했다는 의미

3. 인터페이스를 활용한 다형성 

인터페이스와 다형성

하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은 인터페이스의 메서드를 활용하여 여러 객체의 구현을 사용할 수 있음 -> 다형성

이런 예들이 있다.

3. 인터페이스의 여러가지 요소

상수

모든 변수는 상수로 변환된다. ->  public static final

추상 메서드

모든 선언된 메서드는 추상 메서드 -> public abstract

디폴트 메서드

구현을 가지는 메서드 -> 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드

1. default 키워드 사용

2, 구현하는 클래스에서 재정의 할 수 있음

3. 인터페이스를 구현한 클래스의 인스턴스가 생성되어애 사용 가능 -> 즉, new 이후에 사용 가능!!

정적 메서드(static 메서드)

인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드

private 메서드

인터페이스 내부에서만 사용하기 위해 구현하는 메서드

1. 인터페이스를 구현한 클래스에서 사용하거나 재정의 불가

2. default 메서드나 static 메서드에서 사용

4. 인터페이스 구현

1. 자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스 구현 가능

2. 디폴트 메서드가 중복되는 경우 구현하는 클래스에서 재정의해야함

3. 여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스에 선언된 메서드만 사용 가능

1번 2번 3번을 종합해서 이야기하자면

단일 상속이 아니여도 괜찮다라는 것! -> 인터페이스는 구현이 없으니까

(하지만 클래스는 다이아몬드 problem 때문에 단일 상속만 가능!)

만약 Buy, Sell 둘 다 order()를 가지면 둘 중 어느 클래스의 메서드를 사용할 건지 정하거나 오버라이딩해 줘야 함

// 다이아몬드 problem // 

객체 지향 프로그래밍에서 다중 상속을 지원하는 언어에서 발생할 수 있는 충돌 문제를 나타내는 용어

파생 클래스가 상위 클래스로부터 같은 이름의 메서드나 속성을 상속받을 때 어떤 메서드나 속성을 사용해야 할지 모호성이 발생하며, 이로 인해 다이아몬드 모양의 상속 구조가 형성

5. 인터페이스의 상속

1. 인터페이스 사이에도 상속을 사용할 수 있다.

2. extends 키워드 사용

3. 인터페이스는 다중 상속이 가능하고 구현 코드 상속이 아니므로 타입 상속이라함

이렇게 상속 가능!!