목차
- Wrapper 클래스
1-1. 박싱(Boxing)
1-2. 언박싱(UnBoxing)
1-3. 파싱(parsing)
1-4. valueOf().toString(); - Date 클래스
2-1. 기본 생성자 Date()
2-2. Date(long date) - Calendar 클래스
3-1. getInstance()
3-2. 후손클래스 GregorianCalendar
3-3. get(Calendar.상수필드)
✅ Wrapper 클래스 통해 파싱(parsing) 처리할 수 있도록 하자!
1. Wrapper 클래스
- 8가지 기본자료형의 데이터들을 객체로 다뤄야 할 때 이를 인스턴스화 해주는 클래스를 래퍼클래스(Wrapper 클래스)라고 한다. 이름처럼 다른 무언가로 감싸서 객체로서 기능하게 만든다고 볼 수 있다.
- 기본자료형 이름들을 각각 대문자로 시작한다는 점이 있다. 그리고 char → Character, int → Integer처럼 풀네임을 사용한다.
Primitive Data Type | Wrapper Class |
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
- 대표로 int와 Integer를 예로 들어 살펴보자. 다른 기본자료형들도 이와 같이 동작한다고 보면 된다.
1-1. 박싱(Boxing)
- 기본타입을 → 인스턴스화하여 Wrapper 클래스의 인스턴스로 만든다.
A. 생성자 이용
deprecated since version 9
int intValue = 20;
Integer boxingNumberA = newInteger(intValue);
Integer boxingNumberAA = newInteger(20);
Integer 가운데에 취소선처럼 줄이 생긴다. 9버전부터 사용하지 않게 된 기능이기 때문이다.
(intValue == boxingNumberAA) → true *기본타입과 값 비교*
- 기본타입과 래퍼클래스타입은 == 연산으로 비교 가능하다. 이때 필드값을 비교하여 true라는 결과를 낸다.
(boxingNumberA == boxingNumberAA) → false *래퍼클래스타입간 주소값 비교*
- new 연산자를 썼기 때문에 == 연산하게 되면 주소값간 비교가 발생한다. 따라서 생성자 이용해 만들어진 인스턴스간에는 == 로 비교하지 못한다.
boxingNumberA.equals(boxingNumberAA)) → true *래퍼클래스타입간 값 비교*
- 이때는 equals() 메소드로 값을 비교한다. Integer.class에서 해당 메소드를 오버라이딩 해두었기에 필드값 출력이 가능한 것이다.
B. static 메소드 valueOf() 이용
Integer boxingNumberB = Integer.valueOf(intValue);
- 인스턴스와 무관하게 동작하는 static 메소드 valueOf()를 통해 박싱할 수도 있다.
- static 메소드를 호출하는 과정이기에 클래스명.메소드명으로 작성한다.
C. 오토 박싱(Auto Boxing)
Integer boxingNumberC = intValue;
Integer boxingNumberCC = 20;
- JDK 1.5버전부터 자바 컴파일러가 박싱이 필요한 상황을 자동 처리하고 있다. 이처럼 자동화 된 박싱을 오토 박싱이라고 일컫는다.
- 선언할 때는 객체타입 변수명 = 기본자료형데이터명; 형태를 쓴다.
(intValue == boxingNumberCC) → true *기본타입과 값 비교*
(boxingNumberC == boxingNumberCC) → true *오토박싱한 래퍼클래스타입간 값 비교*
(boxingNumberC.equals(boxingNumberCC)) → true ==과 equals 결과 같다!
- 오토 박싱을 이용한 때는 ==로 값 비교 가능하다. 단, 비교 대상이 new 연산자 사용한 생성자 박싱인 경우만 반드시 equals() 메소드를 통해야 한다.
1-2. 언박싱(UnBoxing)
- 박싱과 반대로 Wrapper 클래스 타입의 인스턴스를 → 기본 타입으로 변경한다.
A. intValue() 이용
int unboxingNumberA = boxingNumberA.intValue();
- Integer.class의 일반 메소드이다.
B. 오토 언박싱(Auto UnBoxing)
Integer boxingNumberC = intValue; *오토 박싱*
int unBoxingNumberB = boxingNumberC;
- 앞서 오토 박싱 된 변수를 가져다 오토 언박싱 한 예시이다. 기본타입 변수명 = 박싱된데이터명; 형태로 쓴다.
1-3. 파싱(parsing)
- 파싱(parsing)이란 문자열 String 값을 → 기본자료형 값으로 변경하는 것이다.
❗ public static 래퍼클래스명 parse래퍼클래스명(String s)
❗ 호출 시 클래스명.static메소드명();
- 기본자료형 8가지 중 문자형 char만 제외하고, 모두 각각의 Wrapper 클래스에 파싱(parsing)용 static 메소드를 가지고 있다.
정수형
Byte.parseByte("1");
Short.parseShort("2");
Integer.parseInt("4");
Long.parseLong("8");
- 정수형 기본자료형으로 다룰 때
숫자가 아닌 값을 넣으면 출력시 java.lang.NumberFormatException 런타임 에러가 난다. - 정수형에 8.0처럼
실수값을 적으면 이 역시 java.lang.NumberFormatException 런타임 에러에 해당한다.
실수형
Float.parseFloat("4.0");
Double.parseDouble("8.0");
- 실수형에는 4처럼 소수점자리 없는 정수값을 적어도 정상 실행된다.
논리형
Boolean.parseBoolean("true");
- 논리형이 다룰 수 있는 true, false 값만 취급한다.
- hello 등 그밖에 다른 값을 넣으면 false가 반환된다.
문자형
"abc".charAt(0);
- 문자형 Character 클래스는 파싱(parsing) 기능을 제공하지 않는다.
1-4. valueOf().toString();
- 파싱(pasing)의 반대되는 기능들을 한다. 즉, 이번에는 기본자료형 값을 → 문자열 String으로 변경한다.
래퍼클래스명.valueOf().toString()
- valueOf()는 기본자료형 값을 Wrapper 클래스 타입으로 변환시키는 메소드이다.
- toString()는 필드값을 문자열로 반환하는 메소드이다.
Byte.valueOf((byte)1).toString();
Short.valueOf((short)2).toString();
Integer.valueOf((int)4).toString();
Long.valueOf((long)8L).toString();
Float.valueOf((float)4.0f).toString();
Double.valueOf((double)8.0).toString();
Boolean.valueOf(true).toString();
Character.valueOf('a').toString();
- 각각의 Wrapper 클래스가 toString() 메소드를 오버라이딩 해두었기 때문에 명시된 필드값들이 출력될 수 있는 것이다.
- 그러나 위 과정은 따지고 보면 valueOf로 인스턴스화 + toString()으로 문자열화 두 단계로 나눠 진행되고 있다.
- 물론 Wrapper 클래스가 제공하는 기능들을 활용함에 있어서는 위 방법이 정석적이다.
String.valueOf()
String.valueOf(true);
- String 클래스의 valueOf 메소드를 사용해 조금 더 편리함을 추구할 수도 있다.
문자열 합치기 + ""
123 + "";
- 문자열 합치기를 이용해 String으로 변환할 수도 있다.
2. Date 클래스
- Date 클래스는 자바 1버전에서부터 사용돼 왔기 때문에, 생성자 2개만 남긴 채 많은 기능들이 deprecated 되었다. 그 내역들은 자바 API 문서 통해 조회할 수 있다: Date(), Date(long date)
A. import 선언
import java.util.Date;
B. 클래스 풀네임 작성
java.sql.Date | java.util.Date |
Date 클래스는 sql에 하나, util에 하나가 각각 따로 존재한다. 그렇기에 한 클래스에서 두 개의 타입을 전부 사용하게 되면 알맞게 import 선언을 했더라도 사용하는 타입이 어느 패키지에 있는 Date 클래스인지에 대한 모호성이 발생한다. 이를 해소하기 위해 Date 클래스 사용 시에는 풀네임을 작성해야 한다. |
2-1. 기본 생성자 Date()
java.util.Date today = new java.util.Date();
- 기본 생성자로 인스턴스를 생성하면 운영체제의 날짜/시간 정보를 이용해 인스턴스를 만들게 된다.
- toString() 메소드가 오버라이딩 되어 있기에 이처럼 필드값을 출력해 볼 수 있는 것이다.
- 이때 today를 출력하면 실행 시점의 값이 나온다: Sat Jan 08 00:52:31 GMT+09:00 2022
2-2. Date(long date)
today.getTime();
- getTime() 메소드는1970년 1월 1일 0시 0분 0초 이후 지나온 시간을 millisecond(1/1000초)로 계산해서 long 타입으로 반환한다.
Date time = new Date(1641519117758L);
System.out.println(time);
=============================
Fri Jan 07 10:31:57 GMT+09:00 2022
- geTime() 통해 얻은 long 타입의 millisecond 값은 기록된 해당 시점을 가리키고 있음을 알 수 있다.
3. Calendar 클래스
public abstract class Calendar...
- java.util.Calendar 클래스는 자바 API 문서에도 명시되어있듯 추상클래스에 해당한다.
- 따라서
Calendar calendar = new Calendar처럼은 사용할 수가 없고, 인스턴스 생성 또한 불가한 것이다. - 이러한 Calendar 클래스를 이용해 인스턴스를 생성하는 방법에는 두 가지가 있다.
3-1. getInstance()
Calendar calendar = Calendar.getInstance();
- Calendar.class 소속 static 메소드 getInstance()를 이용해서 인스턴스를 반환 받는다.
- 이때는 운영체제의 날짜/시간 정보를 이용해서 인스턴스를 생성하게 된다.
java.util.GregorianCalendar[time=1641571965702,areFieldsSet=true......
- 인스턴스 타입이 후손클래스인 GregorianCalendar 타입으로 생성됨을 알 수 있다.
- toString()이 오버라이딩 되어 있어 모든 필드값을 확인할 수 있는 것이다.
❗ Calendar.getInstance(); == new GregorianCalendar();
두 방법 다 GregorianCalendar 타입으로 운영체제의 실행 시 날짜/시간을 반환한다.
3-2. 후손클래스 GregorianCalendar
A. 특정 날짜 시간/정보 인스턴스 생성
Calendar gregorianCalendar = new GregorianCalendar();
========================================
java.util.GregorianCalendar[time=1641571965717,areFieldsSet=true......
- 기본 생성자 이용할 경우 앞선 getInstance()와 같이 운영체제의 현재 날짜/시간을 나타낸다.
int year = 2022;
int month = 0; *month 값은 0~11월로 사용*
int dayOfMonth = 1;
int hour = 12;
int min = 34;
int second = 0;
Calendar gregorianCalendar = new GregorianCalendar(year, month, dayOfMonth, hour, min, second);
========================================
java.util.GregorianCalendar[time=?,areFieldsSet=false......
- 매개변수 있는 생성자로 특정 년, 월, 일, 시, 분, 초 정보를 변수에 담아 출력할 수도 있다.
- 이때도 역시 GregorianCalendar 타입으로 반환되는 값이다. 여기서 입력한 시점에 대해서만 출력해주고, 나머지는 물음표(?)안 false 취급된 것을 볼 수 있다.
B. 특정 일자 기준 Date 타입 인스턴스 생성
gregorianCalendar.getTimeInMills();
new Date(new GregorianCalendar(year, month, dayOfMonth, hour, min, second).getTimeInMillis()
- 설정한 데이터에 대해 millisecond를 long형으로 반환해주는 메소드를 적용하는 방법이다.
3-3. get(Calendar.상수필드)
public static final int YEAR = 1;
Calendar.YEAR
- Calendar.class에 상수 필드로서 넘버링 된 정보들이 있다. 이들을 인자로 삼아 필드값으로 반환해볼 수 있는 것이다.
- 이때 생성된 인스턴스의 필드값들을 Calendar 클래스의 get() 메소드를 이용해 반환 받을 수 있다.
gregorianCalendar.get(Calendar.YEAR)
gregorianCalendar.get(Calendar.MONTH) *0~11로 표현한다*
gregorianCalendar.get(Calendar.DAY_OF_WEEK) *일(1), 월(2)...토(7)*
gregorianCalendar.get(Calendar.AM_PM) *0은 오전, 1인 오후*
gregorianCalendar.get(Calendar.HOUR_OF_DAY) *24시간 체계*
gregorianCalendar.get(Calendar.HOUR) *12시간 체계*
'Java' 카테고리의 다른 글
[자바의 정석] Ch 6. OOP I 연습문제 풀이 (0) | 2022.01.09 |
---|---|
[JAVA] 11. 제네릭 클래스 | 와일드카드 (0) | 2022.01.08 |
[JAVA] 10-1. API | Object | String | StringBuilder (0) | 2022.01.06 |
[JAVA/수업 과제 practice] 다형성 Lv. 1~2 (0) | 2022.01.06 |
[JAVA/수업 과제 practice] 상속 Lv. 1~2 (0) | 2022.01.06 |