당우 일기장

자바 중급 문법 본문

JAVA

자바 중급 문법

당우 2025. 4. 8. 17:36

---

자바 중급~고급 문법: 컬렉션, 제네릭, 람다

자바에서 데이터 관리와 함수형 프로그래밍을 다룰 때 꼭 알아야 할 문법들! 이번 문서에서는 **컬렉션 프레임워크**, **제네릭**, **람다 표현식**을 "문법 - 설명" 형식으로 정리했어요. 중급에서 고급으로 넘어가는 발판이 될 핵심 개념들이니, 하나씩 익혀보세요!

---

컬렉션 프레임워크 (Collections Framework)

- **List 선언 - `List<타입> 변수명 = new ArrayList<>();`**:
순서가 있는 데이터 목록을 관리. `ArrayList`는 동적 배열 구현체. 예: `List names = new ArrayList<>();`

- **Set 선언 - `Set<타입> 변수명 = new HashSet<>();`**:
중복 없는 데이터 집합. `HashSet`은 순서 없이 저장. 예: `Set numbers = new HashSet<>();`

- **Map 선언 - `Map<키타입, 값타입> 변수명 = new HashMap<>();`**:
키-값 쌍으로 데이터 관리. `HashMap`은 해시 테이블 기반. 예: `Map<String, Integer> scores = new HashMap<>();`

- **요소 추가 - `add(값)`, `put(키, 값)`**:
`List`와 `Set`은 `add()`, `Map`은 `put()`으로 데이터 삽입. 예: `names.add("Alice"); scores.put("Math", 90);`

- **요소 접근 - `get(인덱스)`, `get(키)`**:
`List`는 인덱스로, `Map`은 키로 값 가져옴. 예: `String name = names.get(0); int score = scores.get("Math");`

- **반복 처리 - `for-each` 또는 `iterator()`**:
컬렉션 요소를 순회. 예:
```java
for (String name : names) { System.out.println(name); }
Iterator it = names.iterator();
while (it.hasNext()) { System.out.println(it.next()); }
```

---

제네릭 (Generics)

- **제네릭 클래스 - `class 클래스명 { ... }`**:
타입을 파라미터로 받아 재사용성 높은 클래스 정의. 예:
```java
class Box {
private T item;
public void setItem(T item) { this.item = item; }
public T getItem() { return item; }
}
```

- **제네릭 메서드 - ` 리턴타입 메서드명(T 매개변수) { ... }`**:
메서드 내에서 타입 파라미터 사용. 예:
```java
public void print(T value) { System.out.println(value); }
```

- **와일드카드 - `<? extends 타입>`, `<? super 타입>`**:
제네릭 타입의 범위를 제한. `extends`는 상위 바운드, `super`는 하위 바운드. 예:
```java
List<? extends Number> numbers; // Number 또는 그 하위 타입
List<? super Integer> integers; // Integer 또는 그 상위 타입
```

- **타입 지우기 방지 - `` 사용**:
컴파일 시 타입 안전성을 보장. 예: `Box box = new Box<>(); box.setItem("Hello");`

---

람다 표현식 (Lambda Expressions)

- **람다 기본 문법 - `(매개변수) -> { 실행문; }`**:
인터페이스의 단일 추상 메서드를 간결히 구현 (Java 8 이상). 예: `(x) -> System.out.println(x);`

- **함수형 인터페이스 사용 - `@FunctionalInterface`**:
람다를 적용할 인터페이스 정의. 단일 추상 메서드만 포함. 예:
```java
@FunctionalInterface
interface Calculator {
int calc(int a, int b);
}
Calculator add = (a, b) -> a + b;
```

- **메서드 참조 - `클래스::메서드명`**:
기존 메서드를 람다 대신 참조. 예: `System.out::println` (출력 메서드 참조)

- **컬렉션과 함께 사용 - `forEach()`, `stream()`**:
람다로 컬렉션 처리 간소화. 예:
```java
List names = Arrays.asList("Alice", "Bob");
names.forEach(name -> System.out.println(name));
names.stream().filter(name -> name.startsWith("A")).forEach(System.out::println);
```

---

스트림 (Stream) - 보너스!

- **스트림 생성 - `컬렉션.stream()`**:
데이터 흐름을 만들어 연산 수행. 예: `names.stream();`

- **중간 연산 - `filter()`, `map()`**:
조건 필터링이나 데이터 변환. 예: `stream.filter(x -> x > 0).map(x -> x * 2);`

- **최종 연산 - `collect()`, `forEach()`**:
결과를 모으거나 실행. 예: `List result = stream.collect(Collectors.toList());`

---

마무리

컬렉션, 제네릭, 람다를 통해 자바의 강력함을 더 깊이 느낄 수 있었죠? **컬렉션**으로 데이터를 효율적으로 관리하고, **제네릭**으로 타입 안전성을 높이고, **람다**로 코드를 간결하게 만들어보세요. 스트림은 보너스로 살짝 맛보기로 넣어봤어요! 다음엔 멀티스레드나 파일 I/O 같은 고급 주제로 가볼까요? 궁금한 점 있으면 언제든 물어봐주세요! 😊

---

'JAVA' 카테고리의 다른 글

스프링 입문 전 필수 자바 문법 리스트  (1) 2025.04.08
자바 기초문법 2  (0) 2025.04.08
자바 기초 문법  (0) 2025.04.08