← Back to list

인터페이스

1. 추상 메소드

The Possessor's View · 2024-03-27 01:29 · 0 claps · 5.9 min read
#추상메소드 #추상클래스 #인터페이스 #디폴트메소드
Open on Medium ↗

인터페이스

1. 추상 메소드

  • 메소드 정의에 abstract 키워드를 사용
  • 몸체의 구현이 없이 형식만 존재하는 메소드

반환형, 메소드 이름과 인자에 관한 선언만 존재

자식 클래스에 상속될 때, 몸체의 구현이 필요함

상반된 의미의 final과 함께 사용할 수 없음

추상 메소드는 추상 클래스 또는 인터페이스에서 선언되어야 한다.

abstract class Shape {
  // 모양이 정해지지 않아 면적을 계산할 수 없음
  abstract public double getArea();
}

2. 추상 클래스

  • 클래스 정의에 abstract 키워드를 사용

추상 메소드를 포함할 수 있음

물론 데이터 필드일반 메소드를 포함할 수 있음

객체 생성을 할 수 없음(구체적이지 못한 불완전한 클래스라는 의미)

/* 오류의 예(Shape이 추상클래스라 가정) */
Shape s = new Shape("red"); // 컴파일 오류

3. 추상 클래스의 사용

  • 의미적으로 유사자식 클래스를 묶고자 할 때 사용

공통으로 사용할 데이터 필드와 메소드추상 클래스에서 정의

  • 추상 클래스는 불완전한 클래스

기능적으로 구현하기 어려운 메소드가 존재 (ex: Shape -> Triagle, Rectangle, Circle)

  • 추상 클래스는 자식 클래스로 상속되어 사용

자식 클래스에서 추상 메소드를 구현해야 함

그러면 자식 클래스는 객체 생성이 가능

자식 클래스가 추상 메소드를 구현하지 않으면 계속하여 자식 클래스도 추상 클래스이어야 함

  • 추상 클래스는 일반 클래스인터페이스의 중간적 성격을 가진다.

4. 인터페이스

  • 100% 추상적 클래스

인터페이스의 모든 메소드가 추상 메소드(public abstract)

  • 몸체 없이, 구현되어야 할 메소드의 형식만 정의해 둠

단, default 인스턴스 메소드static 메소드몸체를 구현

모든 메소드의 기본 접근 제어자는 public

데이터 필드클래스 상수만 가능(public static final)

  • 참조형이며 직접적 객체 생성은 불가
  • 인터페이스의 이름은 보통 형용사다. (Runnable, Serializable, Comparable)

5. 인터페이스의 정의

  • 문법은 클래스 정의와 유사
  • 정의할 때 키워드 class 대신에 interface를 사용

abstract는 생략하는 것이 일반적임

  • 메소드의 접근 제어자는 기본적으로(생략하더라도) public abstract

몸체가 없으며, 반환형, 이름, 매개변수 목록만 표시

  • default 인스턴스 메소드static 메소드도 가능

이 경우 몸체를 구현해야 함

기본적으로 생략하더라도 접근 제어자는 public 이다.

  • 데이터 필드는 항상(생략 가능) public static final

클래스 상수만 가능함

6. 인터페이스의 사용

  • 추상 클래스와 마찬가지로 자식 클래스에 상속(구현)되어 사용
  • 의미적으로는 관련이 없으나 기능적으로 유사한 클래스들을 묶을 때 인터페이스를 사용할 수 있음

ex) 대소 비교가 가능한 클래스(사각형, 사람..)

  • 인터페이스를 상속받아 자식 인터페이스를 정의할 수 있음

인터페이스의 상속 또는 확장

interface Comparable<T> {
  // 다른 객체와 크기를 비교하는 메서드
  boolean isLargerThan(T o);
}

class Box implements Comparable<Box> {
  private int length, width, height;

  public boolean isLargerThan(Box otherBox) {
    ...
  }
}

7. 인터페이스의 상속

  • 자식 인터페이스가 부모 인터페이스를 상속받는 경우

기존 인터페이스를 상속받아 새로운 인터페이스를 정의할 때, 키워드 extends를 사용

interface 자식인터페이스 extends 부모인터페이스 { ... }
  • 여러 부모 인터페이스를 상속받는 다중 상속도 가능
// 부모 인터페이스
interface SuperInterface {
  public void func1();
  public void func2();
}

// 자식 인터페이스 
interface SubInterface extends SuperInterface {
  public void func3();
}

8. 인터페이스의 구현

  • 자식 클래스가 부모 인터페이스를 상속받는(구현하는) 경우

자식은 부모가 나열한 기능(추상 메소드)을 구현해야 함

구현을 통해 클래스를 정의할 때 implements를 사용

class 자식클래스 extends 부모클래스 implements 부모인터페이스1, 부모인터페이스2 {...}
interface Movable {
  void add(double dx, double dy);
  void sub(double dx, double dy);
}

interface Scalable {
  void mul(double s);
  void div(double s);
}

class Point implements Movable, Scalable {
  ...
}
interface Figure {
  double getArea();
}

class Triangle implements Figure {
  private double height, width;

  public Triangle(double h, double w) {
    height = h;
    width = w;
  }

  // 구현
  public double getArea() {
    return height * width * 0.5;
  }
}

public class Main {
  public static void main(String args[]) {
    Triangle t = new Triangle(3.0, 4.0);
    System.out.println(t.getArea());
  }
}

9. 디폴트 메소드

  • 인터페이스에서 선언하는 메소드기본 구현(몸체)을 넣을 수 있음

자식 클래스에서 상속받을 때, 디폴트 메소드를 그대로 사용할 수 있음

메소드 선언시 default를 사용하고 몸체를 구현해 줌

  • 인터페이스에 새 메소드를 추가할 때, 기존 코드(클래스 정의)의 수정을 피하기 위함

단순히 추상 메소드가 추가된다면, 이전 인터페이스를 구현한 클래스를 수정해야 함

interface DoIt {
  void doSomething();
  int doSomethingElse(String s);

  // 아래를 새로 추가한다면?
  default boolean didItWork(int i, String s) {
    ...
  }
}

10. 추상 클래스, 인터페이스, 클래스의 형변환

  • 인터페이스와 클래스는 모두 사용자 정의형
  • extends와 implements에 따라 상위/하위 자료형 관계가 설정됨
  • 상위 유형의 변수하위 객체의 참조값을 가질 수 있음
  • 상위 유형의 변수가 가리키는 객체의 실제 유형에 따라 수행되는 메소드가 결정됨(동적 바인딩)

실행 중 메소드 호출 시, 변수의 선언 유형으로 정하지 않음

SuperClass sup = new SubClass(); // 자동 형변환
sup.method(); // method()를 SubClass에서 찾음

컴파일 할 때는 method()sup의 선언 유형에 정의되어 있는지 확인


메타데이터
post_id
3b0380d802bf
slug
인터페이스-3b0380d802bf
url
https://medium.com/@possessor_view/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-3b0380d802bf
canonical_url
https://medium.com/@possessor_view/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-3b0380d802bf
author_url
https://medium.com/@possessor_view
status
ok
fetched_at
2026-08-11 05:35:58