반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 오블완
- 이차전지관련주
- 스프링핵심원리
- 알고리즘
- kubernetes
- Spring
- Effective Java
- Effective Java 3
- 티스토리챌린지
- 카카오
- 카카오 면접
- 스프링
- 스프링 핵심원리
- 자바스크립트
- 스프링부트
- 클린아키텍처
- k8s
- 이펙티브 자바
- JavaScript
- 코딩테스트
- ElasticSearch
- 예제로 배우는 스프링 입문
- 자바
- 김영한
- Sort
- effectivejava
- 엘라스틱서치
- 이펙티브자바
- java
- 알고리즘정렬
Archives
- Today
- Total
Kim-Baek 개발자 이야기
제네릭이란 무엇일까 본문
제네릭(Generics)은 자바에서 컴파일 타임에 타입(type)을 검증하고, **코드의 재사용성과 타입 안전성(type safety)**을 높이기 위해 도입된 기능입니다. 제네릭을 사용하면 클래스나 메서드를 여러 타입에 대해 일반화(generalize)하여 작성할 수 있어, 다양한 데이터 타입을 처리하는 코드를 보다 효율적이고 안전하게 작성할 수 있습니다. 이번에는 자바 제네릭에 대해 상세히 설명하겠습니다.
제네릭의 필요성
자바는 **타입 안전성(type safety)**을 보장하기 위해 컴파일 시점에 타입을 확인합니다. 제네릭을 도입하기 이전에는 다양한 타입의 객체를 처리할 때 Object 타입을 사용하거나, 특정 타입으로 캐스팅(casting)하는 방식이 일반적이었습니다. 하지만 이러한 방식은 다음과 같은 문제점을 야기했습니다.
- 타입 안전성 미보장: 잘못된 타입으로 캐스팅할 경우 런타임 시 ClassCastException이 발생할 수 있습니다.
- 코드의 중복: 다양한 타입을 처리하기 위해 반복적인 코드 작성이 필요했습니다.
- 가독성 저하: Object 타입을 사용하면 코드의 의도를 파악하기 어려워집니다.
제네릭은 이러한 문제를 해결하고, 재사용 가능하고 안전한 코드를 작성할 수 있게 도와줍니다.
제네릭의 기본 개념
제네릭은 클래스, 인터페이스, 메서드에 타입 매개변수(type parameter)를 도입하여, 다양한 타입을 처리할 수 있도록 합니다. 타입 매개변수는 주로 대문자 한 글자로 표기되며, 관례적으로 다음과 같은 이름을 사용합니다.
- E – Element (컬렉션에서의 요소 타입)
- T – Type (일반적인 타입)
- K – Key (키)
- V – Value (값)
- N – Number (숫자 타입)
제네릭 클래스
제네릭 클래스를 정의하려면 클래스 이름 뒤에 <T>와 같이 타입 매개변수를 명시합니다.
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello Generics");
String message = stringBox.getContent(); // 형변환 불필요
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
Integer number = integerBox.getContent();
제네릭의 장점과 단점
장점
- 타입 안전성(Type Safety): 컴파일 시점에 타입 검증이 이루어지므로, 런타임 오류를 줄일 수 있습니다.
- 코드 재사용성: 동일한 클래스나 메서드를 다양한 타입에 대해 재사용할 수 있어, 코드의 중복을 줄일 수 있습니다.
- 가독성 및 유지보수성 향상: 제네릭을 사용하면 코드의 의도가 명확해지고, 타입 관련 버그를 사전에 방지할 수 있습니다.
- 자동 형변환: 제네릭을 사용하면 명시적인 형변환(casting)이 필요 없어져, 코드가 간결해집니다.
단점
- 런타임 타입 정보 부재: 타입 소거로 인해 런타임에 제네릭 타입 정보를 확인할 수 없어, 일부 기능 제한이 있습니다.
- 복잡성 증가: 제네릭의 사용과 관련된 규칙과 개념을 이해하는데 시간이 필요할 수 있습니다.
- 호환성 문제: 제네릭과 배열을 함께 사용할 때 발생하는 제약으로 인해, 코드 작성이 복잡해질 수 있습니다.
정리
- 타입 매개변수: 클래스나 메서드에 타입을 일반화하여 다양한 타입을 처리할 수 있게 함.
- 제한된 타입 매개변수: 타입 매개변수가 특정 타입을 상속하거나, 인터페이스를 구현하도록 제한.
- 와일드카드: 유연한 타입 매개변수 처리(?, ? extends T, ? super T).
- 타입 소거: 컴파일 후 제네릭 타입 정보 제거, 런타임에 제네릭 타입 정보 접근 불가.
- 실무 활용: 컬렉션 프레임워크와 함께 제네릭을 적극적으로 활용하여 타입 안전성 확보.
반응형
'개발 > java basic' 카테고리의 다른 글
제네릭 타입 소거 (컴파일/런타임) (0) | 2024.11.16 |
---|---|
일급 컬렉션이란? (0) | 2024.11.13 |
자바에서 코틀린 - 6장 자바에서 코틀린 컬렉션으로 (0) | 2023.04.17 |
자바에서 코틀린 - 5장 빈에서 값으로 (0) | 2023.04.13 |
자바 기본 ( 18 ) - 예외처리 (0) | 2020.11.03 |
Comments