사실 제네릭에 대해서는 포스팅에서도 몇 번 다루었다. ( 항해99 51일차 TIL1 - 제네릭) 예제가 조금 부실한 것 같아 다시 한 번 다뤄보려고 합니다.
자바는 컴파일 시, 변수의 타입이 결정되는 정적 언어를 의미한다.
Hello World 출력도 안해봤던 내게 자바 서적이 주었던 시련 중 하나였다. 도대체 정적 언어라는 말이 나는 도통 이해가 되지 않았다. 언어가 정적이라는게 도대체 무슨 말이지 다른 언어는 자동으로 변경되는건가🤔 이런 생각을 했었다.
그러다가 자바가 너무 어려워서 파이썬 책을 한 권 삿었다. 무엇보다도 타입을 설정하지 않는게 참 편했다.
나는 프로그래밍을 관두었고 오랜 시간이 지나 항해99에서 다시 자바로 프로그래밍 공부를 시작하였고 내가 동적 언어와 정적 언어를 모두 경험해봤다는걸 이때서야 깨달았다. 덕분에 "자바는 컴파일 시 변수의 타입이 결정되는 정적 언어를 의미한다." 라는 말에 의미를 조금은 이해하게 되었다.
어떻게 제네릭이 자바에 존재할 수 있을까? 자바는 컴파일 시, 변수의 타입이 결정되는 언어이기 때문이다. 다르게 말하면 제네렉은 컴파일 시점에서 타입을 검사하는 기능을 담당한다.
컴파일 시점에서 타입을 검사한다는 것은 어떤 의미이고 무슨 장점이 있을까요? 일단 제네릭을 사용하지 않았을 때의 불편함을 알아봅시다.
제네릭을 사용하지 않았을 때
prices에는 Integer 타입의 가격 정보가 담깁니다. 이를 위한 과정입니다.
제네릭을 사용하지 않고 prices에 가격을 담기 위해서는 빨간 박스 두 부분이 필요합니다.
첫 번째 박스는 prices에 들어가는 데이터가 Integer 타입임을 확인하는 작업을 수행합니다.
두 번째 박스에서는 prices에 들어가있는 데이터를 꺼내올 때 Integer 타입으로 형변환하는 작업을 수행합니다.
네 우리는 타입을 체크하고 형변환을 수동으로 진행했는데요. 왜 저희는 이런 행위를 했을까요?
prices ArrayList 인스턴스가 타입이 안정적임을 보장하기 위해서입니다.
제네릭은타입 체크, 형변환을 개발자 대신 수행합니다. 이를 통해 타입 안정성을 보장합니다.
제네릭을 사용할 때
위에서 짠 코드르 제네릭을 사용한 버전으로 변경해보도록 하겠습니다. 우선 매우 간결합니다. 아까와 같이 타입 체크, 형 변환을 개발자가 할 필요가 없습니다.
그런데 2행을 보면 인텔리제이에서 무언가 오류가 있음을 표현하고 있습니다. 아마도 Integer 타입이 들어와야하는데 다른 타입이 포함되어서 그런 것 같죠? 실제로 컴파일 해봅시다.
첫 번째 줄을 해석해보면 호환되지 않는 타입이라는 에러 메시지를 전달합니다. 제네릭이 개발자 되신 타입 체크를 해준것이죠.
다음은 형 변환입니다. 형 변환이 됐다는 증거는 for loop를 통해 볼 수 있습니다.
data 컬렉션의 데이터들을 Integer 타입으로 정의해도 컴파일 오류가 발생하지 않느다는 것이 증거입니다.
제네릭을 사용하지 않을 경우, 인텔리제이가 해당 소스 코드에 문제가 있음을 알립니다. 실제로 컴파일을 해도 에러가 발생하게 됩니다.
제네릭을 정리하겠습니다. 제네릭은 다음과 로직을 개발자 대신 수행합니다.
1. 타입 체크
2. 형변환
이를 통해서 제네릭은 타입 안정성을 보장합니다.
다른 관점에서 조금 바라보면 제네릭은 타입의 다형성을 부여합니다. 그렇죠. List에 어떤 타입이 들어가도 이에 맞게 동작합니다. 대표적으로 Spring Data Jpa를 사용하신 분들이라면 아래와 같은 코드를 한 번 쯤을 봤을 겁니다.
public interface EventRepository extends JpaRepository<Event, Long>
각각의 엔티티마다 JpaRepository를 상속하고 타입만 지정해주는 것만으로도 이에 대한 CRUD기능을 제공받을 수 있는데요. 그 기반에는 아래와 같이 제네릭도 한 몫을 차지하고 있습니다.
'Java' 카테고리의 다른 글
모던 자바 인 액션 (1) Stream API의 특징 (0) | 2023.07.08 |
---|---|
record class는 정말로 불변할까 (0) | 2023.05.25 |
객체 지향 프로그래밍이란 무엇인가? 추상화/다형성/캡슐화, SOILD (0) | 2023.03.27 |
Java - 애너테이션 (0) | 2023.03.21 |
자바 - 람다식 (0) | 2022.11.26 |