✏️ 계산기 과제 Lv3을 구현하기 위해 필요한 자바 문법을 학습 후 정리합니다.
문자열을 사용자에게 입력받는 방식
이러한 문제를 해결하기 위한 방안으로 타입 안전 열거형 패턴을 사용할 수 있다.
enum 은 enumeration 의 줄임말인데, 번역하면 열거라는 뜻이고, 어떤 항목을 나열하는 것을 뜻한다.
package enumeration.ex2;
public class ClassGrade {
public static final ClassGrade BASIC = new ClassGrade();
public static final ClassGrade GOLD = new ClassGrade();
public static final ClassGrade DIAMOND = new ClassGrade();
// private 생성자 추가 : 인스턴스 생성을 막음 -> 컴파일 오류
private ClassGrade() {}
}
package enumeration.ex2;
public class ClassGradeEx2_1 {
public static void main(String[] args) {
int price = 10000;
DiscountService discountService = new DiscountService();
int basic = discountService.discount(ClassGrade.BASIC, price);
int gold = discountService.discount(ClassGrade.GOLD, price);
int diamond = discountService.discount(ClassGrade.DIAMOND, price);
System.out.println("BASIC 등급의 할인 금액: " + basic);
System.out.println("GOLD 등급의 할인 금액: " + gold);
System.out.println("DIAMOND 등급의 할인 금액: " + diamond);
}
}
private 생성자를 사용해서 외부에서 ClassGrade 를 임의로 생성하지 못하게 막았다.ClassGrade 인스턴스를 사용할 때는 ClassGrade 내부에 정의한 상수를 사용해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.이렇게 private 생성자까지 사용하면 타입 안전 열거형 패턴을 완성할 수 있다.
자바는 타입 안전 열거형 패턴을 매우 편리하게 사용할 수 있는 열거형(Enum Type)을 제공한다.
package enumeration.ref2;
public enum Grade {
BASIC(10), GOLD(20), DIAMOND(30); // 다른 로직이 추가되면 ;으로 구분 필요
private final int discountPercent;
// private는 생략
Grade(int discountPercent) {
this.discountPercent = discountPercent;
}
public int getDiscountPercent() {
return discountPercent;
}
}
ENUM - 주요 메서드
values(): 모든 ENUM 상수를 포함하는 배열을 반환한다.valueOf(String name): 주어진 이름과 일치하는 ENUM 상수를 반환한다.name(): ENUM 상수의 이름을 문자열로 반환한다.ordinal(): ENUM 상수의 선언 순서(0부터 시작)를 반환한다.toString(): ENUM 상수의 이름을 문자열로 반환한다. name() 메서드와 유사하지만, toString() 은 직접 오버라이드 할 수 있다.순수 메서드(함수)
수학의 함수처럼, 특정한 데이터에 의존하지 않고, 관련 없는 데이터를 변경하지도 않으며, 결과값이 오직 입력값에만 영향을 받는 함수를 순수 함수라고 한다.
함수형 프로그래밍의 장점
public static List<Car> parkCars(List<Car> carsWantToPark, Predicate<Car> function) {
List<Car> cars = new ArrayList<>();
for (Car car : carsWantToPark) {
// 전달될 함수를 사용하여 구현
if (function.test(car)) {
cars.add(car);
}
}
return cars;
}
interface Predicate<T> {
boolean test(T t);
}
자료구조(리스트, 맵, 셋 등)의 흐름을 객체로 제공해주고, 그 흐름동안 사용할 수 있는 메서드들을 api로 제공해주는 것
map(), forEach(), filter()
package generic.ex1;
public class GenericBox<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
GenericBox<T>GenericBox<Integer>Integer 를 타입 인자라 한다.제네릭 클래스는 다음과 정의한다. <>(다이아몬드 기호)안에 타입 매개변수를 정의하면 된다.
class GenericBox<T>
new GenericBox<Double>()
new GenericBox<Boolean>()
new GenericBox<MyClass>()
제네릭의 핵심은 사용할 타입을 미리 결정하지 않는다는 점이다. 클래스 내부에서 사용하는 타입을 클래스를 정의하는 시점에 결정하는 것이 아니라 실제 사용하는 생성 시점에 타입을 결정하는 것이다.
학습한 내용을 프로그램의 요구사항에 맞춰 응용하는 것이 정말 쉽지 않다. 과제 마감까지 남은 시간동안 최대한 구현해야겠다.😣