자바 제네릭 정리: 타입 제한과 와일드카드는 서로 다른 문제를 푼다
Language/Java 2026. 9. 20. 17:14
자바 제네릭 정리: 타입 제한과 와일드카드는 서로 다른 문제를 푼다

세 편을 관통하는 하나의 질문지금까지 제네릭 시리즈를 이렇게 써왔다.154편: 제네릭이 왜 필요한가, 기본 문법155편: T extends Number로 타입 매개변수의 범위를 제한하는 법156편: List / List 와일드카드와 PECS세 편을 순서대로 읽다 보면 자연스럽게 이런 의문이 생길 수 있다."155편에서 T extends Number로 범위를 제한했으니까, Box는 이제 Box처럼 취급해도 되는 거 아닌가? 상한을 걸어놨는데 왜 아직도 불공변이지?"결론부터 말하면 이건 서로 완전히 다른 축의 문제를 섞어서 생각한 것이다. 이번 글에서는 이 두 축을 분리해서 정리한다.실험: 타입 제한이 불공변성을 풀어줄까?직접 코드로 확인해보자.class Box { private T value; ..

자바 제네릭, 와일드카드(?)와 PECS 원칙
Language/Java 2026. 9. 20. 16:16
자바 제네릭, 와일드카드(?)와 PECS 원칙

지난 글 요약과 오늘 다룰 것지난 글에서는 T extends SuperClass로 타입 매개변수의 상한을 제한하는 법을 다뤘다.Calculator처럼 클래스나 메서드를 선언하는 시점에 T의 범위를 정하는 방식이었다.그런데 이런 경우는 어떨까.void printAll(List list) { for (Object o : list) { System.out.println(o); }}List numbers = List.of(1, 2, 3);printAll(numbers); // ❌ 컴파일 에러Integer는 Object의 자식인데, List는 List의 자식이 아니다.이 글에서는 이 현상이 왜 발생하는지부터 시작해서, 이를 해결하는 와일드카드(?), 그리고 실무에서 와일드카드를 쓸 때 따라..

자바 제네릭, <T>만으로는 부족하다 - 타입 제한(extends)
Language/Java 2026. 9. 14. 20:27
자바 제네릭, <T>만으로는 부족하다 - 타입 제한(extends)

제네릭(Generic)의 문제점제네릭은 타입 자체를 매개변수화하여 클래스나 메서드를 다양한 타입에 대해 재사용할 수 있도록 하는 기능이다.public interface List extends SequencedCollection { ...//다양한 타입에 대해 재사용List list;List list;List> list;위 코드와 같이 List API를 다양한 타입으로 재사용할 수 있는 장점이 있지만,아무런 제한이 없는 타입 매개변수는 컴파일러가 Object로 취급하기 때문에 호출할 수 있는 메서드에 제약을 받게 된다. 만약 제네릭 메서드에서 크기를 비교하는 compareTo 함수를 사용하고 싶어도 사용할 수가 없다.static T max(T a, T b) { return a.compareTo(b)..

자바 제네릭 클래스(Java Generic Class) 개념
Language/Java 2026. 9. 14. 18:04
자바 제네릭 클래스(Java Generic Class) 개념

Java Generic(제네릭)이 등장한 이유와 핵심 개념제네릭(Generic)이란?제네릭은 클래스나 메서드가 사용할 데이터 타입을 미리 고정하지 않고, 사용하는 시점에 타입을 지정할 수 있도록 하는 기능이다.쉽게 말해,"타입을 변수처럼 받아서 클래스나 메서드를 일반화하는 기능"이라고 볼 수 있다.대표적인 예로 ArrayList가 있다.List names = new ArrayList();List numbers = new ArrayList();같은 ArrayList 클래스지만 사용하는 타입에 따라 전혀 다른 타입의 리스트처럼 동작한다. 제네릭은 왜 등장했을까?제네릭의 가장 중요한 목적은런타임 오류를 컴파일 타임 오류로 앞당기기 위해서이다.과거에는 다양한 타입을 저장하기 위해 Object를 사용했다.List..

Java Stream API
Language/Java 2026. 9. 7. 23:02
Java Stream API

요즘 AI 에이전트를 활용해 바이브코딩을 하다 보면 유독 자주 마주치는 코드가 있다.바로 Stream API를 활용한 코드다. Stream API가 일반적인 반복문에 비해 눈에 띄는 성능 차이를 만들어내는 것도 아니고,평소에도 크게 필요성을 느끼지 못했던 나는 그동안 Stream API를 적극적으로 사용하지 않았다. 문제는 AI가 작성해주는 코드에서 Stream API를 활용한 로직을 자주 마주치게 되면서부터였다.코드 리뷰를 하다가 Stream API가 복잡하게 체이닝되어 있으면, 그때마다 AI에게 "이 코드가 정확히 어떤 로직으로 동작하는지"를 다시 물어보고, 설명을 읽은 뒤 대략적으로 이해하고 넘어가는 일이 반복됐다. 처음에는 크게 불편하지 않았다.하지만 AI가 작성한 코드를 리뷰하는 일이 많아질수록..

파일 탐색기도 DB처럼 CRUD 가능한데 -
CS/DataBase 2026. 7. 21. 19:35
파일 탐색기도 DB처럼 CRUD 가능한데 -

0️⃣들어가며서버 개발을 시작하면 자연스럽게 이런 스택을 구성한다.Spring Boot ↔ JPA ↔ JDBC ↔ DBMS (MySQL/PostgreSQL)나 역시 그랬고, "서버 개발 = 데이터는 DB에 저장"이 너무나 당연한 전제여서, 의심해본 적이 없었다.JDBC 드라이버를 연결하고, JPA 엔티티를 정의하고, Repository를 만들고...그런데 최근 사내 학습동아리의 강의 자료를 준비하면서 문득 궁금해진게 하나 있다."윈도우의 파일 탐색기나 DBMS나 데이터를 조회하고, 삭제하고, 수정하는 것에는 다름이 없지 않나?"이 질문을 따라가다 보니, 내가 매일 쓰는 DBMS와 어떤 차이점이 있는지 알 수 있었다.이 글은 그 과정의 정리다. 1️⃣파일 탐색기와 DBMS의 아키텍처순수하게 아키텍처만 보면..

독서: 신경 끄기의 기술
회고록/독서 2026. 7. 5. 17:00
독서: 신경 끄기의 기술

제목도 그렇지만, 이 책의 프롤로그에는 내가 이 책을 읽고 싶었던 이유가 담겨 있었다.프롤로그에는 이런 문장이 나온다."대부분의 사람들은 자기가 뭘 하고 싶은지 전혀 모르겠다고 불평하며 인생을 살지만, 진짜 문제는 '뭘 해야 할지' 모르는 게 아니다. '뭘 포기해야 하는지' 모른다는 것이다."이 책을 구매할 당시의 나 역시 신경 쓰이는 것이 너무 많았다.그 때문에 정작 해야 할 일을 놓치거나 시작조차 하지 못하는 경우도 있었다. 남의 시선을 지나치게 의식했고,내가 무엇을 원하는 사람인지,어떤 가치관을 가지고 살아가야 하는지에 대한 고민도 컸다. 그래서 이 책을 통해 주변의 시선에 휘둘리지 않고, 조금 더 진정성 있게 살아갈 수 있는 방법을 찾고 싶었다.책은 "애쓰지 마라", "노력하지 마라", "신경 쓰..

발표 자료 컨텍스트 2부 - 프롬프트와 CLAUDE.md
LLM_Agent 2026. 6. 25. 20:26
발표 자료 컨텍스트 2부 - 프롬프트와 CLAUDE.md

에이전트를 제대로 쓰는 법: 시스템 프롬프트와 CLAUDE.md-규칙을 심는 시스템--질문을 던지는 사용자-두 프롬프트의 역할만 구분해도 AI 활용이 달라집니다. 프롬프트에는 두 종류가 있습니다AI와 대화할 때 프롬프트가 하나라고 생각하기 쉽습니다.실제로는 두 가지입니다.시스템 프롬프트 - 대화 시작 전에 미리 심어두는 규칙사용자 프롬프트 - 우리가 직접 입력하는 질문과 요청 시스템 프롬프트: AI의 행동 규칙시스템 프롬프트는 대화를 시작하기 전에 미리 설정해두는 지시문입니다.사용자 눈에는 보이지 않습니다대화 내내 고정된 규칙으로 유지됩니다주로 서비스를 만드는 사람이 작성합니다# 시스템 프롬프트 예시- 항상 한국어로 답변하세요.- 당신은 요리 전문가입니다.- 정치적인 주제는 다루지 마세요. 아래는 제가 ..

image