본문 바로가기
Dev/notion

Generic - 제네릭

by 괴발짜응 2025. 2. 19.
반응형

제네릭(Generics)은 프로그래밍 언어에서 타입을 매개변수화하여, 다양한 데이터 타입에 대해 하나의 코드 베이스를 재사용할 수 있도록 하는 개념이다. 즉, 특정 타입에 의존하지 않고, 추상적인 타입을 인자로 받아 처리할 수 있게 해준다. 이를 통해 코드의 재사용성과 타입 안전성을 높일 수 있다.


1.  제네릭의 기본 개념

타입 매개변수화:

제네릭은 함수, 클래스, 구조체, 인터페이스 등에서 실제 타입 대신 타입 매개변수( ex: T, U)를 사용한다. 이렇게 작성된 코드는 구체적인 타입으로  치환되어 다양한 상황에서 활용될 수 있다.

 

타입 안정성:

제네릭을 사용하면 컴파일 타임에 타입 오류를 검출할 수 있다. 즉, 잘못된 타입이 전달되는 경우 컴파일러가 오류를 발생시켜 런타임 오류를 줄일 수 있다.

 

코드 재사용성:

동일한 알고리즘이나 로직을 여러 데이터 타입에 대해 중복 없이 한 번만 구현할 수 있으므로, 코드의 중복을 제거하고 유지보수를 쉽게 만든다.

 

2. 제네릭의 동작 방식

컴파일 타임 치환 (Monomorphization)

일부 언어(C++, Rust 등)는 제네릭 코드를 사용할 때, 각 타입에 대해별도의 구체적인 코드(인스턴스)를 생성한다. 이를 모노모피제이션이라고 하며, 컴파일 타임에 최적화된 기계어 코드가 생성된다.

 

타입 소거 (Type Erasure)

Java나 C#(제한적인 경우) 등에서는 제네릭 타입 정보를 컴파일 타임에만 사용하고, 런타임에는 제거하는 방식으로 동작한다. 이로 인해 제네릭 타입의 구체적인 정보가 런타임에는 보이지 않는다. 

 

3. 제네릭의 장점과 고려사항

장점

  • 코드 중복 제거 - 여러 타입에 대해 같은 로직을 적용할 수 있으므로, 코드 중복을 방지한다.
  • 타입안정성 - 컴파일러가 제네릭 타입에 대해 타입 검사를 수행하므로, 런타임에 발생할 수 있는 타입 관련 오류를 사전에 방지한다.
  • 유연성 - 추상화된 코드를 통해 다양한 상황에 맞게재사용이 가능해진다.

고려사항

  • 컴파일 시간 증가 - 모노모피제이션을 사용하는 언어의 경우, 각 타입마다 별도의 코드 인스턴스를 생성하므로 컴파일 시간이 다소 늘어날 수 있다.
  • 런타임 성능 - 타입 소거를 사용하는 언어에서는 런티임에 제네릭 타입 정보가 없어지기 때문에, 리플렉션이나 동적 타입 검사와 같은 기능을 사용할 때 제약이 있을 수 있다.
  • 복잡성 증가 - 제네릭을 과도하게 사용하면 코드의 추상화 수준이 높아져서 오히려 가독성이 떨어질 수 잇으므로, 적절한 균형이 필요하다.
반응형