Wrapper 클래스
1. 자바에서는 언어 수준에서 제공하는 기본형 데이터(8가지)를 제외한 나머지는 클래스로 정의하여 객체 단위로 처리한다. 따라서 자바에서는 이러한 기본형 데이터를 객체 단위로 처리할 수 있도록 클래스를 제공할 수 밖에 없다(클래스로 만들어 줘야한다). 이러한 클래스들을 가리켜 Wrapper 클래스라 한다.
Wrapper 라는 클래스가 있는 것이 아니라, 이런 기능을 하는 클래스들을 통칭하여 Wrapper 클래스라 부른다.
(Wrapper : 연산과정에서 기본자료형과 레퍼런스 자료형이 연산 처리할 수 있도록 기본자료형에 랩을 씌워주는 것)
2. 기본 자료형인 byte, short, int, long, float, double, char, boolean 형에 대응하는
Wrapper 클래스 Byte, Short, Integer, Long, Float, Double, Character, Boolean
및 큰 숫자들을 다루기 위한 클래스인 BigInteger과 BigDecimal 클래스를 제공한다.
java.math.BigInteger 클래스 - long을 넘어서는 큰 정수를 처리할 때 사용
java.math.BigDecimal 클래스 - double을 넘어서는 실수를 처리할 때 사용
Wrapper 클래스는 java.lang 패키지에 포함되어 있으므로 별도의 import 과정 없이 바로 사용하는 것이 가능하며 기본형과 마찬가지로 Wrapper 클래스도 내부 메소드를 통해 형 변환이 가능하고 동등 비교와 같은 연산도 가능하다. (BigInteger, BigDecimal 클래스만 java.math 패키지 주의~!)
Number 클래스 (java.lang.Number)
『java.lang.Number』 클래스(추상 클래스)는 모든 Wrapper 클래스의 부모 클래스 (슈퍼 클래스, 상위 클래스)이다. 모든 Wrapper 클래스는 Number 클래스를 extends 한다.
※ 문자열 "10" 을 정수 10 으로 바꾸는 과정
이 과정에서 Wrapping - 박싱(Boxing)과 (Unboxing) 이 일어난다. ← Wrapper 클래스가 사용된다.
문자열 "10" → String → 객체 → Object
↓
객체 → Integer → parseInt() 메소드 → 정수 10
※ 대표적인 Wrapper 클래스 - java.lang.Integer 클래스
int 기본 자료형의 Wrapper 클래스로 정수를 다루는데 필요한 상수나 메소드, 진수 변환 등에 필요한 메소드 등을 포함하고 있다.
Integer 클래스에서 자주 쓰이는 메소드 3가지
반환형 | 메소드이름(매개변수) | 설명 |
static int | parseInt(String s) | 문자열 형식으로 저장된 숫자를 정수 형태로 반환한다. |
static Integer | valueOf(int i) | int 형을 Integer 형으로 변환한다. |
byte int short long float double |
byteValue() intValue() shortValue() longValue() floatValue() doubleValue() |
객체를 해당 기본 자료형으로 형 변환한 값을 반환한다. |
오토 박싱(Auto-Boxing)과 오토 언박싱(Auto-Unboxing)
일반적으로 기본 자료형과 레퍼런스 형(클래스 자료형)은 호환되지 않으며 이 경우 발생하는 문제 해결을 위해 자바에서는 Wrapper 클래스를 제공하게 되었다.
하지만 호환하는 과정에서 기본자료형은 인스턴스 생성과정을 통해 레퍼런스 형으로, 레퍼런스 형은 메소드를 통해 기본자료형으로 변환하는 과정이 필요했는데, JDK 1.5 부터 레퍼런스 형과 기본 자료형이 다음과 같은 방식으로 자동 형 변환이 가능해져 호환과정이 단순해졌다.
int a=10, b;
Integer ob;
// ○ 오토 박싱(Auto-Boxing)
ob = a; // 실제 『ob = new Integer(a);』이다.
//-- 기본 자료형(int)이 Integer 형으로 자동 변환(오토 박싱)
// ○ 오토 언박싱(Auto-Unboxing)
b = ob; // 실제 『b = ob.intValue();』이다.
//-- Integer(객체)가 기본 자료형 int 형으로 자동 변환(오토 언박싱)
이는 JDK 1.5 이후 추가된 오토 박싱 / 오토 언박싱이라는 기능으로 인해 가능해진 것이다.
Wrapper 예제 코드 1 - 오토 박싱, 언박싱, 업캐스팅, Wrapper 클래스의 toString() 관찰
/*=====================================
■■■ 자바의 주요(중요)클래스 ■■■
- Wrapper 클래스
=====================================*/
public class Test135
{
public static void main(String[] args)
{
int a=10, b;
Integer c;
Object d;
b = a; //-- int 형 데이터(자료) → int 형 변수
c = new Integer(0);
// ※ 레퍼런스 형(참조 타입)과 기본 자료형(값 타입)은 호환되지 않는다.
b = c; //-- Integer 형 데이터(객체) → int 형 변수(오토 언박싱)
b = c.intValue(); //-- 언박싱
d = new Object();
System.out.println("d.toString() : " + d.toString());
//--==>> d.toString() : java.lang.Object@15db9742
d = new Integer(10); //-- 업 캐스팅
System.out.println("d.toString() : " + d.toString());
//--==>> d.toString() : 10
// Integer 클래스의 toString() 은 가지고 있는 int 값을 String으로 반환하는 것을 확인.
d = new Double(12.345); //-- 업 캐스팅
System.out.println("d.toString() : " + d.toString());
//--==>> d.toString() : 12.345
// Double 클래스의 toString() 은 가고 있는 double 값을 String으로 반환하는 것을 확인.
d = 10; //-- 오토 박싱 → d = new Integer(10);
/* 참고
Integer i = 10; → Integer i = new Integer(10); // 오토 박싱
Object o = i; → Object o = new Integer(10); // 업 캐스팅
Object o = 10; // 오토 박싱 + 업 캐스팅
*/
System.out.println("d.toString() : " + d.toString());
//--==>> d.toString() : 10
}
}
Wrapper 예제 코드 2 - 오토 박싱, 오토 언박싱, Wrapper 클래스의 toString, Integer 클래스를 대표로 메소드 관찰
* 처음에 언급한 Integer 메소드 표 + @ 예제 코드에 등장하는 주요 메소드
표에 나온 메소드 외에도 많은 메소드를 제공한다. api 문서를 통해 확인하기
반환형 | 메소드이름(매개변수) | 설명 |
static int | parseInt(String s) | 문자열 형식으로 저장된 숫자를 정수 형태로 반환한다. |
static int | parseInt(String n, int 진수) | 문자열 형식으로 저장된 숫자를 (2,8,16) 진수의 정수 형태로 반환한다. |
static Integer | valueOf(int i) | int 형을 Integer 형으로 변환한다. |
byte int short long float double |
byteValue() intValue() shortValue() longValue() floatValue() doubleValue() |
해당 기본 자료형으로 형 변환한 값을 반환한다. |
String | toString() | 해당 객체가 가진 int 값을 문자열로 반환한다. |
static String | toString(int n) | 정수 n을 문자열로 반환한다. |
static String | toBinaryString(int n) | 정수 n을 2진수 형태의 문자열로 반환 |
static String | toOctalString(int n) | 정수 n을 8진수 형태의 문자열로 반환 |
static String | toHexString(int n) | 정수 n을 16진수 형태의 문자열로 반환 |
/*=====================================
■■■ 자바의 주요(중요)클래스 ■■■
- Wrapper 클래스
=====================================*/
public class Test136
{
public static void main(String[] args)
{
boolean bi = true;
Boolean wrapbi = new Boolean(bi);
Boolean wBi = bi; //-- 오토 박싱
int n = 300;
Integer wrapn = new Integer(n);
int n2 = wrapn; //-- 오토 언박싱
float f = 300.3f;
Float wrapf = new Float(f);
System.out.println(wrapbi.toString());
System.out.println(wrapn.toString());
System.out.println(wrapf.toString());
//--==>> true Boolean 클래스의 toString()
// 300 Integer 클래스의 toString()
// 300.3 Float 클래스의 toString()
System.out.println(wrapbi);
System.out.println(wrapn);
System.out.println(wrapf);
//--==>> true Boolean 클래스 기반의 객체를 출력
// 300 Integer 클래스 기반의 객체를 출력
// 300.3 Float 클래스 기반의 객체를 출력
// ※ 위 결과를 통해 알 수 있는 것
// 1. Wrapper 클래스의 toString() 메소드는 값을 출력하도록 overriding(재정의) 되었다.
// 2. toString() 결과값 == 인스턴스(자체) // 출력을 통해 같음을 확인
// Integer 클래스 - parseInt() 메소드
String sn = "12"; // 숫자 형태의 문자열
int ni = Integer.parseInt(sn); // parseInt(String n)
System.out.printf("ni : %3d\n", ni); // 서식 문자 %d → 정수로 변환됨을 확인
//--==>> ni : 12
ni = Integer.parseInt("0101", 2); // parseInt(String n, 2)
System.out.printf("ni : %3d\n", ni); // 전달받은 2진수를 10진수 int로 변환됨을 확인
//--==>> ni : 5
ni = Integer.parseInt("12", 8); // parseInt(String n, 8)
System.out.printf("ni : %3d\n", ni); // 전달받은 8진수를 10진수 int로 변환됨을 확인
//--==>> ni : 10
ni = Integer.parseInt("A", 16); //parseInt(String n, 16)
System.out.printf("ni : %3d\n", ni); // 전달받은 16진수를 10진수 int로 변환됨을 확인
//--==>> ni : 10
// Integer 클래스 - to..String() 메소드
sn = Integer.toBinaryString(20); // 2진수의 문자열 형태로 반환
System.out.printf("sn : %s\n", sn); // 서식 문자 %s → 문자열로 변환됨을 확인
//--==>> sn : 10100
sn = Integer.toHexString(31); // 16진수의 문자열 형태로 반환
System.out.printf("sn : %s\n", sn); // 서식 문자 %s → 문자열로 변환됨을 확인
//--==>> sn : 1f
sn = Integer.toOctalString(31); // 8진수의 문자열 형태로 반환
System.out.printf("sn : %s\n", sn); // 서식 문자 %s → 문자열로 변환됨을 확인
//--==>> sn : 37
Integer num = new Integer(50);
System.out.println(num.toString()); // 10진수의 문자열 형태로 반환 후 출력
//--==>> 50
// Integer 클래스 - valueOf() 메소드
int n3 = 345;
Integer n4 = Integer.valueOf(n3); // Integer 형으로 박싱
System.out.println(n4);
//--==>> 345
}
}
Wrapper 예제 코드 3 - java.math.BigInteger 클래스 관찰
BigInteger 클래스는 인스턴스를 생성할 때 매개변수로 문자열 형태의 숫자(String)를 전달해야한다. 왜냐하면 BigInteger 형으로 저장할 숫자는 아주 큰 숫자이기 때문에 정수 자료형으로는 표현할 방법이 없기 때문이다.
또한 BigInteger 클래스는 연산자를 이용해서 사칙연산을 할 수 없다(숫자가 너무 커서 기본자료형으로 표현할 수 없음). 그래서 사칙연산을 수행할 수 있는 메소드를 호출하여 연산한다.
반환형 | 메소드이름(매개변수) | 설명 |
BigInteger | add(BigInteger val) | 더하기 |
BigInteger | subtract(BigInteger val) | 빼기 |
BigInteger | multiply(BigInteger val) | 곱하기 |
BigInteger | divide(BigInteger val) | 나누기 |
BigInteger | multiply(int exponent) | 지수승 |
표에 나온 메소드 외에도 많은 메소드를 제공한다. api 문서를 통해 확인하기
import java.math.BigInteger;
public class Test137
{
public static void main(String[] args)
{
//int a1 = 123456789123456789; // 에러 발생. 너무 큰 수
//long b1 = 123456789123456789123456789L; // 에러 발생. 너무 큰 수
//System.out.println(b1);
BigInteger a = new BigInteger("123456789123456789");
BigInteger b = new BigInteger("123456789123456789");
// 문자열로 전달하는 이유 : 대입 연산 전에 상수를 메모리에 저장 할 때 int 로 저장할 수 없다.
//BigInteger c = a + b;
//--==>> 에러 발생(컴파일 에러)
//System.out.println(c);
// 더하기
BigInteger c = a.add(b);
System.out.println("덧셈 결과 : " + c);
//--==>> 덧셈 결과 : 246913578246913578
// 빼기
BigInteger d = a.subtract(b);
System.out.println("뺄셈 결과 : " + d);
//--==>> 뺄셈 결과 : 0
// 곱하기
BigInteger e = a.multiply(b);
System.out.println("곱셈 결과 : " + e);
//--==>> 곱셈 결과 : 15241578780673678515622620750190521
// 나누기
BigInteger f = a.divide(b);
System.out.println("나눗셈 결과 : " + f);
//--==>> 나눗셈 결과 : 1
// 지수승
BigInteger g = new BigInteger("2");
System.out.println("2의 3승 : " + g.pow(3));
//--==>> 2의 3승 : 8
}
}
Wrapper 예제 코드 4 - java.math.BigDecimal 클래스 관찰
반환형 | 메소드이름(매개변수) | 설명 |
BigDecimal | movePointLeft(int n) | 소수점 왼쪽으로 이동 |
BigDecimal | movePointRight(int n) | 소수점 오른쪽으로 이동 |
BigDecimal | divide(BigDecimal val) | 나누기 |
BigInteger | toBigInteger() | BigInteger 객체로 변환(소수점 버리기) |
static int | ROUND_DOWN | 절삭 모드 상수 / 메소드가 아니고 상수이다. |
표에 나온 메소드 외에도 많은 메소드를 제공한다. api 문서를 통해 확인하기
/*=====================================
■■■ 자바의 주요(중요)클래스 ■■■
- Wrapper 클래스
=====================================*/
import java.math.BigDecimal;
public class Test138
{
public static void main(String[] args)
{
BigDecimal a = new BigDecimal("123456789.123456789");
// movePointLeft : 소수점을 왼쪽으로 이동
BigDecimal b = a.movePointLeft(3);
System.out.println("처리 결과 : " + b);
//--==>> 처리 결과 : 123456.789123456789
// 나눗셈 (api를 통해 두 번째 파라미터 확인 해보기. 아마 final과 static 일 것 같아)
// → 반올림 하지 않는다. → 절삭
BigDecimal c = a.divide(b, BigDecimal.ROUND_DOWN);
System.out.println("처리 결과 : " + c);
//--==>> 처리 결과 : 1000.000000000
System.out.println(BigDecimal.ROUND_DOWN);
//--==>> 1
// 굳이 1 이라고 사용하지 않고 BigDecimal.ROUND_DOWN 라고 언급하는 이유는
// 1의 의미를 전달하기 위해서이다.
// BigInteger 객체로 변환
System.out.println(a.toBigInteger());
//--==>> 123456789
}
}
Wrapper 예제 코드 5 - Number 클래스 관찰 (모든 Wrapper 클래스의 상위 클래스)
/*=====================================
■■■ 자바의 주요(중요)클래스 ■■■
- Wrapper 클래스
=====================================*/
import java.math.BigDecimal;
public class Test139
{
public static void main(String[] args)
{
byte b = 3;
int i =256;
Byte b2 = new Byte(b);
Integer i2 = new Integer(i);
System.out.println(b2);
System.out.println(i2);
// 위 출력문과 똑같이 출력되도록 main() 메소드 위에 print() 메소드 직접 정의해보기
// (힌트 : API 문서 살펴보기. 답은 main() 메소드 밑에 있음.)
print(b2);
print(i2);
// 메소드 관찰
// Byte 클래스의 byteValue() 메소드 호출 ← 언박싱
byte b3 = b2.byteValue();
// Integer 클래스의 intValue() 메소드 호출 ← 언박싱
int i3 = i2.intValue();
// check~!!!
int i4 = b2.byteValue();
byte b4 = i2.byteValue(); // Integer 클래스에도 byte로 변환해주는 byteValeu() 메소드가 있다.
//byte b5 = i2.intValue(); // 에러 발생. Int 크기를 byte 크기로 변환 시도.
//--==>> incompatible types: possible lossy conversion from int to byte
}
/* print() 메소드 정의해보기 답
// 『java.lang.Number』 클래스(추상 클래스)는 모든 Wrapper 클래스의 부모 클래스이다.
// 따라서, Wrapper 자료형을 인자로 전달하면 Number n 에 넘어오면서 업 캐스팅이 일어나게 된다.
static void print(Number n) // ← 3 (Auto-Boxing)
{
System.out.println(n);
}
*/
}
Wrapper 예제 코드 6 - Wrapper 클래스의 최대값, 최소값 그리고 Double 클래스의 무한대의 관찰
Wrapper 클래스에는 static final 상수로 MAX_VALUE, MIN_VALUE 가 있다. 그 클래스가 표현할 수 있는 범위의 최대값과 최소값이다. (다른 상수들은 api 문서 구경해보기)
실수는 정수와 다르게 0으로 나눌 수 있다. 그 결과 값은 무한대로, 예제에서는 결과값을 출력해보고 있다.
무한대의 개념 때문에 Double 클래스는 NaN (Not a Number) 상수와 무한대에 관한 메소드를 제공한다.
상수 NaN 은 숫자가 아닌 수 이므로 ==연산에서 항상 false 이다.
반환형 | 메소드이름(매개변수) | 설명 |
static boolean | isInfinite(double v) | 매개변수 v 값이 무한대인지 참/거짓을 반환 |
static boolean | isNan(double v) | 매개변수 v 값이 NaN 값인지 참/거짓을 반환 |
/*=====================================
■■■ 자바의 주요(중요)클래스 ■■■
- Wrapper 클래스
=====================================*/
public class Test140
{
public static void main(String[] args)
{
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
//--==>> 2147483647
// -2147483648
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
//--==>> 9223372036854775807
// -9223372036854775808
System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
//--==>> 1.7976931348623157E308
// 4.9E-324
System.out.println();
System.out.println("1 : " + 3.0/0);
System.out.println("2 : " + -3.0/0);
//--==>> 1 : Infinity
// 2 : -Infinity
System.out.println("3 : " + (3.0/0 == 3.0/0));
System.out.println("4 : " + (3.0/0 == -3.0/0));
//--==>> 3 : true
// 4 : false
// 『Double.isInfinite()』
// ※ 참고
// 메소드 이름이 to~~~() 라는 메소드는 주로 타입을 변환해서 반환해준다.
// 메소드 이름이 is~~~() 라는 메소드는 주로 참 / 거짓을 boolean 형으로 반환해준다.
System.out.println("5 : " + Double.isInfinite(3.0/0));
System.out.println("6 : " + Double.isInfinite(-3.0/0));
//--==>> 5 : true
// 6 : true
// NaN (Not a Number) 상수
System.out.println("7 : " + (3.0/0 + -3.0/0));
System.out.println("8 : " + (0.0/0));
//--==>> 7 : NaN
// 8 : NaN
System.out.println("9 : " + (0.0/0 == 0.0/0)); // NaN 비교
System.out.println("10: " + (0.0/0 != 0.0/0));
//--==>> 9 : false
// 10: true
// ※ NaN(Not a Number) 값과 임의의 수를 『==』 연산자를 통해 비교 연산을 수행하게 되면
// 결과는 언제나 『false』를 반환한다.
// 『Double.isNaN()』
System.out.println("11: " + Double.isNaN(0.0/0));
System.out.println("12: " + Double.isNaN(1.1+2.2));
//--==>> 11: true
// 12: false
}
}
'자바 풀스택 과정 수업 정리 > 자바' 카테고리의 다른 글
자바 18-1 (2020.08.27) : 자바의 주요(중요) 클래스 - StringBuffer, StringTokenizer (0) | 2020.09.13 |
---|---|
자바 17-3 (2020.08.26) : 자바의 주요(중요) 클래스 - String (0) | 2020.09.11 |
자바 17-1 (2020.08.26) : package, import, Object, 자바의 주요(중요) 클래스 - Object (0) | 2020.09.06 |
자바 16-3 (2020.08.25) : 중첩클래스(중첩 내부클래스, 내부클래스, 로컬클래스, 익명클래스) (0) | 2020.09.06 |
자바 16-2 (2020.08.25) : 인터페이스 (0) | 2020.09.05 |
최근댓글