컴퓨터/질문: 개발
[2017.08.29] 13. 왜 제네릭을 사용할까?
heepie
2017. 8. 29. 20:36
도입
결론부터 말하면 제네릭을 통해
1) 타입의 안전성을 보장
2) 코드 중복 해결
할 수 있어 사용한다.
예를 들어, A회사의 매출관리 프로그램을 만든다고 가정해보자.
A 회사는 경영을 위해 매출을 주기적으로 관리하며 매출정보를
1) 회사 홍보를 위해 고객들에게
2) 경영판단을 위해 CEO에게
공개한다. 차이점은 CEO에게는 경영판단을 위해 더 세밀한 정보를 전달한다.
실습
그래서 아래와 같이 코드를 작성하였다.
1. CEO 용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class InfoToClient { int[][] daySaleInfo; int[] monthSaleInfo; int yearSaleInfo; InfoToClient() { daySaleInfo = new int[12][30]; monthSaleInfo = new int[12]; } public void setYearSaleInfo(int info) { this.yearSaleInfo = info; } // ... // 일별, 월별 판매 수익 입력 // ... public int getYearSaleInfo() { return yearSaleInfo; } } | cs |
2. 클라이언트 용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class InfoToCEO { double[][] daySaleInfo; double[] monthSaleInfo; double yearSaleInfo; InfoToCEO() { daySaleInfo = new double[12][30]; monthSaleInfo = new double[12]; } public void setYearSaleInfo(double info) { this.yearSaleInfo = info; } // ... // 일별, 월별 판매 수익 입력 // ... public double getYearSaleInfo() { return yearSaleInfo; } } | cs |
여기서 문제점은 같은 로직임에도 불구하고 코드가 중복된다.
이를 해결하기 위해 모든 클래스가 상속 받는 Object로 변경해보았다.
3. Object로 통합
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class InfoSales { Object[][] daySaleInfo; Object[] monthSaleInfo; Object yearSaleInfo; InfoSales() { daySaleInfo = new Object[12][30]; monthSaleInfo = new Object[12]; } public void setYearSaleInfo(Object info) { this.yearSaleInfo = info; } // ... // 일별, 월별 판매 수익 입력 // ... public Object getYearSaleInfo() { return yearSaleInfo; } } | cs |
코드 중복의 문제는 해결했다. 그러나! 또 다른 문제가 발생했다.
setYearSaleInfo 메소드를 실행 할 때, 입력자의 착각으로 Main에서 setYearSaleInfo("이번년도 양호") 라고 의도하지 않은 입력 할 경우도 컴파일 에러가 발생하지 않는다.
이러한
1) 타입의 안전성 보장과
2) 코드 중복을 해결
3) 컴파일의 혜택을 활용
하기 위해 '제네릭'이라는 개념이 등장하게 되었다.
4. '제네릭'을 사용한 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // 코드 중복 제거 class InfoSale <T> { T[][] daySaleInfo; T[] monthSaleInfo; T yearSaleInfo; InfoSale() { daySaleInfo = (T[][]) new Object[12][30]; monthSaleInfo = (T[]) new Object[12]; } // 타입의 안전성 보장 public void setYearSaleInfo(T info) { this.yearSaleInfo = info; } // ... // 일별, 월별 판매 수익 입력 // ... public T getYearSaleInfo() { return yearSaleInfo; } } | cs |
제네릭으로 구현할 경우, 입력자의 착각으로 Main에서 setYearSaleInfo("이번년도 양호") 라고 입력하면 컴파일 에러가 발생시켜 사전에 에러를 방지 할 수 있다.
#제네릭 #왜 제네릭 #자바 제네릭 #제네릭 사용이유