주의

  • 본 게시글은 Claude로 작성되었습니다. 잘못된 정보가 있을 수 있습니다.

개요

Java 8 이상 버전에서 도입된 객체 지향 프로그래밍(OOP) 관련 새로운 기능들에 대해 알아봅니다. 특히 인터페이스의 default 메서드, static 메서드와 같은 기능들이 어떻게 OOP 패러다임을 확장하는지 살펴봅니다.

상세

1. 인터페이스의 default 메서드

Java 8부터 인터페이스에 default 메서드를 정의할 수 있게 되었습니다. 이를 통해 인터페이스의 기존 구현을 변경하지 않고도 새로운 기능을 추가할 수 있게 되었습니다.

public interface Vehicle {
    default void start() {
        System.out.println("차량이 출발합니다.");
    }
}
 
public class Car implements Vehicle {
    // start() 메서드를 구현하지 않아도 됩니다.
}
 
Car car = new Car();
car.start(); // 출력: 차량이 출발합니다.

2. 인터페이스의 static 메서드

인터페이스에 static 메서드를 정의할 수 있게 되어, 유틸리티 메서드를 인터페이스 내에서 직접 제공할 수 있게 되었습니다.

public interface MathOperations {
    static int add(int a, int b) {
        return a + b;
    }
}
 
int result = MathOperations.add(5, 3); // result = 8

3. 함수형 인터페이스

Java 8에서는 함수형 프로그래밍을 지원하기 위해 함수형 인터페이스 개념이 도입되었습니다. 이는 단 하나의 추상 메서드만을 가진 인터페이스를 말합니다.

@FunctionalInterface
public interface Greeting {
    void greet(String name);
}
 
Greeting koreanGreeting = name -> System.out.println("안녕하세요, " + name + "님!");
koreanGreeting.greet("홍길동"); // 출력: 안녕하세요, 홍길동님!

4. 다이아몬드 문제 해결

default 메서드로 인해 발생할 수 있는 다중 상속의 모호성(다이아몬드 문제)을 해결하기 위해, Java 8은 명시적인 오버라이딩 규칙을 도입했습니다.

public interface A {
    default void hello() {
        System.out.println("Hello from A");
    }
}
 
public interface B {
    default void hello() {
        System.out.println("Hello from B");
    }
}
 
public class C implements A, B {
    @Override
    public void hello() {
        A.super.hello(); // A의 hello 메서드 호출
    }
}

예상 면접 질문/답변

Java 8에서 인터페이스에 추가된 새로운 기능은 무엇인가요?

Java 8에서는 인터페이스에 default 메서드와 static 메서드를 추가할 수 있게 되었습니다. 이를 통해 인터페이스의 기능을 확장하고 유틸리티 메서드를 제공할 수 있게 되었습니다.

default 메서드의 주요 장점은 무엇인가요?

default 메서드의 주요 장점은 기존 인터페이스에 새로운 메서드를 추가할 때 해당 인터페이스를 구현한 모든 클래스를 수정하지 않아도 된다는 것입니다. 이는 하위 호환성을 유지하면서 API를 확장할 수 있게 해줍니다.

함수형 인터페이스란 무엇이며, 어떻게 사용되나요?

함수형 인터페이스는 단 하나의 추상 메서드만을 가진 인터페이스입니다. 주로 람다 표현식과 함께 사용되며, @FunctionalInterface 어노테이션으로 표시됩니다. 이를 통해 더 간결하고 표현력 있는 코드를 작성할 수 있습니다.

다이아몬드 문제란 무엇이며, Java 8에서는 어떻게 해결하나요?

다이아몬드 문제는 다중 상속 시 발생할 수 있는 모호성 문제입니다. Java 8에서는 default 메서드로 인해 이 문제가 발생할 수 있지만, 명시적인 오버라이딩 규칙을 통해 해결합니다. 구현 클래스에서 어떤 인터페이스의 메서드를 사용할지 명확히 지정해야 합니다.

Java 8의 OOP 관련 새 기능들이 코드 설계에 어떤 영향을 미치나요?

이러한 기능들은 더 유연하고 확장 가능한 설계를 가능하게 합니다. 인터페이스를 통한 기본 구현 제공, 유틸리티 메서드의 중앙화, 함수형 프로그래밍 스타일의 도입 등을 통해 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.

스스로 찾아보면 좋은 연관 주제

  1. Java 8 람다 표현식과 스트림 API
  2. 옵셔널(Optional) 클래스와 null 처리
  3. Java 9 이후의 인터페이스 private 메서드
  4. 함수형 프로그래밍과 OOP의 결합
  5. Java의 다중 상속 제한과 인터페이스를 통한 해결 방안