Programming/JAVA

[JAVA] Generic

Plone 2020. 9. 11. 23:35

제네릭(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 : 선생님, 학생, 반장, 강아지

 

이런 식으로 의도하지 않은 강아지라는 값이 들어가기 때문이다