💻 KOSA_MSA풀스택/1️⃣ Java

[KOSA_Java] 20250620 - Interface, Anonymous Inner Class & Lambda

koko1177 2025. 6. 20. 08:40
반응형

1️⃣ 추상 클래스 (Abstract Class)

객체를 생성할 수 없는 불완전한 클래스,
상속을 통해서만 접근할 수 있음.
“Is-A” 관계가 유지되는 클래스 간 코드 공유에 적합함.

✅ 특징

  • 추상 메서드를 포함할 수 있음 (abstract 키워드)
  • 비추상 메서드도 포함 가능
  • 필드, 생성자, 접근제한자(public/protected/private) 사용 가능
  • extends 키워드를 통해 상속
  • 상속은 단일 상속만 가능

✅ 사용 목적

  • 밀접하게 관련된 클래스들 간의 코드 공유
  • 기본 동작을 정의하고, 자식 클래스에서 세부 구현을 위임할 때

🧱 예제

abstract class Shape {
    String color;

    abstract double area();

    void showColor() {
        System.out.println("Color: " + color);
    }
}

class Circle extends Shape {
    double radius;

    Circle(String color, double radius) {
        this.color = color;
        this.radius = radius;
    }

    @Override
    double area() {
        return Math.PI * radius * radius;
    }
}

2️⃣ 인터페이스 (Interface)

서로 관련 없는 클래스들 간의 공통된 동작(계약) 을 정의.
“~할 수 있다(Can-Do)” 관계를 표현.

✅ 특징

  • 모든 메서드는 기본적으로 public abstract
  • 모든 필드는 public static final (상수)
    → 생략 가능하지만 명시적으로 쓰는 게 가독성 좋음
  • implements 키워드로 구현
  • 다중 상속 가능
  • Java 8 이상: default / static 메서드 사용 가능

✅ 사용 목적

  • 서로 다른 클래스 간의 공통 동작 정의
  • 추상 클래스보다 느슨한 결합 구조 제공
  • 디자인 패턴(Strategy, Observer 등) 의 핵심 구성 요소

🧱 예제

interface Printable {
    void print();
}

class Report implements Printable {
    @Override
    public void print() {
        System.out.println("Printing Report...");
    }
}

3️⃣ 추상 클래스 vs 인터페이스 비교표

구분 추상 클래스 (Abstract Class) 인터페이스 (Interface)
관계 Is-A (상속 관계) Can-Do (행동 계약 관계)
키워드 extends implements
상속 개수 단일 상속 다중 상속 가능
접근제한자 public, protected, private 가능 public만 가능
필드 가질 수 있음 public static final 상수만
메서드 abstract / 일반 메서드 둘 다 가능 abstract / default / static
생성자 가질 수 있음 없음
용도 코드 공유, 기본 동작 정의 공통 기능 강제, 다형성 중심

4️⃣ 왜 인터페이스를 사용하나?

필드가 아닌 공통된 행동(메서드) 만을 정의하고 싶을 때

예를 들어, 자갈, 페인트, 위젯은 서로 공통된 필드가 없음.
하지만 판매가격(), 원가(), 무게() 같은 공통 메서드는 존재.
→ 따라서 인터페이스가 적합.


5️⃣ 인터페이스 문법 규칙

  • 접근 제한자 → public만 사용 가능
  • 추상화 한정자(abstract) 자동 적용
  • 여러 인터페이스 동시 구현 가능
  • 별도 파일에서 구현해야 함

6️⃣ Interface의 확장 기능 (Java 8 이상)

✅ default 메서드

  • 기본 구현을 제공 → 하위 클래스에서 재정의 가능
interface Printer {
    default void start() {
        System.out.println("Printer Starting...");
    }
}

✅ static 메서드

  • 인터페이스 자체에서 호출 가능 (Printer.utilMethod() 형태)
interface Printer {
    static void info() {
        System.out.println("This is a printer interface");
    }
}

7️⃣ 인터페이스 상속 (Extending Interface)

인터페이스는 다른 인터페이스를 extends 로 다중 상속 가능

interface A {
    void methodA();
}

interface B extends A {
    void methodB();
}

class C implements B {
    public void methodA() {}
    public void methodB() {}
}

8️⃣ 람다식 (Lambda Expression)

익명 내부 클래스(Anonymous Inner Class) 를 단순화한 표현식
Java 8 이상에서 사용 가능
함수형 인터페이스(메서드 1개만 가진 인터페이스)에서 주로 사용됨

✅ 기본 형식

(매개변수) -> { 실행문; }

✅ 예제

// 기존 익명 클래스 방식
Runnable r1 = new Runnable() {
    public void run() {
        System.out.println("Hello");
    }
};

// 람다식
Runnable r2 = () -> System.out.println("Hello");

✅ 매개변수가 하나일 경우

x -> x * x

✅ 여러 문장이면 블록 사용

(x, y) -> {
    int sum = x + y;
    return sum;
}

9️⃣ 람다와 익명 내부 클래스 차이

구분 익명 내부 클래스 람다식
문법 복잡 간결
버전 Java 7 이하 Java 8 이상
목적 일회성 클래스 생성 함수형 표현
this 참조 내부 클래스 자신 외부 객체 참조

🔟 정리 키워드

  • Java Interface
  • default Method
  • static Method
  • Extending Interface
  • Anonymous Inner Class
  • Lambda Expression
  • Lambda Expression Shorthand
  • Lambda Expression as Variable
반응형