[cs] Java - 인터페이스와 추상 클래스

네민·2025년 1월 8일
0

우당탕탕 cs 공부

목록 보기
6/14

인터페이스

구조의 틀을 잡아주는 느낌, 클래스가 반드시 해당 메서드를 구현하도록 강제하는 기능

다형성코드 일관성 확보

  • interface 키워드 사용

구성요소

  1. 변수: public static final
  • 무조건 상수로 선언되기 때문에 초기화가 필수
  • 변수는 무조건 public static final 형태이기 때문에, 생략해도 자동으로 적용
  1. 메서드: public abstract
  • 추상 메서드는 메서드의 선언부만 존재하고, 구현은 클래스에서 담당
  • 생략해도 자동으로 적용

java 8 이후 변경점

java 8부터 default 메서드와 static 메서드가 추가됨

default 메서드

메서드의 기본 구현을 제공하기 위해 도입

  • 구현 클래스에서 오버라이딩 가능
  • 두 개 이상의 인터페이스가 동일한 default 메서드를 상속받는 경우, 구현 클래스가 반드시 해당 메서드를 오버라이딩하여 충돌 해결해야함

이걸 만든 이유는 java8부터 람다, stream이 생겼는데, List와 같은 컬렉션에서 사용하려고 하니까 하위 클래스들의 메서드도 다 수정해야 하는게 불편했음 → 그래서 default 메서드로 만들고 수정 안해도 되고 해도 되게 만들었음 ⇒ 근데 이로 인해 추상클래스와 모호하게 되긴 함

즉, 기존 코드와의 호환성 유지를 위해 도입했다는 것!

static 메서드

다른 일반적인 static 메서드와 같은 의미를 가짐

  • 구현 클래스에서 오버라이딩 불가능
  • 공통 기능을 제공하기 위해 사용
  • 인터페이스명으로 호출해야함

java 9 이후 변경점

java 9부터 private 메서드와 private static 메서드가 추가됨

private 메서드

  • default 메서드에서 코드 중복을 줄이기 위해 공통 로직을 분리한 것임
  • 인터페이스 외부에서 호출할 수 없음 → default 메서드 내부에서 호출 가능

private static 메서드

static, default 메서드 둘다 호출 가능

근데 default 메서드에서 호출할 때는 static 메서드에서 호출하는 방식이랑 같다고 함


추상 클래스

공통적으로 사용하는 기능을 제공 (일반 메서드), 일부 메서드는 반드시 자식 클래스에서 구현하도록 강제하는 클래스 (추상 메서드)

  • abstract 키워드 사용
  • 인터페이스와 달리 필드를 가질 수 있음 → private, protected 등의 접근 제어자 사용 가능
  • 객체를 직접 생성할 수 없고, 반드시 상속받아 사용함 → 설계적으로 미완성된 부분을 포함하기 때문에 객체를 직접 생성하는 것이 불가능
  • 생성자 가질 수 있음

왜 클래스는 단일 상속만 가능한데, 인터페이스는 2개 이상 구현이 가능할까요?

클래스는 메서드가 구현돼 있기 때문에, 여러 클래스를 상속받으면, 같은 이름의 메서드가 서로 다르게 구현돼 있을 경우가 있다. 이럴 경우 어떤 메서드를 호출해야 할지 모호해지는 다이아몬드 상속 문제가 발생할 수 있기 때문에 단일 상속만 가능함. 하지만 java 8 이후부터 인터페이스도 메서드에 구현 기능을 사용할 수 있어 이 문제가 발생할 수 있게 됐음. 이 문제는 반드시 오버라이딩 하는 걸로 문제를 해결함.


전체적인 비교


참고자료

인터페이스(Interface) 문법 & 활용 - 완벽 가이드

profile
기록하자

0개의 댓글