Java 제네릭

CosmoNumb·2024년 7월 22일
0

java

목록 보기
6/24

제네릭(Generic)은 자바의 기능 중 하나로, 클래스나 메서드를 선언할 때 데이터 타입을 미리 지정하지 않고, 사용할 때 타입을 지정할 수 있게 하는 기능입니다. 이를 통해 코드의 재사용성을 높이고, 타입 안정성을 확보할 수 있습니다. 제네릭은 특히 컬렉션 클래스와 같은 데이터 구조에서 자주 사용됩니다.

제네릭의 기본 개념

제네릭을 사용하면 코드 작성 시 구체적인 타입을 명시하지 않고, 나중에 사용할 때 필요한 타입을 지정할 수 있습니다. 이를 통해 다양한 타입에 대해 동일한 코드를 재사용할 수 있습니다.

제네릭 클래스

제네릭 클래스를 선언하는 방법은 다음과 같습니다:

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

위 코드에서 T는 타입 파라미터로, Box 클래스가 어떤 타입을 다룰지를 지정합니다. 이 클래스는 T 타입의 내용을 저장할 수 있는 Box 클래스를 정의합니다.

제네릭 클래스 사용 예

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String content = stringBox.getContent();

Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
Integer number = integerBox.getContent();

위 예에서 Box<String>은 문자열을 다루는 Box 객체를, Box<Integer>는 정수를 다루는 Box 객체를 생성합니다. T 타입 파라미터가 각각 StringInteger로 대체됩니다.

제네릭 인터페이스

제네릭 인터페이스도 제네릭 클래스와 비슷하게 동작합니다. 인터페이스 선언 시 타입 파라미터를 지정하고, 이를 구현하는 클래스에서 구체적인 타입을 지정합니다.

제네릭 인터페이스 예

public interface Repository<T, ID> {
    void save(T entity);
    T findById(ID id);
    void delete(T entity);
}

위 예제에서 Repository 인터페이스는 T 타입의 엔티티와 ID 타입의 식별자를 다루는 제네릭 인터페이스입니다.

제네릭 인터페이스 구현 예

public class StudentRepository implements Repository<Student, Long> {
    @Override
    public void save(Student entity) {
        // 저장 로직
    }

    @Override
    public Student findById(Long id) {
        // 조회 로직
        return new Student(); // 예시 반환값
    }

    @Override
    public void delete(Student entity) {
        // 삭제 로직
    }
}

위 예제에서 StudentRepository 클래스는 Repository<Student, Long>을 구현하며, TStudent, IDLong으로 대체됩니다.

스프링 데이터 JPA의 제네릭 사용

스프링 데이터 JPA에서 제공하는 JpaRepository 인터페이스는 제네릭 인터페이스의 좋은 예입니다. JpaRepository는 두 개의 제네릭 타입 파라미터를 받습니다.

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID> {
    // 여러 CRUD 메서드가 정의되어 있음
}

JpaRepository 인터페이스는 T 타입의 엔티티와 ID 타입의 식별자를 다룹니다. 이를 구현하는 StudentRepository 예제는 다음과 같습니다:

public interface StudentRepository extends JpaRepository<Student, Long> {
}

이 예제에서:

  • Student는 엔티티 클래스입니다. 이 레포지토리가 Student 엔티티와 관련된 CRUD 작업을 수행함을 나타냅니다.
  • Long은 엔티티의 기본 키 타입입니다. Student 엔티티의 ID 필드가 Long 타입임을 의미합니다.

요약

  • 제네릭(Generic): 클래스나 메서드를 선언할 때 데이터 타입을 미리 지정하지 않고, 사용할 때 타입을 지정할 수 있게 하는 기능입니다.
  • 제네릭 클래스: 타입 파라미터를 사용하여 다양한 타입에 대해 동일한 코드를 재사용할 수 있습니다.
  • 제네릭 인터페이스: 타입 파라미터를 사용하여 다양한 타입을 다루는 인터페이스를 정의할 수 있습니다.
  • 스프링 데이터 JPA: JpaRepository 같은 제네릭 인터페이스를 사용하여 다양한 엔티티에 대해 공통된 CRUD 작업을 수행할 수 있습니다.

제네릭을 사용하면 코드의 재사용성을 높이고, 타입 안정성을 확보할 수 있습니다. 이는 코드의 가독성을 높이고 유지보수를 용이하게 합니다.

0개의 댓글