[이것이 자바다] CH08. 인터페이스, 확인문제

2025. 4. 8. 00:08· JAVA/이것이 자바다
목차
  1. 인터페이스 역할
  2. 인터페이스를 사용하는 이유
  3. 인터페이스와 구현 클래스 선언
  4. 인터페이스 선언
  5. 구현 클래스 선언
  6. 변수 선언과 구현 객체 대입
  7. 인터페이스의 선언
  8. 상수 필드
  9. 추상 메소드
  10. 디폴트 메소드
  11. 정적 메소드
  12. private 메소드
  13. 다중 인터페이스 구현
  14. 인터페이스 상속
  15. 타입 변환
  16. 자동 타입 변환
  17. 강제 타입 변환
  18. 다형성
  19. 매개변수의 다형성
  20. 확인문제
  21. 1번 정답: 1
  22. 2번 정답: 3
  23. 3번 정답: 4
  24. 4번 정답: 1, 2, 3, 4

인터페이스 역할


인터페이스는 사전적인 의미로 두 장치를 연결하는 '접속기'를 말한다.

 

출처: 이것이 자바다(개정판)

 

인터페이스를 사용하는 이유


단순하게 객체 A가 B를 호출하게 구현하는게 아니라 중간에 인터페이스를 두는 이유는 뭘까?

 

인터페이스는 다형성(Polymorphism)과 유연한 설계를 가능하게 해주는 도구이다.

 

다형성을 구현하기 위해

다형성(Polymorphism)이란?
하나의 타입(부모/인터페이스)으로 여러 형태(구현 클래스)를 표현할 수 있는 성질
즉, 같은 메소드 호출인데 객체에 따라 다르게 동작하는 것

 

출처: 이것이 자바다(개정판)

 

인터페이스를 구현하면 다양한 구현체를 같은 타입으로 다룰 수 있다.

 

예제처럼, 객체 A가 인터페이스의 메소드를 사용하게 구현한다면 객체 A는 객체 B가 객체 C로 변경되더라도 객체를 변경하는 추가적인 작업이 필요하지 않게 된다. 만약 객체 B의 메소드 실행결과와 객체 C의 메소드 실행 결과가 다르다면, 객체 A는 객체 교체로 인해 다른 결과를 얻게 된다.

 

이를 통해 코드의 유연성과 확장성은 높아지게 된다.

 

결합도 낮추기 (느슨한 연결, Low Coupling)

인터페이스를 사용함으로써 클래스 간 직접적인 의존 대신 인터페이스에 의존하게 하여 유연한 구조 설계를 가능하게 한다.

 

유연한 확장과 유지보수

새로운 기능이 추가되더라도 기존 코드를 거의 건드리지 않을 수 있다.

 

 

다음과 같은 코드가 있다고 가정해보자. 

public class Television {
    public void turnOn() {
        System.out.println("TV를 켭니다.");
    }
}

public class Audio {
    public void turnOn() {
        System.out.println("Audio를 켭니다.");
    }
}

public class RemoteController {
	// 각 객체에 강하게 의존
    // 기능이 추가될 때마다 기존 로직이 수정되어야함
    Television television = new Television();
    Audio audio = new Audio();

    public void turnOnTelevision() {
        television.turnOn();
    }
    
    public void turnOnAudio() {
		audio.turnOn();
    }
}

 

 

해당 코드는 Television이나 Audio 코드가 변경되면 RemoteController의 코드도 함께 변경되어야한다.

 

이 코드를 인터페이스를 사용하여 구현해보자.

public interface RemoteControl {
    void turnOn();
}

public class Audio implements RemoteControl {
    @Override
    public void turnOn() {
        System.out.println("Audio를 켭니다.");
    }
}

public class Television implements RemoteControl {
    @Override
    public void turnOn() {
        System.out.println("TV를 켭니다.");
    }
}

public class RemoteController {
    RemoteControl remoteControl;

    public RemoteController(RemoteControl remoteControl) {
        this.remoteControl = remoteControl;
    }

    public void turnOnTelevision(RemoteControl remoteControl) {
        remoteControl.turnOn(); // 인터페이스만 알면 된다.
    }
}

 

이제 RemoteController는 Televsion이나 Audio가 수정되거나, 기능이 추가되더라도 인터페이스만 알면 얼마든지 확장이 가능하게된다.

 

 

인터페이스와 구현 클래스 선언


인터페이스 선언


인터페이스 선언은 class 키워드 대신 interface 키워드를 사용한다.

접근제한자로는 default, public를 붙일 수 있다.

 

구현 클래스 선언


인터페이스의 구현체는 인터페이스를 구현하고 있음을 선언부에 명시해야한다.

public class B implements 인터페이스명 { ... }

 

변수 선언과 구현 객체 대입


인터페이스도 하나의 타입이므로 변수의 타입으로 사용할 수 있다.

인터페이스는 참조 타입에 속하므로 인터페이스 변수에는 객체를 참조하고 있지 않다는 뜻으로 null을 대입할 수 있다.

RemoteControl rc;
RemoteControl rc = null;

 

 

인터페이스를 통해 구현 객체를 사용하려면, 인터페이스 변수에 구현 객체를 대입해야하여 사용해야한다.

rc = new Television();

rc.trunOn();

 

 

인터페이스의 선언


멤버 설명
상수 필드 public static final 특성을 갖는 불변의 상수 필드를 멤버로 가질 수 있다.
추상 메소드 구현 클래스가 재정의해야하는 public 추상메소드(abstract method)를 멤버로 가질 수 있다.
디폴트 메소드 완전한 실행 코드를 가진 디폴트 메소드를 선언할 수 있다. 
정적 메소드 추상 메소드와 디폴트 메소드는 구현 객체가 필요하지만, 정적 메소드는 구현 객체가 없어도 인터페이스만으로 호출할 수 있다.

 

상수 필드


인터페이스는 public static final 특성을 갖는 불변의 상수 필드를 멤버로 가질 수 있다.

 

인터페이스에 선언된 필드는 모두 public static final 특성을 갖기 때문에 public static final을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

 

[ public static final ] 타입 상수명 = 값;

 

 

추상 메소드


인터페이스는 구현 클래스가 재정의해야하는 public 추상메소드(abstract method)를 멤버로 가질 수 있다.

public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.

 

[ public abstract ] 리턴타입 메소드명(매개변수, ...);

 

추상 메소드는 객체 A가 인터페이스를 통해 어떻게 메소드를 호출할 수 있는 지 방법을 알려주는 역할을 한다.

인터페이스 구현 객체 B는 추상 메소드의 실행부를 갖는 재정의된 메소드가 있어야한다.

 

출처: 이것이 자바다(개정판)

 

 

구현 클래스에서 추상 메소드를 재정의할 때 주의할 점은 인터페이스의 추상 메소드는 기본적으로 public 접근 제한을 갖기 때문에 public보다 더 낮은 접근 제한으로 재정의할 수 없다

 

 

디폴트 메소드


인터페이스는 완전한 실행 코드를 가진 디폴트 메소드를 선언할 수 있다. 추상 메소드는 실행부가 없지만, 디폴트 메소드는 실행부가 있다.

 

[ public ] default 리턴타입 메소드명(매개변수, ...) { ... }

 

구현 클래스는 디폴트 메소드를 재정의할 수도 있다.

이때 주의할 점은 public 접근 제한자를 반드시 붙여야하고, default  키워드를 생략해야한다.

 

정적 메소드


추상 메소드와 디폴트 메소드는 구현 객체가 필요하지만, 정적 메소드는 구현 객체가 없어도 인터페이스만으로 호출할 수 있다.

단, public을 생략하더라도 자동으로 컴파일 과정에서 붙게된다.

 

[ public | private ] static 리턴타입 메소드명(매개변수, ...) { ... }

 

private 메소드


상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드는 모두 public 접근제한자를 갖는다.

따라서 public을 생략하더라도 컴파일 과정에서 public 접근 제한자가 붙어 항상 외부에서 접근이 가능하다.

또한 외부에서 접근할 수 없는 private 메소드 선언도 가능하다.

 

 

다중 인터페이스 구현


구현 객체는 여러개의 인터페이스를 implements할 수 있다.

출처: 이것이 자바다(개정판)

 

public class 구현클래스명 implements 인터페이스A, 인터페이스B {
	// 모든 추상 메소드 정의
}

 

 

인터페이스 상속


인터페이스도 다른 인터페이스를 상속할 수 있으며, 클래스와는 달리 다중 상속을 허용한다.

 

public interface 자식인터페이스 extens 부모인터페이스1, 부포인터페이스2 { ... }

 

자식 인터페이스의 구현 클래스는 자식과 부모의 모든 추상 메소드를 재정의해야한다.

그리고 구현객체는 자식 및 부모 인터페이스 변수에 대입될 수 있다.

 

자식인터페이스 변수 = new 구현클래스(...);
부모인터페이스1 변수 = new 구현클래스(...);
부모인터페이스2 변수 = new 구현클래스(...);

 

 

타입 변환


자동 타입 변환


부모 클래스가 인터페이스를 구현하고 있다면 자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있다.

 

출처: 이것이 자바다(개정판)

 

B, C, D, E로부터 생성된 객체는 모두 인터페이스 A로 자동 타입 변환될 수 있다.

 

강제 타입 변환


자동 타입 변환 후에 구현 객체에 선언된 메소드(인터페이스에 선언되지 않은)를 호출하고 싶다면 원래 객체로 강제 타입 변환을 해야한다.

 

출처: 이것이 자바다(개정판)

 

RemoteControl = new Television();
rc.turnOn();
rc.turnOff();
rc.setVolume();

Television tv = (Television) rc;
tv.trunOn();
tv.turnOff();
tv.setVolume();
tv.setTime();
tv.record();

 

 

다형성


매개변수의 다형성


매개변수의 타입을 인터페이스로 선언하면 메소드 호출 시 다양한 구현 객체를 대입할 수 있다.

 

 

이렇게 매개변수의 다형성을 사용해서 메소드를 선언할 때, 원하는 구현체의 메소드를 실행시킬 수 있다.

 

public interface Vehicle {
    void run();
}

public class Bus implements Vehicle {
    @Override
    public void run() {
        System.out.println("버스가 달립니다.");
    }
}

public class Taxi implements Vehicle {
    @Override
    public void run() {
        System.out.println("택시가 달립니다.");
    }
}

public class Driver {
    void drive(Vehicle vehicle) {
        vehicle.run();
    }
}

public class DriverExample {
    public static void main(String[] args) {
        // Driver 객체 생성
        Driver driver = new Driver();
        
        // 매개값으로 구현 객체 대입 (다형성: 실행 결과가 다름)
        driver.drive(new Bus()); // 버스가 달립니다.
        driver.drive(new Taxi()); // 택시가 달립니다.
    }
}

 

 

확인문제


1번 정답: 1

인터페이스로 객체(인스턴스)를 생성할 수 없다. 인터페이스는 생성자를 가질 수 없으며, 상수와 메소드만을 멤버로 가진다.

 

2번 정답: 3

디폴트 메소드도 구현 클래스에서 재정의할 수 있다. 디폴트 메소드는 추상 메소드와 다르게 실행부가 존재한다.

 

3번 정답: 4

구현 객체를 인터페이스 타입으로 변환하는 것은 '자동 타입 변환'이다.

 

4번 정답: 1, 2, 3, 4

 

저작자표시 비영리 (새창열림)

'JAVA > 이것이 자바다' 카테고리의 다른 글

[이것이 자바다] CH09. 중첩 선언과 익명객체  (1) 2025.04.08
[이것이 자바다] CH04. 조건문과 반복문, 확인문제  (1) 2025.03.17
[이것이 자바다] CH03. 연산자, 확인문제  (0) 2025.03.16
[이것이 자바다] CH02. 변수와 타입, 확인문제  (0) 2025.03.16
[이것이 자바다] CH01. 자바 시작하기, 확인문제  (3) 2025.03.16
  1. 인터페이스 역할
  2. 인터페이스를 사용하는 이유
  3. 인터페이스와 구현 클래스 선언
  4. 인터페이스 선언
  5. 구현 클래스 선언
  6. 변수 선언과 구현 객체 대입
  7. 인터페이스의 선언
  8. 상수 필드
  9. 추상 메소드
  10. 디폴트 메소드
  11. 정적 메소드
  12. private 메소드
  13. 다중 인터페이스 구현
  14. 인터페이스 상속
  15. 타입 변환
  16. 자동 타입 변환
  17. 강제 타입 변환
  18. 다형성
  19. 매개변수의 다형성
  20. 확인문제
  21. 1번 정답: 1
  22. 2번 정답: 3
  23. 3번 정답: 4
  24. 4번 정답: 1, 2, 3, 4
'JAVA/이것이 자바다' 카테고리의 다른 글
  • [이것이 자바다] CH09. 중첩 선언과 익명객체
  • [이것이 자바다] CH04. 조건문과 반복문, 확인문제
  • [이것이 자바다] CH03. 연산자, 확인문제
  • [이것이 자바다] CH02. 변수와 타입, 확인문제
Anna-Jin
Anna-Jin
Anna-Jin
내일 한걸음 더
Anna-Jin
TOTAL
TODAY
YDAY
  • CATEGORY (212)
    • Project (0)
      • Zero2One.Dev (0)
    • Algorithm (40)
      • Leetcode (20)
      • Programmers (1)
      • CODETREE (0)
      • Baekjoon (7)
      • etc (12)
    • JAVA (42)
      • JAVA (20)
      • 점프투자바 (16)
      • 이것이 자바다 (6)
    • Spring boot (20)
    • Database (9)
    • CS (11)
    • Study (80)
      • Trouble Shooting (11)
      • TIL (50)
      • WIL (11)
      • Etc (8)
    • Review (10)
    • Projects (0)
      • Blog (0)

BLOG MENU

  • GITHUB
  • RESUME

공지사항

POPULAR POSTS

태그

  • 리트코드
  • Wil
  • JPA
  • 자료구조
  • 코테
  • 확인문제
  • leetcode
  • 알고리즘
  • 항해99
  • 이것이 자바다
  • 트러블슈팅
  • spring boot
  • 코딩테스트
  • Java
  • MySQL
  • til
  • 회고록
  • Algorithm
  • 자바
  • 삽질로그

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
Anna-Jin
[이것이 자바다] CH08. 인터페이스, 확인문제
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.