ShippingPolicy 인터페이스(long fee(long orderAmount))를 정의하고, (1) 항상 3,000원, (2) 5만원 이상 무료 아니면 3,000원, (3) 무조건 무료 세 가지를 만들어라. 두 개는 클래스로, 하나는 람다로 구현하고 주문금액 30,000원과 70,000원에 대한 배송비를 출력하라.
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
}
}FileProcessor 추상 클래스에 final process(List<String> lines)를 두고, 흐름은 (1) filter(line)이 true인 줄만 남기고 (2) 각 줄을 transform(line)한 뒤 (3) 결과 개수를 출력한다. filter의 기본 구현은 빈 줄 제거이고 transform은 추상이다. 대문자로 바꾸는 UpperProcessor를 만들어 ["a", "", "b"]를 처리하라.
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]
}
}Shape 인터페이스(double area(), default String describe()는 "넓이=" + area() 반환)와, 이름을 상태로 갖는 추상 클래스 NamedShape implements Shape(생성자로 이름을 받고 describe()를 이름: 넓이=...로 오버라이딩)를 만든 뒤, Square extends NamedShape를 구현하라.
Square("정사각형", 3)의 describe()를 출력하라.
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
}
}