IT/JAVA

[JAVA] 자바 기초 복습 (Chapter.13)

j8970 2025. 3. 5. 09:44

📅 학습 기간: 2월 3주차
🎯 학습 내용: 제네릭 / 싱글톤 / 빌더 / 롬복


📌 1. 제네릭 (Generics)

💡 데이터 타입을 일반화하여 다양한 타입을 지원하는 기능
타입 안정성, 코드 재사용성, 가독성을 향상


🔹 1.1 제네릭 클래스

// 제네릭 클래스 정의
class Pair<K, V> {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }
}

// 제네릭 클래스 사용
Pair<Integer, String> pair = new Pair<>(123, "안녕하세요");
System.out.println(pair.getKey());   // 123
System.out.println(pair.getValue()); // 안녕하세요

제네릭 타입을 사용하여 다양한 데이터 타입을 처리 가능


🔹 1.2 제네릭 메서드

class Utils {
    public static <T> void print(T value) {
        System.out.println(value);
    }
}

// 제네릭 메서드 사용
Utils.<String>print("안녕"); // 안녕
Utils.print(123); // 123 (타입 추론 가능)

제네릭 메서드는 호출 시 전달된 타입에 따라 유연하게 동작 가능


🔹 1.3 제네릭 와일드 카드

class Message<T> {
    private T message;

    public Message(T message) {
        this.message = message;
    }

    public T getMessage() {
        return message;
    }
}

// 와일드카드 사용 예제
static void printMessage(Message<?> msg) {
    System.out.println(msg.getMessage());
}

Message<String> msg1 = new Message<>("Hello");
printMessage(msg1);

와일드카드(?)를 사용하면 불특정 타입을 허용 가능


📌 2. 싱글톤 (Singleton)

💡 클래스의 인스턴스를 단 하나만 생성하여 공유하는 패턴
자원의 중복 생성을 방지하고 메모리 사용 최적화


🔹 2.1 싱글톤 패턴 구현

class Singleton {
    private static Singleton instance;

    // private 생성자 - 외부에서 직접 객체 생성 불가
    private Singleton() {}

    // 싱글톤 객체 반환 메서드
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

getInstance() 메서드를 통해 유일한 객체를 제공


📌 3. 빌더 패턴 (Builder Pattern)

💡 객체를 단계적으로 생성할 수 있도록 하는 패턴
생성자가 많아지는 경우 유용하며, 가독성과 유지보수성을 향상


🔹 3.1 빌더 패턴 구현

class GameCharacter {
    private final String name;
    private final String sort;
    private final String skill;
    private final String item;

    public static class Builder {
        private final String name;
        private final String sort;
        private String skill = "Basic Attack";
        private String item = "None";

        public Builder(String name, String sort) {
            this.name = name;
            this.sort = sort;
        }

        public Builder skill(String skill) {
            this.skill = skill;
            return this;
        }

        public Builder item(String item) {
            this.item = item;
            return this;
        }

        public GameCharacter build() {
            return new GameCharacter(this);
        }
    }

    private GameCharacter(Builder builder) {
        this.name = builder.name;
        this.sort = builder.sort;
        this.skill = builder.skill;
        this.item = builder.item;
    }
}

// 빌더 패턴 사용
GameCharacter character = new GameCharacter.Builder("뽀로로", "펭귄")
        .skill("크롱 놀리기")
        .item("안경")
        .build();

필수 필드는 생성자에서, 선택 필드는 메서드를 통해 설정 가능


📌 4. 롬복 (Lombok)

💡 자바 코드에서 반복되는 보일러플레이트 코드를 줄여주는 라이브러리
어노테이션을 사용하여 코드의 간결성을 증가


🔹 4.1 롬복 주요 어노테이션

어노테이션 설명
@Getter / @Setter 필드에 대한 getter/setter 자동 생성
@ToString 객체를 문자열로 변환하는 toString() 자동 생성
@NoArgsConstructor 기본 생성자 자동 생성
@AllArgsConstructor 모든 필드를 포함한 생성자 자동 생성
@Builder 빌더 패턴을 자동으로 구현

🔹 4.2 롬복 예제

import lombok.*;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
class Person {
    private String name;
    private int age;
}

// 객체 생성 및 사용
Person person = Person.builder()
        .name("홍길동")
        .age(25)
        .build();

System.out.println(person); // Person(name=홍길동, age=25)

@Builder 어노테이션을 사용하면 빌더 패턴을 간단하게 구현 가능


🎯 소감

📌 생각해야하는 패턴들이 꽤나 많았던 파트 같아요!
📌 이번 파트에는 꽤 중요한 내용들이 많았기때문에 더 자주 포스팅을 참고할 것 같아요!

 

🚀 마무리
이번 학습을 통해 제네릭, 싱글톤, 빌더, 롬복의 개념을 확실히 정리할 수 있었다! 🎯