Programming/JAVA

[JAVA] WrapperClass(래퍼 클래스)

Plone 2020. 10. 4. 17:17

#WrapperClass(래퍼 클래스)

자바 자료형은 기본타입(int, char, boolean..)과 참조타입(class, interface)와 같은 객체 구분된다

기본타입을 객체처럼 다루기 위해서 사용하는 것이 래퍼 클래스 이다

 

기본자료형 : 변수가 다르더라도 값이 같으면 같은 주소를 가르킨다

참조형(래퍼클래스) : 값이 같더라도 다른 주소를 가르킨다

 

#기본 자료형 특징

  • 변수명이 다르더라도 값이 같으면 주소가 같다
  • NULL을 사용할 수 없다
  • 기본 자료형 끼리 비교할 때는 ==를 사용(주소 비교)

 

#래퍼클래스 특징

  • 기본자료형은 NULL이 허용되지 않지만 래퍼 클래스는 NULL이 허용된다
  • 래퍼클래스는 특정 기능을 하는 메서드를 사용할 수 있다
  • 래퍼클래스끼리는 객체이므로 .equals()를(값 비교) 사용해서 비교한다
  • 기본자료형과 다르게 값이 같더라도 주소가 다름
  • NULL이 허용되지 때문의 NullPointExcetion에 주의해야 한다
package Study;

public class WrapperClassStudy {

	public static void main(String[] args) {
		int a = null;//에러
		Integer aa = null;//정상

		Integer i = 10;
		int ii = 10;
		
		System.out.println(i.hashCode());
		System.out.println(i.byteValue());
		System.out.println(i.floatValue());
		
		Boolean b = true;
		System.out.println(b.booleanValue());
		System.out.println(b.compareTo(b));
		
		Character c = 'a';
		char cc = 'a';
		System.out.println("CCCCCCCCC");
		System.out.println(c.charValue());
		System.out.println(c.toString());
	}

}

 

#래퍼 클래스 종류

기본타입(primitive type) 래퍼 클래스(wrapper class)
byte Byte
char Character
int Integer
float Float
double Double
boolean Boolean
long Long
short Short
String String()

 

 

#래퍼클래스를 사용해야 할 때

래퍼클래스는 NULL이 허용된다

 

기본형 int 타입으로 null을 받게되면 0이 저장되어서 설계의도와 달라질 수도 있다

 

프론트에서 서버로 데이터를 넘길때 프론트 쪽에 null이 있는데 Bean의 데이터 타입을 기본형으로 작성하면

0이 받아지게되어 설계의도와 달라진다

또한, DB에 액세스 해서 데이터를 가져올때 DB에 null이 있는데 데이터 타입이 기본형인 Bean으로 받게되면

0이 들어가서 이 또한 설계의도와 달라진다

(로직은 null검사를 하는데  0이 들어 있어서 오류가 통과되버림)

 

#예시

DB값은 null이지만 Bean에서 int로 받아버리니 자동으로 0이 들어가버려서 DB와 달라진다

 

Bean에서 Integer로 받으니 DB값 그대로 null이 출력되는 것을 알 수 있다

 

그렇기 때문에 현업에서는 현장에 따라 다르지만

DB에 액세스할 때 사용하는 Bean, model Request(받기), Response(보내기)을 할때는 래퍼클래스로 작성을 한다

 

#사용 예제

package Study;

public class WrapperBean {
	private Integer boardNumber; //게시글 번호
	private String boardId;  //게시글 id
	private String boardTitle; //게시글 제목
	private String content; //내용
	private Integer upCount; //추천 카운트
	private Integer downCount; //비추천 카운트
	private Integer reportCount; //신고 카운트
}
package Study;

public class WrapperBean {
	private int boardNumber; //게시글 번호,  기본형인 int는 null처리를 못함
	private String boardId;  //게시글 id
	private String boardTitle; //게시글 제목
	private String content; //내용
	private int upCount; //추천 카운트
	private int downCount; //비추천 카운트
	private int reportCount; //신고 카운트
}
	@GetMapping("/viewBoard")
	public String boardInsert(@RequestParam("boardNumber")Integer boardNumber) {
		String url = "";//이동할 페이지
		
		return url;
	}

 

#박싱, 언박싱

  • 박싱 : 기본타입을 래퍼 클래스로 변환하는 작업
  • 언박싱 : 래퍼 클래스를 기본타입으로 변환하는 작업
Integer num = 10;
int count = num;//언박싱, Integer > int
Integer num2 = count;//박싱, int > Integer

 

#기본타입과 래퍼클래스의 비교

//래퍼클래스
Integer I = new Integer(10);
Integer II = new Integer(10);
//기본타입
int i = 10;
int ii = 10;
		
System.out.println("기본 == 기본" + (i == ii));
System.out.println("래퍼 == 래퍼" + (I == II));
System.out.println("래퍼 == 기본" + (I == i));
System.out.println("래퍼.equals(기본)" + I.equals(i));
System.out.println("래퍼.equals(래퍼)" + I.equals(II));