[Java] 인터페이스(Interface)

u_yonu·2026년 2월 13일

Java

목록 보기
14/18
post-thumbnail

인터페이스(Interface)

인터페이스의 개념

인터페이스(Interface)는 원래 다양한 분야에서 쓰이는 용어로, 두 개체가 상호작용 하는 방식을 정의하는 경계를 의미한다.
예시) 개체 : 시스템/장치/프로그램 등
즉, 서로 다른 두 대상이 같이 동작하기 위해 필요한 언어와 규칙(표준)을 정해주는 역할이다.
이 규칙을 통해 내부가 복잡하더라도 사용자는 단순한 방식으로 기능을 활용가능하고, 다른 구성요소들도 동일한 규칙을 따라 일관되게 확장될 수 있다.

예시1)
두 개체: 노트북(시스템) ↔ USB 메모리/키보드/마우스(장치)
인터페이스(경계): USB 규격(포트 모양, 전압/신호, 통신 방식)

예시2)
두 개체: 쇼핑몰 서버(프로그램) ↔ 결제대행사 API(다른 프로그램)
인터페이스(경계): “결제 요청/응답” API 규격(필드명, 요청 방식, 응답 코드)

자바에서의 인터페이스

자바에서의 인터페이스는 이러한 개념을 코드로 옮긴 것으로, 한마디로 완전히 추상화된 설계도(규격)이다.

  • 클래스와 문법적으로 비슷하지만 class 대신 interface 키워드를 사용

  • 기본적으로 인터페이스의 메서드는 추상 메서드로 취급
    (Java 8부터 default 메서드와 static 메서드가 추가되어 예외가 생김)

  • 인터페이스에 선언된 메서드는 기본적으로 public abstract 이며 생략 가능

  • 인터페이스에 선언된 변수는 자동으로 public static final(상수)로 간주되며 생략 가능

인터페이스의 구현

  • 인터페이스는 인스턴스를 직접 생성할 수 없음
  • 따라서 인터페이스를 사용하려면, 클래스가 implements 키워드로 구현(implements) 해야 함

예시 코드)

interface Basic {}
class Advanced extends Basic{}
=> 불가능
class Advanced implements Basic{}
=> 가능
  • 하나의 클래스는 여러 개의 인터페이스를 다중 구현할 수 있음

  • 구현 클래스는 인터페이스에 선언된 모든 추상 메서드를 반드시 구현(override) 해야 객체를 생성할 수 있음

  • 만약 일부만 구현한다면, 그 클래스는 추상 클래스(abstract class) 로 선언되어야함

인터페이스의 상속

  • 인터페이스는 extends 키워드를 사용해 다른 인터페이스를 상속

  • 클래스와 달리 인터페이스는 다중 상속이 가능
    (일반적으로 구현부 없이 규격(메서드 선언)만 정의하므로 충돌 위험이 상대적으로 적기 때문)

default 메서드 (Java 8+)

  • 인터페이스에도 구현부가 있는 메서드를 정의할 수 있음
    → 선언 시 메서드 앞에 default 키워드를 반드시 붙임

  • 접근 제한자는 public만 가능하며, public은 생략 가능

  • 구현 클래스는 필요하면 default 메서드를 재정의(override) 할 수 있음

  • 기존 인터페이스에 메서드를 추가해야 할 때, 모든 구현 클래스가 한꺼번에 깨지는 문제를 줄이기 위해 사용
    → 기본 구현을 인터페이스에 제공하므로, 구현체가 반드시 구현할 필요는 없음

cf) default method 충돌 해결

  • 여러 인터페이스의 디폴트 메서드 간의 충돌
    → 구현 클래스에서 오버라이딩
  • 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
    → 자동으로 조상 클래스 상속

정적(static) 메서드 (Java 8+)

  • 인터페이스에도 static 메서드를 선언할 수 있으며, 사용 방식은 클래스의 static 메서드와 동일

  • 호출은 인터페이스명.메서드() 형태로 함 (구현 클래스의 객체로 호출하지 않음)

  • 해당 인터페이스와 관련된 유틸리티/헬퍼 기능을 제공할 때 유용

  • static 메서드는 구현 클래스에 상속되지 않으며, 구현 클래스에서 재정의(override) 할 수도 없음

private 메서드(Java 9+)

  • 인터페이스 내부에서만 사용되는 헬퍼 메서드
  • 디폴트 메서드, 정적 메서드에서 반복되는 로직 분리 후 작성
  • 외부에서 접근하지 못하도록 숨김
  • 재사용성 증가
  • static 키워드를 사용할 수 있음

인터페이스와 다형성

  • 인터페이스를 구현한 클래스로 만든 객체는 해당 인터페이스 타입으로 참조할 수 있음
  • 동적 바인딩 : 런타임 시점에서는 실제 객체의 메서드가 호출

인터페이스의 필요성

인터페이스 특징내용
표준화 처리 가능여러 클래스들이 동일한 인터페이스를 구현하여 일관된 방식으로 동작 처리
개발 기간 단축 가능시스템 구조를 먼저 설계하고, 각 부분을 독립적으로 개발하여 개발 기간 단축
서로 관계가 없는 클래스들 간의 관계 형성관련이 없는 클래스들이 동일한 인터페이스를 구현하여 공통된 동작 공유
간접적인 클래스 사용으로 모듈 교체 용이구체적인 클래스에 의존하지 않고 인터페이스를 통해 클래스 사용, 모듈 교체 용이
독립적 프로그래밍 가능각 클래스가 독립적으로 개발 및 테스트 가능, 코드 재사용성과 유지보수성 향상
다형성 지원같은 인터페이스를 구현하는 객체들을 일관되게 처리하여 코드 유연성과 확장성 증가
설계의 유연성 제공클래스 간의 강한 결합을 피하여 설계의 유연성 증가, 시스템 변경 및 확장 시 영향 최소화

클래스 vs 인터페이스

구분클래스인터페이스
특징class 키워드를 사용하여 정의
필드와 메서드, 생성자로 이루어짐
interface 키워드를 사용하여 정의
static 상수와 추상메서드(메서드 선언부)로 이루어짐
public static final 생략 가능
public abstract 생략 가능
관계인터페이스를 구현함클래스에 의해 구현됨
멤버 변수선언 가능상수만 가능
다중 상속클래스는 하나의 클래스만 상속 가능인터페이스는 여러 개의 인터페이스 상속 가능
(구현부가 없으므로 헷갈리지 않음)
다중 구현클래스는 여러 개의 인터페이스를 다중으로 구현(implements) 가능
인스턴스생성 가능생성 불가
타입타입으로 사용 가능타입으로 사용 가능

추상클래스 vs 인터페이스

구분추상 클래스인터페이스
객체생성불가불가
일반 메소드가능불가
일반 필드가능불가(static 상수만 가능)
메서드abstract를 붙여야만 추상 메서드모든 메서드는 추상 메서드
사용- 추상적인 클래스의 성격을 가질 때(일부 메서드만 미완성 설계도)
- 서로 유사한 클래스 사이에 코드를 공유하고 싶을 때
- 서로 관련 없는 클래스 사이에 공통으로 적용되는 인터페이스를 구현하게 하기 원할 때 (ex) Comparable, Serializable
- 객체(클래스)의 어떤 기능을 구현하고 있다는 “약속”의 성격이 있을 때
공통점- 특정 기능의 구현을 강제하고 싶을 때
- 다형성 가능
- 보다 추상화된 설계도에 의존하는 코드를 작성하고 싶을 때
- 타입으로 사용 가능
- 특정 기능의 구현을 강제하고 싶을 때
- 다형성 가능
- 보다 추상화된 설계도에 의존하는 코드를 작성하고 싶을 때
- 타입으로 사용 가능

슬슬 복잡해지는 Java의 구조
복잡과 익숙해짐의 사이

profile
비전공자의 개발도전기

0개의 댓글