공공부하자개발 · 영어 학습 노트
자바
중급객체지향과 코어 라이브러리0/9 완료
  • 01상속, 다형성, 오버라이딩
  • 02추상 클래스 vs 인터페이스
  • 03예외 처리
  • 04java.lang 심화
  • 05컬렉션 프레임워크 딥다이브
  • 06메서드 활용 패턴 (중급)
  • 07Object 메서드와 비교
  • 08java.time 실무 날짜 계산
  • 09HTTP 와 JSON 기초
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 중급 › 02 / 9

추상 클래스 vs 인터페이스

섹션 7진행 0 / 9
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

6. 연습 문제

문제 1: 배송 정책 전략

ShippingPolicy 인터페이스(long fee(long orderAmount))를 정의하고, (1) 항상 3,000원, (2) 5만원 이상 무료 아니면 3,000원, (3) 무조건 무료 세 가지를 만들어라. 두 개는 클래스로, 하나는 람다로 구현하고 주문금액 30,000원과 70,000원에 대한 배송비를 출력하라.

정답 보기
java
import java.util.List;

interface ShippingPolicy {
    long fee(long orderAmount);
}

class FlatShipping implements ShippingPolicy {
    @Override public long fee(long orderAmount) { return 3_000; }
}

class ThresholdShipping implements ShippingPolicy {
    @Override public long fee(long orderAmount) { return orderAmount >= 50_000 ? 0 : 3_000; }
}

public class Main {
    public static void main(String[] args) {
        List<ShippingPolicy> policies = List.of(new FlatShipping(), new ThresholdShipping(), amount -> 0);
        for (ShippingPolicy p : policies) {
            System.out.println(p.fee(30_000) + " / " + p.fee(70_000));
        }
        // 출력:
        // 3000 / 3000
        // 3000 / 0
        // 0 / 0
    }
}

문제 2: 템플릿 메서드로 파일 처리기

FileProcessor 추상 클래스에 final process(List<String> lines)를 두고, 흐름은 (1) filter(line)이 true인 줄만 남기고 (2) 각 줄을 transform(line)한 뒤 (3) 결과 개수를 출력한다. filter의 기본 구현은 빈 줄 제거이고 transform은 추상이다. 대문자로 바꾸는 UpperProcessor를 만들어 ["a", "", "b"]를 처리하라.

정답 보기
java
import java.util.ArrayList;
import java.util.List;

abstract class FileProcessor {
    public final List<String> process(List<String> lines) {
        List<String> out = new ArrayList<>();
        for (String line : lines) {
            if (filter(line)) out.add(transform(line));
        }
        System.out.println("처리된 줄 수: " + out.size());
        return out;
    }
    protected boolean filter(String line) { return !line.isBlank(); }   // 훅
    protected abstract String transform(String line);
}

class UpperProcessor extends FileProcessor {
    @Override protected String transform(String line) { return line.toUpperCase(); }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(new UpperProcessor().process(List.of("a", "", "b")));
        // 출력:
        // 처리된 줄 수: 2
        // [A, B]
    }
}

문제 3: 추상 클래스와 인터페이스 조합 설계

Shape 인터페이스(double area(), default String describe()는 "넓이=" + area() 반환)와, 이름을 상태로 갖는 추상 클래스 NamedShape implements Shape(생성자로 이름을 받고 describe()를 이름: 넓이=...로 오버라이딩)를 만든 뒤, Square extends NamedShape를 구현하라.

Square("정사각형", 3)의 describe()를 출력하라.

정답 보기
java
interface Shape {
    double area();
    default String describe() { return "넓이=" + area(); }
}

abstract class NamedShape implements Shape {
    protected final String name;
    protected NamedShape(String name) { this.name = name; }

    @Override
    public String describe() { return name + ": " + Shape.super.describe(); }
}

class Square extends NamedShape {
    private final double side;
    Square(String name, double side) { super(name); this.side = side; }

    @Override public double area() { return side * side; }
}

public class Main {
    public static void main(String[] args) {
        Shape s = new Square("정사각형", 3);
        System.out.println(s.describe());
        // 출력: 정사각형: 넓이=9.0
    }
}
연습 문제
  • 문제 1: 배송 정책 전략
  • 문제 2: 템플릿 메서드로 파일 처리기
  • 문제 3: 추상 클래스와 인터페이스 조합 설계
이전 섹션5 자주 하는 실수 (Tip)6 / 7다음 섹션7 정리