Java 40

Java 람다식 — 콜백 지옥 탈출 (함수형 인터페이스부터 메서드 레퍼런스까지)

Java 17 기준으로 함수형 인터페이스, 람다 문법, 메서드 레퍼런스를 실무 관점에서 정리하고 콜백 지옥을 깔끔하게 줄이는 패턴을 예제로 보여드립니다. 비동기 처리나 이벤트 기반 코드를 작성하다 보면 “콜백 안에 콜백”이 계속 중첩되어 흐름을 따라가기 어려워질 때가 많습니다. 특히 익명 클래스까지 섞이면 코드가 길어지고, 예외 처리나 로깅을 끼워 넣는 순간 더 복잡해지죠. 이럴 때 Java 람다식은 “행동(로직)을 값처럼 전달”해서 코드를 짧고 읽기 쉽게 만드는 강력한 도구가 됩니다.핵심 개념: Java 람다식이 콜백 지옥을 줄이는 이유 (함수형 인터페이스)람다식은 결국 **“함수형 인터페이스(Functional Interface)의 인스턴스를 간단히 만드는 문법 설탕”**입니다. 핵심은 클래스/익명 ..

JAVA 2026.02.21

Java 제네릭 실전 패턴: 제네릭 메서드·인터페이스 설계와 자주 만나는 에러 해결법

Java 17 기준으로 제네릭 메서드와 제네릭 인터페이스를 실무 관점에서 설계하는 패턴을 정리하고, 타입 추론 실패·캡처 에러 등 흔한 컴파일 에러 해결법을 예제로 설명합니다. 제네릭을 “컴파일 타임 안전장치”라고는 하는데, 막상 공용 유틸을 만들거나 인터페이스를 설계할 때는 타입 파라미터를 어디에 둬야 할지 헷갈리실 때가 많아요. 특히 incompatible types, capture of ?, cannot infer type arguments 같은 에러가 한 번 나오면, 고치기보다 우회하게 되는 경우도 흔합니다. 이번 글에서는 실무에서 바로 써먹는 제네릭 메서드/인터페이스 패턴과, 자주 만나는 에러의 정석적인 해결법을 정리해 봅니다.핵심 개념: “타입 파라미터를 어디에 두느냐”가 API 품질을 결정합..

JAVA 2026.02.21

Java 와일드카드 완전 정복 — <? extends T>, <? super T> 그리고 PECS 원칙

Java 제네릭 와일드카드의 핵심인 extends/super 차이와 PECS 원칙을 실무 예제로 한 번에 정리합니다. 제네릭을 쓰다 보면 List 자리에 List를 넣고 싶은데 컴파일 에러가 나서 당황하실 때가 있어요. 반대로 “읽기만 할 건데 왜 타입이 이렇게 까다롭지?” 같은 생각도 들고요. 이럴 때 문제를 풀어주는 도구가 바로 와일드카드(?)입니다.핵심 개념 — Java 와일드카드와 PECS 원칙이 중요한 이유와일드카드는 “정확한 타입을 지금은 모르지만, 어떤 범위인지는 안다”를 타입 시스템에 표현하는 문법입니다. 핵심은 두 가지예요.: T의 하위 타입 중 하나 (Upper bounded wildcard): T의 상위 타입 중 하나 (Lower bounded wildcard)여기서 중요한 포인트는 ..

JAVA 2026.02.20

Java 제네릭 기초 — 타입 안전성의 시작

Java 제네릭의 필요성, 기본 문법, 그리고 타입 소거(Type Erasure)가 의미하는 한계와 설계 포인트를 실무 관점에서 정리합니다. List에 뭔가를 담아두고 꺼냈는데, 런타임에 ClassCastException이 터진 경험 있으실 거예요. 혹은 “이 리스트엔 User만 들어간다”는 규칙을 팀원끼리 말로만 합의해 두고, 어느 날 누군가 다른 타입을 넣어 장애가 난 적도 있습니다. 제네릭은 이런 문제를 “컴파일 시점”으로 끌어와서, 실수를 빨리 발견하게 해주는 장치입니다.핵심 개념: Java 제네릭이 중요한 이유와 타입 소거(Type Erasure)제네릭이 필요한 이유: 타입 안정성과 의도의 문서화제네릭의 핵심 가치는 두 가지입니다.타입 안전성(Type Safety)제네릭이 없던 시절(또는 raw..

JAVA 2026.02.20

Java Collections 유틸 활용 팁 — 정렬부터 불변 컬렉션까지 한 번에 정리

Java 17 기준으로 Collections 정렬 유틸과 불변 컬렉션(List.of/Map.of), unmodifiable vs copyOf 차이를 실무 관점에서 정리합니다. 리스트를 정렬했는데 “원본이 바뀌어 버려서” 다른 로직이 깨진 경험이 있으신가요? 또는 List.of()로 만든 리스트에 add()를 했다가 런타임 예외를 만나 당황하신 적도 있을 거예요. 컬렉션은 자주 쓰는 만큼, “의도한 변경 가능성(mutability)”을 코드로 정확히 표현하는 게 생각보다 중요합니다.핵심 개념 (Java Collections 유틸과 불변 컬렉션이 중요한 이유)Java에서 컬렉션을 다룰 때 실무 사고의 대부분은 두 가지에서 나옵니다.정렬은 “어디를” 바꾸는가?Collections.sort(list)나 list..

JAVA 2026.02.19

Java HashMap 동작 원리와 함정 — 해시 충돌부터 equals/hashCode 계약까지

Java 17 기준으로 HashMap의 버킷 구조, 해시 충돌 처리, equals/hashCode 계약을 실무 관점에서 정리하고 TreeMap과 선택 기준까지 비교합니다. HashMap에 넣어둔 값을 분명히 꺼내야 하는데 get()이 null을 돌려주거나, 특정 상황에서 성능이 갑자기 나빠진 경험이 있으실 수 있어요. “키가 같은데 왜 못 찾지?”, “HashMap은 항상 O(1) 아닌가요?” 같은 질문이 딱 이 지점에서 나옵니다.이번 글에서는 HashMap이 내부에서 어떻게 동작하는지와, 실무에서 자주 밟는 함정을 함께 정리해 볼게요.핵심 개념 (Java HashMap 동작 원리, 해시 충돌, equals/hashCode 계약)HashMap을 “서랍장”에 비유하면 이해가 쉬워요. 키를 해시 함수로 계산..

JAVA 2026.02.19

Java ArrayList vs LinkedList — 진짜 차이(내부 구조·성능·실무 선택 기준)

Java ArrayList와 LinkedList의 내부 구조와 성능 차이를 실제 사용 패턴 기준으로 비교하고, 실무에서 ArrayList가 기본 선택이 되는 이유를 정리합니다. 리스트가 필요해서 List를 고르려는데, IDE 자동완성에 ArrayList와 LinkedList가 나란히 보이면 한 번쯤 고민하게 됩니다. “중간 삽입이 많으면 LinkedList가 빠르다”는 이야기도 들었는데, 막상 실무에서는 ArrayList만 보이는 경우가 많죠. 오늘은 이 간극이 왜 생기는지, 내부 구조와 성능 관점에서 정리해 봅니다.핵심 개념: Java ArrayList vs LinkedList 차이를 만드는 ‘구조’와 ‘접근 패턴’ArrayList와 LinkedList는 둘 다 List이지만, 데이터를 담는 방식이 완..

JAVA 2026.02.18

Java 배열과 컬렉션 프레임워크 입문 — Array에서 List, Set, Map까지 한 번에 잡기

Java에서 배열의 한계를 넘어 List, Set, Map으로 자연스럽게 확장하는 흐름과 실무 선택 기준을 정리합니다. 처음에는 배열로 충분해 보이는데, 조금만 기능이 늘어나면 “중복 제거는?”, “빠른 검색은?”, “키로 바로 찾고 싶은데?” 같은 요구가 바로 생깁니다. 이때 무작정 ArrayList만 쓰기 시작하면, 나중에 성능과 코드 가독성에서 비용을 치르게 됩니다.핵심 개념 (Java 컬렉션 선택 기준: 배열 → List → Set → Map)Java의 컬렉션 프레임워크는 “데이터를 어떤 규칙으로 담고, 어떤 작업을 빠르게 할 것인가”를 선택하는 도구 상자라고 보시면 됩니다. 배열에서 시작해 List → Set → Map으로 갈수록 “기능(규칙)”이 명확해지고, 그만큼 의도가 코드에 잘 드러납니다..

JAVA 2026.02.18

Java String 완전 정복: 불변성, StringBuilder, 비교 함정, Text Block까지

Java 17 기준으로 String의 불변성 이유와 성능 포인트, ==/equals 비교 함정, StringBuilder 사용 기준, Text Block 활용법을 실무 관점에서 정리합니다. 로그 한 줄 만들려고 문자열을 +로 계속 붙였는데, 트래픽이 오르자 CPU가 튀고 GC가 바빠지는 경험을 하실 때가 있습니다. 또 어떤 환경에서는 "a" == new String("a")가 false라서 디버깅이 길어지기도 해요. Java의 String은 “그냥 문자”가 아니라, 성능과 버그를 동시에 좌우하는 핵심 타입입니다.핵심 개념 (Java String 불변성이 중요한 이유)String은 왜 불변(Immutable)일까요?Java의 String은 한 번 만들어지면 내용이 바뀌지 않습니다. 이 설계 덕분에 다음 이..

JAVA 2026.02.17

Java 예외 처리 제대로 하기: Checked vs Unchecked부터 실무 전략까지

Java 17 기준으로 Checked/Unchecked 예외 선택 기준, try-with-resources, 커스텀 예외 설계와 실무 예외 처리 전략을 한 번에 정리합니다. 운영 장애를 분석하다 보면 “로그에는 예외가 있는데 사용자는 그냥 실패했다는 메시지만 본다” 같은 상황을 자주 마주하게 됩니다. 혹은 반대로, 메서드마다 throws Exception이 붙어서 호출부가 도미노처럼 지저분해진 경험도 있으실 거예요. Java 예외 처리는 “잡기만 하면 끝”이 아니라, 설계와 전략이 함께 가야 유지보수가 쉬워집니다.핵심 개념 (Java 예외 처리 전략과 선택 기준)예외 처리는 크게 “어떤 예외를 던질지(Checked vs Unchecked)”와 “어디서 잡을지(경계에서 처리)”를 결정하는 문제입니다. 이 ..

JAVA 2026.02.17