제네릭(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
타입 파라미터가 각각 String
과 Integer
로 대체됩니다.
제네릭 인터페이스도 제네릭 클래스와 비슷하게 동작합니다. 인터페이스 선언 시 타입 파라미터를 지정하고, 이를 구현하는 클래스에서 구체적인 타입을 지정합니다.
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>
을 구현하며, T
는 Student
, ID
는 Long
으로 대체됩니다.
스프링 데이터 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
타입임을 의미합니다.JpaRepository
같은 제네릭 인터페이스를 사용하여 다양한 엔티티에 대해 공통된 CRUD 작업을 수행할 수 있습니다.제네릭을 사용하면 코드의 재사용성을 높이고, 타입 안정성을 확보할 수 있습니다. 이는 코드의 가독성을 높이고 유지보수를 용이하게 합니다.