제네릭이란 타입을 명시해 주는 것이다

그리고 리스트 외에 클래스나 메서드에서도 사용할 수 있다

하지만 리스트와는 용도가 다르다

 

아래 코드로 알아보자

 

코드1

package Study;

public class GenericClassStudy<T> {
	private T memberId;
	private T memberName;
	
	
	public T getMemberId() {
		return memberId;
	}
	public void setMemberId(T memberId) {
		this.memberId = memberId;
	}
	public T getMemberName() {
		return memberName;
	}
	public void setMemberName(T memberName) {
		this.memberName = memberName;
	}

	public static void main(String[] args) {
		GenericClassStudy<String> member = new GenericClassStudy<String>();
		
		member.setMemberId("ABC123");//정상
		member.setMemberId(123);//에러
	
	}

}

 

코드2

package Study;

public class GenericClassStudy {
	private String memberId;
	private String memberName;
	
	
	public String getMemberId() {
		return memberId;
	}
	public void setMemberId(T memberId) {
		this.memberId = memberId;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(T memberName) {
		this.memberName = memberName;
	}

	public static void main(String[] args) {
		GenericClassStudy member = new GenericClassStudy();
		
		member.setMemberId("ABC123");//정상
		member.setMemberId(123);//에러
	
	}

}

 

결론적으로 말하자면 코드1과 코드2는 같다

코드2를 제네릭 클래스로 표현하면 코드1과 같이 된다

 

일반적으로 제네릭 안에는 String, Integer, Object등을 명시하나 

타입을 알수 없거나 기존 코드를 동적으로 사용하기 위해 제네릭안에 임의의 알파벳을 작성한다

굳이 T가 아닌 다른 알파벳이여도 된다(대소문자 구분 없으나 대문자를 추천한다)

 

 

public class GenericClassStudy{
	private String memberId; 
	private String memberName; 
}

 

 

위 코드의 멤버변수 타입을 만약 int로 수정할려면 전부 수정해 줘야한다

하지만 제네릭 클래스를 사용하면 좀 다르다

package Study;

public class GenericClassStudy<T> {
	private T memberId;
	private T memberName;
	
	public static void main(String[] args) {
		GenericClassStudy<Integer> member = new GenericClassStudy<Integer>();
		
		member.setMemberId("ABC123");//에러
		member.setMemberId(123);//정상
	
	}

}

 

객체생성을 할때 제네릭 안에 타입만 바꿔주면 전부 바뀐다

 

또한 여러개의 타입을 선언해 줄 수도 있다

 

package Study;

public class GenericClassStudy<I, S> {
	private I memberNumber;
	private S memberName;
	
	public I getMemberNumber() {
		return memberNumber;
	}
	public void setMemberNumber(I memberNumber) {
		this.memberNumber = memberNumber;
	}
	public S getMemberName() {
		return memberName;
	}
	public void setMemberName(S memberName) {
		this.memberName = memberName;
	}

	public static void main(String[] args) {
		GenericClassStudy<Integer, String> member = new GenericClassStudy<Integer, String>();
		
		member.setMemberNumber(1);
		member.setMemberName("ABC");
		

	}

}

 

제네릭 메서드도 마찬가지이다

 

package Study;

public class GenericClassStudy<I, S> {
	private I memberNumber;
	private S memberName;
	
	/*제네릭 메서드*/
	public void Person(I age) {
		System.out.println(age);//20
	}

	public static void main(String[] args) {
		GenericClassStudy<Integer, String> member = new GenericClassStudy<Integer, String>();
		
		member.Person(20);
		
	}

}

남발하면 규모가 커질때 머리아프니 적당히

 

'Programming > JAVA' 카테고리의 다른 글

[JAVA] GetBytes  (0) 2020.09.13
[JAVA] HashCode  (0) 2020.09.12
[JAVA] Generic  (0) 2020.09.11
[JAVA] NullCheck  (0) 2020.09.11
[JAVA] Bean(DTO, VO)  (0) 2020.09.11

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

 

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

'Programming > JAVA' 카테고리의 다른 글

[JAVA] HashCode  (0) 2020.09.12
[JAVA] Generic Class, Generic Method  (0) 2020.09.12
[JAVA] NullCheck  (0) 2020.09.11
[JAVA] Bean(DTO, VO)  (0) 2020.09.11
[JAVA] Stream  (0) 2020.09.11
package Study;

public class NullCheckStudy {

	public static void main(String[] args) {
		String str1 = "";
		String str2 = null;
		

		/* == null */
		if(str1 == null) {//에러 : deadCode
			System.out.println("check1-1");
		}
		if(str2 == null) {//정상
			System.out.println("check1-2");
		}
		
		/* .isEmpty() */
		if(str1.isEmpty()) {//정상
			System.out.println("check2-1");
		}
		if(str2.isEmpty()) {//에러 : NullPointerException
			System.out.println("check2-2");
		}
		
		/* .equals() */
		if(str1.equals("")) {//정상
			System.out.println("check3-1");
		}
		if(str2.equals("")) {//에러 : equals()는 공백검사만 가능하며 null검사는 불가능
			System.out.println("check3-2");
		}
		
		/* length() == 0 */
		if(str1.length() == 0) {//정상
			System.out.println("check4-1");
		}
		if(str2.length() == 0) {//NullPointerException
			System.out.println("check4-2");
		}
		

	}

}

 

.isEmpty()는 자바6 이상버전에서만 사용가능

'Programming > JAVA' 카테고리의 다른 글

[JAVA] Generic Class, Generic Method  (0) 2020.09.12
[JAVA] Generic  (0) 2020.09.11
[JAVA] Bean(DTO, VO)  (0) 2020.09.11
[JAVA] Stream  (0) 2020.09.11
[JAVA] Writer  (0) 2020.09.11

자바 Bean이란 여러 데이터를 하나로 모아 객체화 시킨것이다.

간단히 말하면 연관있는 데이터끼리 모아서논 것이다

 

교실이라는 객체가 있다면  그 안에 선생님과 학생, 반장, 부반장이 있듯이

C언어의 구조체가 비슷한 구조(정확히는 다르지만 이해를 돕기 위해)

 

작성법은 아래와 같다

package Study;

public class BeanStudy {
	private int memberNum;
	private String memberId;
	private String memberPass;
	private String memberPhone;
	private String memberAddress;
	
	
}

 

 

클래스를 작성하고 멤버필드에 private 접근자로 변수를 선언한다

이때, 변수명은 카멜표기법을 따른다

 

카멜표기법이란 자바 표준 변수명표기법이며, 단어의 첫글자가 소문자이고 두번째 단어부터는 대문자이다

exam)memberNumber, memberId, memberName

 

다른표기법을 사용할경우 꼬이는 경우가 있으니 주의하자

 

작성후 오른쪽마우스

 

Source>Generate Getters and Setters를 클릭

 

getter setter를 작성할 필드명을 체크하고  아래의 Generate를 클릭하면 아래처럼 작성된다

toSring도 같은 방법으로 작성하면 된다

 

결과

package Study;

public class BeanStudy {
	private int memberNum;
	private String memberId;
	private String memberPass;
	private String memberPhone;
	private String memberAddress;
	
	public int getMemberNum() {
		return memberNum;
	}
	public void setMemberNum(int memberNum) {
		this.memberNum = memberNum;
	}
	public String getMemberId() {
		return memberId;
	}
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	public String getMemberPass() {
		return memberPass;
	}
	public void setMemberPass(String memberPass) {
		this.memberPass = memberPass;
	}
	public String getMemberPhone() {
		return memberPhone;
	}
	public void setMemberPhone(String memberPhone) {
		this.memberPhone = memberPhone;
	}
	public String getMemberAddress() {
		return memberAddress;
	}
	public void setMemberAddress(String memberAddress) {
		this.memberAddress = memberAddress;
	}
	
	@Override
	public String toString() {
		return "BeanStudy [memberNum=" + memberNum + ", memberId=" + memberId + ", memberPass=" + memberPass
				+ ", memberPhone=" + memberPhone + ", memberAddress=" + memberAddress + "]";
	}
}

 

Bean의 사용법

 

 

위에서 작성했던 Bean의 객체를 생성해

객체명. 으로 get,set에 접근가능하다

 

 

새로운 값이 들어가면 기존에 입력된 값은 지워진다

Bean는 로그인세션이나 글, 뷰, 리스트등 자바에서 필수적으로 사용되는 중요한 개념

'Programming > JAVA' 카테고리의 다른 글

[JAVA] Generic  (0) 2020.09.11
[JAVA] NullCheck  (0) 2020.09.11
[JAVA] Stream  (0) 2020.09.11
[JAVA] Writer  (0) 2020.09.11
[JAVA] Reader  (0) 2020.09.11
package Study;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class StreamStudy {

	public static void main(String[] args) {
		InputStream inputStream = null;
		OutputStream outputStream = null;
		try {
			inputStream = new FileInputStream("c:\\test\\text.txt");
			outputStream = new FileOutputStream("c:\\test\\result.txt");
			
			while(true) {
				int data = inputStream.read();//1바이트씩 읽기
				
				if(data == -1) {//더 이상 없다면
					break;//중지
				}
				outputStream.write(data);//1바이트씩 쓰기
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(inputStream != null && outputStream != null) {//스트림이 닫히지 않았으면 
					inputStream.close();//종료
					outputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}


	}

}

#Stream
초기 자바는 바이트 단위로 입출력을 지원함
가장 원시적인 형태의 입출력이며 아무런 변환작업을 수행하지 않음
바이너리 형태의 자원을 다루기 적합


#InputStream(추상(abstract) 클래스)

  • FileInputStream
  • ByteArrayInputStream
  • FilterInputStream
  • BufferedInputStream
  • DataInputStream
  • ObjecInputStream
  • PipedInputStream                                                 

#OutputStream(추상(abstract) 클래스)

  • FileOutputStream
  • ByteArrayOutputStream
  • FilterOutputStream
  • BufferedOutputStream
  • DataOutputStream
  • ObjectOutputStream
  • PipedOutputStream

 

package Study;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class StreamStudy2 {

	public static void main(String[] args) {
		InputStream inputStream = null;
		OutputStream outputStream = null;
		try {
			inputStream = new FileInputStream("c:\\test\\text.txt");
			outputStream = new FileOutputStream("c:\\test\\result.txt");
			
			/*inputStream*/
			int i = inputStream.read();//65
			char c = (char)inputStream.read();//A
			outputStream.write(i); // outputStream.write(c)과 동일 결과
			
			inputStream.available();//읽을 수 있는 byte수를 반환
			inputStream.mark(1);//현재위치 표시
			inputStream.read();//1byte를 읽어 byte값으로 반환, 더 이상 읽을 수 없을때는 -1을 반환
			inputStream.skip(1);//n byte만큼건너뛰고 byte수를 반
			inputStream.markSupported();//mark()로 지정된 지점이 있는지 검사
			inputStream.reset();//mark()를 마지막으로 호출한 위치로 이동, 없으면 처음으로 이동
			
			
			/*outputStream*/
			String str = "ABC123";
			byte[] arr = str.getBytes();//[B@15db9742
			outputStream.write(arr);//byte만 쓰기 가능,결과 : ABC123
			
			outputStream.flush();//비우기
			outputStream.write(1);//쓰기(문자, 정수형 둘다 가능)
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(inputStream != null && outputStream != null) {//스트림이 닫히지 않았으면 
					inputStream.close();//종료
					outputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}


	}

}

 

ByteArrayInputputStream, ByteArrayOutputStream 코드는 하단 링크 참조 

plone93.tistory.com/12?category=891489

'Programming > JAVA' 카테고리의 다른 글

[JAVA] NullCheck  (0) 2020.09.11
[JAVA] Bean(DTO, VO)  (0) 2020.09.11
[JAVA] Writer  (0) 2020.09.11
[JAVA] Reader  (0) 2020.09.11
[JAVA] UUID  (0) 2020.09.10

+ Recent posts