[JAVA] Generic
제네릭(Generic)이란 타입을 명시한다고 생각하면 편하다
예를 들면
package Study;
import java.util.ArrayList;
import java.util.List;
public class GenericStudy {
public static void main(String[] args) {
List<String> arrStr = new ArrayList<String>();//String타입만 담을 수 있는 List
List<Integer> arrInt = new ArrayList<Integer>();//Integer타입만 담을 수 있는 List
List<BeanStudy> list = new ArrayList<BeanStudy>();//BeanStudy라는 객체만 담을 수 있는 List
}
}
첫번째 리스트는 String만 넣을 수 있는 리스트
두번째 리스트는 Integer타입만 넣을 수 있는 리스트
세번째는 명시한 객체만 넣을 수 있는 리스트(가장 많이 사용 됨)
여기서 세번째의 객체는 Bean, VO, DTO같은 것들이다
설명보다 코드로 쇼핑몰에서 상품 게시판을 출력하려고 한다면 아래와 같다
Board라는 DTO객체
package com.training.mstmainte.repository;
import java.sql.Timestamp;
import lombok.Data;
@Data
public class BoardVO {
private String goodsNumber; //상품코드
private String goodsName; //상품명
private String goodsId; //상품 아이디(구분)
private int goodsPrice; //단가
private int goodsCost;//원가
private String fileName; //파일이름
private Timestamp insertDate; //등록일자
private Timestamp updateDate; //갱신일자
}
Controller
@Autowired
private BoardService boardService;
@RequestMapping(value = "/boardList", method = RequestMethod.GET)
public String boardList(BoardVO boardVO,
Model model) {
String url = "/board/board_list";
List<BoardVO> boardList = boardService.selectBoard();
model.addAttribute("boardList", boardList);
return url;
}
List<BoardVO> boardList = boardService.selectBoard();
boardService에 있는 selectBoard()라는 메서드를 이용해 DB에 접근한 다음
결과를 BoardVO만 담을 수 있는 리스트에 넣는다
boardService는 아래와 같다
public List<BoardVO> selectBoard();//상품 검색
boardService에서도 반환값을 List<BoardVO>로 명시해 두었다
model.addAttribute("boardList", boardList);
model.addAttribute("boardList", boardList);는
서버에서 boardList라는 객체를 "boardList"라는 이름으로 클라이언트에 넘기는 뜻이다
<tr th:each="board : ${boardList}"><!-- if : 서버에서 넘어온 boardList라는 객체가 있다면 -->
<td th:text="${board.goodsNumber}"></td><!-- 객체의 필드값 -->
<td th:text="${board.goodsId}"></td><!-- 객체의 필드값 -->
<td th:text="${board.goodsName}"></td><!-- 객체의 필드값 -->
<td th:text="${board.goodsPrice}"></td><!-- 객체의 필드값 -->
<td th:text="${#dates.format(board.insertDate, 'yyyy-MM-dd HH:mm:ss')}"></td><!-- 객체의 필드값 -->
<td th:text="${#dates.format(board.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td><!-- 객체의 필드값 -->
</tr>
그럼 클라이언트에서는 위와 같은 방식으로 for을 이용해 리스트에 담긴 Bean객체를 뿌려주는 것이다
이것이 게시판의 원리이다
제네릭을 사용하는 이유는 간단하다 타입을 명시해서 표현하고자 하는 데이터의 명확하게 나타내는 것
만일 제네릭을 사용하지 않는다고 하면
교실이라는 객체는 (선생님, 학생, 반장)만 존재해야 하는데
교실1 : 선생님, 학생, 반장
교실2 : 선생님, 학생, 반장, 강아지
이런 식으로 의도하지 않은 강아지라는 값이 들어가기 때문이다