[TIL] 2025-01-06_Java_문법

Yuri·2025년 1월 6일

TIL

목록 보기
22/59
post-thumbnail

✏️ 계산기 과제 Lv3을 구현하기 위해 필요한 자바 문법을 학습 후 정리합니다.

1. 열거형 - Enum

문자열을 사용자에게 입력받는 방식

  • 타입 안정성 부족: 문자열 오타가 발생하기 쉽고, 유효하지 않은 값이 입력될 수 있다.
    👉 잘못된 값을 입력할 수 있고, 컴파일 시 오류 감지 불가
  • 데이터 일관성: 사용자마다 다양한 형식(대·소문자)으로 문자열을 입력할 수 있어 일관성이 떨어진다.

이러한 문제를 해결하기 위한 방안으로 타입 안전 열거형 패턴을 사용할 수 있다.

타입 안전 열거형 패턴 - Type-Safe Enum Pattern

enumenumeration 의 줄임말인데, 번역하면 열거라는 뜻이고, 어떤 항목을 나열하는 것을 뜻한다.

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

자바는 타입 안전 열거형 패턴을 매우 편리하게 사용할 수 있는 열거형(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() 은 직접 오버라이드 할 수 있다.

2. 람다 & 스트림

▶︎ 함수형 프로그래밍

  • 순수 메서드(함수)
    수학의 함수처럼, 특정한 데이터에 의존하지 않고, 관련 없는 데이터를 변경하지도 않으며, 결과값이 오직 입력값에만 영향을 받는 함수를 순수 함수라고 한다.

  • 함수형 프로그래밍의 장점

    • 검증이 쉽다.
    • 성능 최적화가 쉽다.(특정 input에 대한 output이 일정하기 때문에 재사용할 수 있다 - 캐싱)
    • 동시성 문제를 해결하기 쉽다.

람다(lambda) : 익명함수

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);
}

스트림(stream)

자료구조(리스트, 맵, 셋 등)의 흐름을 객체로 제공해주고, 그 흐름동안 사용할 수 있는 메서드들을 api로 제공해주는 것

▶︎ 스트림의 특징

  1. 원본의 데이터를 변경하지 않는다.
    • 자바 컬렉션으로부터 스트림(해당 컬렉션의 흐름)을 받아서 한 번 사용함
  2. 일회용이다.
    • 한 번 사용한 스트림은 어디에도 남지 않는다.

▶︎ 스트림 API

map(), forEach(), filter()

  • map → 모든 요소를 가공해서 반환 : 최종 연산을 수행하여 그 결과값을 사용하는 경우
  • forEach → 단순히 결과가 필요하지 않고 반복적으로 작업만 하려는 경우
  • filter → 조건에 맞는 것만 반환

3. 제네릭

  • 제네릭(Generic) 단어
    제네릭이라는 단어는 일반적인, 범용적인이라는 영어 단어 뜻이다.
    풀어보면 특정 타입에 속한 것이 아니라 일반적으로, 범용적으로 사용할 수 있다는 뜻이다.
  • 제네릭 타입 (Generic Type)
    클래스나 인터페이스를 정의할 때 타입 매개변수를 사용하는 것을 말한다.
    제네릭 클래스, 제네릭 인터페이스를 모두 합쳐서 제네릭 타입이라 한다.
    • 타입은 클래스, 인터페이스, 기본형( int 등)을 모두 합쳐서 부르는 말이다.
package generic.ex1;
public class GenericBox<T> {
 	private T value;
    
 	public void set(T value) {
 		this.value = value;
 	}
    
 	public T get() {
 		return value;
 	}
}
  • 타입 매개변수 (Type Parameter)
    • 제네릭 타입이나 메서드에서 사용되는 변수로, 실제 타입으로 대체된다.
    • 예: GenericBox<T>
    • 여기에서 T 를 타입 매개변수라 한다.
  • 타입 인자 (Type Argument)
    • 제네릭 타입을 사용할 때 제공되는 실제 타입이다.
    • 예: GenericBox<Integer>
    • 여기에서 Integer 를 타입 인자라 한다.

생성 시점에 원하는 타입 지정

제네릭 클래스는 다음과 정의한다. <>(다이아몬드 기호)안에 타입 매개변수를 정의하면 된다.

class GenericBox<T>

원하는 모든 타입 사용 가능

new GenericBox<Double>()
new GenericBox<Boolean>()
new GenericBox<MyClass>()

제네릭의 핵심은 사용할 타입을 미리 결정하지 않는다는 점이다. 클래스 내부에서 사용하는 타입을 클래스를 정의하는 시점에 결정하는 것이 아니라 실제 사용하는 생성 시점에 타입을 결정하는 것이다.


📝 TO-DO

  1. 실습 과제(Lv.3)
  2. 트러블슈팅 및 README 작성
  3. 기술 아카이브 정리

💭 Diary

학습한 내용을 프로그램의 요구사항에 맞춰 응용하는 것이 정말 쉽지 않다. 과제 마감까지 남은 시간동안 최대한 구현해야겠다.😣

profile
안녕하세요 :)

0개의 댓글