자료형

1-0. 기본 골격 (공통 유틸 클래스)

import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Pattern;

public final class CoreTypesAndCollections {

    private CoreTypesAndCollections() { }

1-A. String 템플릿 (파싱 · 검증 · 포맷팅)

1️⃣ split + trim 파싱 (가장 많이 씀)

public static List<String> splitByComma(String input) {
    validateNotBlank(input, "입력은 비어 있을 수 없습니다.");

    String[] parts = input.split(",");
    List<String> result = new ArrayList<>();

    for (String p : parts) {
        String token = p.trim();
        validateNotBlank(token, "빈 값이 포함될 수 없습니다.");
        result.add(token);
    }
    return result;
}

사용 예

// "a, b, c" → ["a", "b", "c"]
List<String> tokens = splitByComma(input);

2️⃣ String 기본 API 체크리스트

public static void stringBasicsDemo(String s) {
    validateNotNull(s, "문자열 null 불가");

    String trimmed = s.trim();
    int length = trimmed.length();

    char first = trimmed.charAt(0);
    String sub = trimmed.substring(0, 2);

    boolean has = trimmed.contains("abc");
    boolean starts = trimmed.startsWith("[");
    String replaced = trimmed.replace(" ", "");

    // 정규식 치환
    String onlyDigits = trimmed.replaceAll("\\D", "");
}

3️⃣ replace vs replaceAll

public static String normalizeSpaces(String s) {
    validateNotNull(s, "문자열 null 불가");
    return s.trim().replaceAll("\\s+", " ");
}

4️⃣ join (컬렉션 → 문자열)

public static String joinWithComma(List<String> items) {
    return String.join(",", items);
}

5️⃣ 출력 메시지 포맷

public static String formatScore(String name, int score) {
    return String.format("이름=%s, 점수=%d", name, score);
}

6️⃣ 문자열 검증 템플릿 (프리코스 필수)

public static void validateNotNull(Object obj, String message) {
    if (obj == null) {
        throw new IllegalArgumentException(message);
    }
}

public static void validateNotBlank(String s, String message) {
    if (s == null || s.trim().isEmpty()) {
        throw new IllegalArgumentException(message);
    }
}

7️⃣ 정수 문자열 검증

private static final Pattern NUMERIC_PATTERN =
        Pattern.compile("^-?\\d+$");

public static void validateIntegerString(String s, String message) {
    validateNotBlank(s, message);
    if (!NUMERIC_PATTERN.matcher(s.trim()).matches()) {
        throw new IllegalArgumentException(message);
    }
}

1-B. 기본형 · 래퍼 · 숫자 템플릿

1️⃣ 파싱

public static int parseIntStrict(String s) {
    validateIntegerString(s, "정수가 아닙니다.");
    return Integer.parseInt(s.trim());
}

public static long parseLongStrict(String s) {
    validateIntegerString(s, "정수가 아닙니다.");
    return Long.parseLong(s.trim());
}

2️⃣ 문자열 변환

String.valueOf(10);

3️⃣ Math 유틸

public static int clamp(int value, int min, int max) {
    return Math.max(min, Math.min(max, value));
}

public static int absDiff(int a, int b) {
    return Math.abs(a - b);
}

4️⃣ BigDecimal (돈 / 정확한 소수)

public static BigDecimal addMoney(String a, String b) {
    BigDecimal x = new BigDecimal(a.trim());
    BigDecimal y = new BigDecimal(b.trim());
    return x.add(y);
}

1-C. 컬렉션 템플릿


1️⃣ List / ArrayList

List<String> list = new ArrayList<>();
list.add("A");
list.contains("A");
list.remove("A");
list.get(0);
list.size();

2️⃣ Set / HashSet (중복 제거)

Set<Integer> set = new HashSet<>();
set.add(1);
set.contains(1);
set.remove(1);

3️⃣ Map / HashMap

Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.get("apple");
map.containsKey("apple");

for (Map.Entry<String, Integer> e : map.entrySet()) {
    e.getKey();
    e.getValue();
}

4️⃣ LinkedHashMap (입력 순서 유지)

Map<String, Integer> ordered = new LinkedHashMap<>();

5️⃣ EnumMap (enum 키 전용)

enum Grade { BRONZE, SILVER, GOLD }

EnumMap<Grade, Integer> map = new EnumMap<>(Grade.class);
map.put(Grade.BRONZE, 10);

6️⃣ Map 카운팅 패턴 (빈출)

public static Map<String, Integer> count(List<String> items) {
    Map<String, Integer> freq = new HashMap<>();
    for (String s : items) {
        freq.put(s, freq.getOrDefault(s, 0) + 1);
    }
    return freq;
}

1-D. 일급 컬렉션 템플릿

예시: 이름 목록 일급 컬렉션

public final class Names {
    private final List<String> values;

    private Names(List<String> values) {
        this.values = List.copyOf(values);
    }

    public static Names from(List<String> raw) {
        validateNoBlank(raw);
        validateNoDuplicate(raw);
        return new Names(raw);
    }

    public boolean contains(String name) {
        return values.contains(name);
    }

    public int size() {
        return values.size();
    }

    public Names add(String name) {
        if (values.contains(name)) {
            throw new IllegalArgumentException("중복 이름");
        }
        List<String> next = new ArrayList<>(values);
        next.add(name);
        return new Names(next);
    }

    private static void validateNoBlank(List<String> list) {
        for (String s : list) {
            if (s == null || s.trim().isEmpty()) {
                throw new IllegalArgumentException("빈 이름");
            }
        }
    }

    private static void validateNoDuplicate(List<String> list) {
        if (new HashSet<>(list).size() != list.size()) {
            throw new IllegalArgumentException("중복 이름");
        }
    }

    @Override
    public String toString() {
        return String.join(", ", values);
    }
}