[Java 개념] 제네릭 개요

예세림·2024년 7월 23일

Java

목록 보기
10/12
post-thumbnail

제네릭이란?

다양한 종류의 객체, 데이터를 처리할 수 있도록 클래스, 인터페이스, 메서드를 정의하는 기법

제네릭(Generic)은 클래스나 메서드에서 사용할 데이터 타입을 미리 지정하는 대신, 나중에 사용할 때 타입을 지정할 수 있도록 하는 기법입니다. 이는 코드의 재사용성을 높이고, 컴파일 시 타입 안전성을 보장합니다.

제네릭 클래스, 메서드

특성제네릭 클래스 (Generic Class)제네릭 메서드 (Generic Method)
선언 키워드class ClassName<T><T> returnType methodName(T param)
사용 목적다양한 타입을 처리하는 클래스 정의다양한 타입을 처리하는 메서드 정의
타입 파라미터 위치클래스 이름 옆에 지정메서드 이름 옆에 지정
타입 파라미터 사용 범위클래스 전체에서 사용 가능메서드 내부에서만 사용 가능
인스턴스 생성new ClassName<Type>()메서드 호출 시 타입을 명시하거나 추론
타입 안정성컴파일 시 타입 체크 가능컴파일 시 타입 체크 가능

제네릭의 주요 특징

  • 제네릭 클래스: 클래스 정의 시 타입 매개변수를 사용하여 다양한 타입을 처리할 수 있는 클래스.
    타입 매개변수는 <> 안에 적음.
public class Box<T> {
    private T t;
    public void set(T t) { this.t = t; }
    public T get() { return t; }
}
  • 제네릭 메서드: 메서드가 다양한 타입을 처리할 수 있도록 설계됩니다. 타입 파라미터는 메서드 이름 옆에 지정됩니다.
    public <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }

제네릭의 장점

  1. 코드 재사용성 증가: 동일한 코드 베이스로 다양한 타입을 처리할 수 있어 코드 재사용성이 높아집니다.
  2. 타입 안전성 보장: 컴파일 시 타입 체크를 통해 런타임 오류를 줄일 수 있습니다.
  3. 형 변환 제거: 제네릭을 사용하면 명시적 형 변환이 필요 없어 코드가 깔끔해집니다.

결론

제네릭은 Java에서 타입 안전성과 코드 재사용성을 높이는 중요한 기법입니다. 제네릭 클래스와 제네릭 메서드를 통해 다양한 타입을 유연하게 처리할 수 있으며, 컴파일 시 타입 체크를 통해 안전성을 보장받을 수 있습니다. 제네릭을 적절히 활용하면 더 읽기 쉽.고 유지보수하기 쉬운 코드를 작성할 수 있습니다.

부록

  • 타입 파라미터: 특별한 의미의 알파벳보다는 단순한 임의의 참조형 타입
public class ClassName<T>{}
public interface InterfaceName<T>{}

제네릭 타입 파라미터의 의미

제네릭 타입 파라미터의미사용 예시
TReference Type (참조 타입)클래스나 메서드에서 일반적인 타입을 나타낼 때 사용
EElement (요소)컬렉션 프레임워크에서 요소를 나타낼 때 사용
KKey (키)맵에서 키를 나타낼 때 사용
VValue (값)맵에서 값을 나타낼 때 사용

설명

  • T (Reference Type): 제네릭 클래스나 메서드에서 일반적인 타입을 나타내기 위해 사용됩니다. 보통 임의의 타입을 지정할 때 사용합니다.

    public class Box<T> {
        private T t;
        public void set(T t) { this.t = t; }
        public T get() { return t; }
    }
  • E (Element): 주로 컬렉션 프레임워크에서 요소를 나타내기 위해 사용됩니다. 예를 들어, ArrayListSet에서 각 요소의 타입을 지정할 때 사용합니다.

    public class ArrayList<E> {
        private E[] elements;
        public void add(E element) { /* ... */ }
        public E get(int index) { return elements[index]; }
    }
  • K (Key): 주로 맵 인터페이스에서 키를 나타내기 위해 사용됩니다. 예를 들어, HashMap에서 각 키의 타입을 지정할 때 사용합니다.

    public class HashMap<K, V> {
        private K key;
        private V value;
        public void put(K key, V value) { /* ... */ }
        public V get(K key) { return value; }
    }
  • V (Value): 주로 맵 인터페이스에서 값을 나타내기 위해 사용됩니다. 예를 들어, HashMap에서 각 값의 타입을 지정할 때 사용합니다.

    public class HashMap<K, V> {
        private K key;
        private V value;
        public void put(K key, V value) { /* ... */ }
        public V get(K key) { return value; }
    }

    제네릭 타입 파라미터는 Java에서 타입을 일반화하고 다양한 데이터 구조를 유연하게 다룰 수 있게 해줍니다. 각 타입 파라미터는 특정 용도에 맞게 사용되어 코드의 가독성과 유지보수성을 높입니다.

와일드카드

내일 하자.

Wrapper Class:
기본자료형을 참조자료형처럼 쓸 수 있게 만든 객체

기본자료형: 모두 소문자로 선언 -> Wrapper 앞 글자만 대문자
기본자료형을 멤버변수로 가지는 참조선언
Why Wrapper: 추가메서드 존재
참조자료형으로 만들면 Java로 많은 걸 할 수 있음(메서드)
intVal 함 쳐봐
집합 <3
HashSet은 HashCode로 비교함
그래서 HashCode 메서드 필요 ㅋㅋ

int intVal 10;
intVal. // 메서드 호출 불가
Integer intVal = 10;
String result = intVal.toString();
System.out.println(result);
//이진수 -> String. Integer라는 Wrapper Class에서 알아서 해줌. 자바 개발자 ㄳ

기본 자료형과 Wrapper 클래스

기본 자료형Wrapper 클래스기본 자료형을 Wrapper 클래스로 변환 (오토박싱)Wrapper 클래스를 기본 자료형으로 변환 (언박싱)
byteByteByte byteObj = b;byte b = byteObj;
shortShortShort shortObj = s;short s = shortObj;
intIntegerInteger intObj = i;int i = intObj;
longLongLong longObj = l;long l = longObj;
floatFloatFloat floatObj = f;float f = floatObj;
doubleDoubleDouble doubleObj = d;double d = doubleObj;
charCharacterCharacter charObj = c;char c = charObj;
booleanBooleanBoolean boolObj = b;boolean b = boolObj;

0개의 댓글