혜야의 코딩스토리
[자바의 정석] java.rang패키지와 유용한 클래스/ 날짜와 시간 & 형식화 본문
Ch9. java.rang패키지와 유용한 클래스
[object클래스와 그 메서드인 equals( )]
-Objcet 클래스 : 모든 클래스의 최고 조상, 오직 11개의 메서드만 가짐
-finalize( ) : 객체가 소멸될 때 가비지 커렉터에 의해 자동 호출(거의 사용X)
-getClass : 객체 자신의 클래스 정보(설계도 객체)를 담고 있는 Class인스턴스를 반환함
-equals( ) : 객체 자신과 주어진 객체의 참조변수 값(주소 값) 비교
→ 서로 다른 두 객체는 항상 주소 값이 다름
-equals( )오버라이딩 : 두 객체의 인스턴스 변수의 값을 비교하기 위해서는 오버라이딩 해줘야한다.
→ 오버라이딩 할 떄 instanceof로 참조변수의 형변환 여부를 반드시 확인해야한다.
[hashCode( )]
-객체의 해시코드를 반환하는 메서드
-Object클래스의 hashCode( )는 객체의 주소를 int로 변환해서 반환
-equals( )를 오버라이딩하면, hashCode( )도 오버라이딩해야 한다.
→ equals( )의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
[toString( ), toString( )의 오버라이딩]
-toString( ) : 객체를 문자열으로 변환하기 위한 메서드
[String클래스, 문자열 비교]
-String클래스 : 문자열을 다루기 위한 클래스
-String클래스 = 데이터(str[ ]) + 메서드(문자열 관련)
-내용을 변경할 수 없는 불변(immutablc)클래스
-문자열 결합 시 기존의 값이 바뀌는 것이 아니라, 새로운 문자열이 생성되고
새로운 문자열의 주소값으로 바뀌는 것
→ 문자열의 결합이 잦으면 성능이 저하됨.
→ 내용변경이 가능한 String클래스 메서드인 StringBuffer 사용 권장
String str1 = "abc";
String str3 = "abc";
→ 같은 값의 객체를 같이 바라본다.
String str3 = new String("abc");
String str4 = new String("abc");
→ 각각의 객체를 생성한다
-문자열 리터럴은 프로그램 실행 시 자동으로 생성됨. (constant poll에 저장)
-같은 내용의 문자열 리터럴은 하나만 만들어짐.
-문자열을 비교할 때는 equals() 사용해야 함
==(등가 비교연산자)는 두 문자열의 주소를 비교하는 것
equals()를 사용해야 두 문자열의 값을 비교할 수 있음
-new 연산자를 사용하여 문자열을 생성할 경우,
그 내용이 같더라도 새로운 문자열로 생성됨. (주소가 다름)
[빈 문자열]
-빈 문자열은 내용이 없는 문자열.
-모든 타입의 배열은 길이(크기)가 0으로 생성 가능.
-String의 기본값은 null, char의 기본값은 '\u0000' 이지만,
초기화할 때는 기본값보다는 빈 문자(열)로 초기화하는 것이 더 좋음.
String str = “ “;
char ch = ‘ ‘;
[String클래스의 생성자와 메서드]
[join( )과 StringJoiner]
-join( )은 여러 문자열 사이에 구분자를 넣어서 결합한다.
(많은 문자열을 결합할 때 사용하면 좋다)
[문자열과 기본형 간의 변환]
-숫자를 문자열로 바꾸는 방법
int I = 100;
String str1 = i + “”; //100을 “100”으로 변환하는 방법1
String str2 = String.valueOf(i); //100을 “100”으로 변환하는 방법2
-문자열을 숫자로 바꾸는 방법
int i = Integer.parseInt(“100”); //”100”을 100으로 변환하는 방법1
int i2 = valueOf(“100”); //”100”을 100으로 변환하는 방법2
Integer i2 = Integer.valueOf(“100”); //원래는 반환 타입이 Integer(참조형)
[StringBuffer클래스]-동기화O
-String처럼 문자형 배열(char[ ])을 내부적으로 가지고 있다.
-그러나, String과 달리 내용을 변경할 수 있다. (mutable)
[StringBuffer메서드]
-append( ) : 끝에 문자열 추가함.
-delete( ) : 삭제
-insert( ) : 삽입
[StringBuffer의 생성자]
-배열은 길이 변경불가, 공간이 부족하면 새로운 배열을 생성해야 한다.
-StringBuffer를 생성할 때는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해주는 것이 좋다.
-StringBuffer는 String과 달리 내용 변경이 가능하다.
-append( )는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환
-StringBuffer는 equals( )가 오버라이딩 되어있지 않다. (주소비교O, 내용비교X)
→ StringBufferdmf 는 String으로 변환 후에 equals( )로 비교해야 한다.
[StringBufer클래스의 생성자와 메서드]
[StringBuilder 클래스]-동기화X
-StringBuffer는 동기화(데이터 보호)되어 있다. (멀티 쓰레드에 안전(thread-safe))
-멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능 저하
->이럴 땐 StringBuffer대신 StringBuilder를 사용하면 성능 향상
[래퍼(Wrapper)클래스]
-8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스
Integer (래퍼 클래스) -> int(기본형)로 변환할 때 intValue( )메서드 사용
Long(래퍼 클래스) -> long(기본형)으로 변환할 때 longValue ( )메서드 사용
래퍼클래스 -> 문자열 변환할 때 toString( )메서드 활용
[Number 클래스]
-모든 숫자 래퍼 클래스의 조상
[오토박싱 & 언박싱]
기본형과 참조형 간의 자동 형변환
int -> Integer (오토박싱) : 기본형의 값을 객체(참조형)로 자동 형변환
Integer -> int (언박싱) :객체(참조형)를 기본형의 값으로 자동 형변환
컴파일 전의 코드 | 컴파일 후의 코드 |
int i = 5; Integer iObj = new Integer(7); int sum = I + iObj; |
int i = 5; Integer iObj = new Integer(7); int sum = i + iObj.intValue( ); 기본형으로 변환(언박싱) |
ch10. 날짜와 시간 & 형식화
[날짜와 시간]
*java.util.Date
-날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK1.0)
-Date의 메서드는 거의 deprecated(앞으로 사용X)되었지만, 여전히 쓰이고 있다.
*java.util.Calendar -> 자바의정석 기초편
-Date클래스를 개선한 새로운 클래스(JDK1.1). 여전히 단점이 존재
*java.time패키지 -> 자바의정석3판
-Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공(JDK1.8)
[Calendar클래스]
-추상 클래스이므로 getInstance( )메서드를 통해 구현된 객체를 얻어야 한다. //변경에 유리
(추상 클래스는 객체를 생성할 수 없으니까)
GregorianCalendar cal = new GregorianCalendar( ); //구체적
Calendar cal = Calendar.getInstance( ); //추상적
Calendar : 추상클래스
cal : 부모의 참조변수
getInstance( )메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.
[get( )메서드]
[add( ),roll( )메서드]
-add( )는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향)
Calendar date = Calendar.getInstance( );
date.clear( ); //객체 생성 후 모든 필드를 초기화 해주기
date.set(2020, 7, 31); //2020년 8월 31일로 설정
date.add(Calendar.DATE,1) //날짜(DATE)에 1을 더한다. -> 2020년 9월 1일
date.add(Calendar.MONTH,-8) //월(MONTH)에서 8을 뺀다. -> 2020년 1월 1일
-roll( )은 특정필드의 값을 증가 또는 감소(다른 필드에 영향X)
date.set(2020, 7, 31); //2020년 8월 31일로 설정
//add( )와 달리 roll( )은 다른 필드에 영향을 미치지 않는다.
date.roll(Calendar.DATE, 1); //날짜(DATE)에 1을 더한다. -> 2020년 8월 1일
date.roll(Calendar.MONTH,-8); //월(MONTH)에서 8을 다. ->2020년 12월 1일
[set( )메서드]
-set( ) 메서드로 날짜와 시간 지정 가능
-시분초만 따로 지정하려면 따로따로 해주어야 함
-날짜간 차이를 계산하기 위해서는 getTimeInMillis( ) 메서드를 사용하여
양쪽을 밀리세컨드(1/1000 초)로 변환하여 계산해야 함
→ 1일 = 24(시간) * 60(분) * 60(초)
[clear( )메서드]
clear( )는 Calendar객체의 모든 필드를 초기화
clear( ) 메서드는 날짜를 1970년 1월 1일 00시 00분 00초로 초기화
특정 필드만 초기화해줄 수도 있음
현재 시간으로 무언가 할 게 아니라면 Calendar 객체 생성 후 꼭 clear ( ) 해주어야 함
→ 더 정확한 계산을 위해.
[형식화 클래스]
java.text패키지의 DecimalFormat, SimpleDateFormat
-숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자,날짜→형식 문자열)
-형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열→숫자,날짜)
[DecimalFormat클래스]
-숫자(10진수)를 형식화할 때 사용(숫자→형식 문자열)
double number = 1234567.89;
DecimalFormat df = new DecimalFormat(“#.#E0”); //result = “1.2E6”
-특정 형식의 문자열을 숫자로 변환할 때도 사용(형식 문자열→숫자)
DecimalFormat df = new DecimalFormat(“#,###.##”);
Number num = df.parse(“1,234,567.89”); //Number : 모든 숫자 래퍼 클래스의 최고 조상
double d = num.doubleValue( ); //1234567.89
[참고] Integer.parseInt( )는 콤마가 포함된 문자열을 숫자로 변환 못함
'꿈 : 멋진 개발자 🧸 > 자바의 정석' 카테고리의 다른 글
[자바의 정석] 지네릭스 (0) | 2022.05.23 |
---|---|
[자바의 정석] 컬레션 프레임웍(collections framework) (0) | 2022.05.23 |
[자바의 정석] 예외처리 (0) | 2022.05.14 |
[자바의 정석] 객체지향개념 수기 정리 :) (2) | 2022.05.08 |
추상 클래스 & 인터페이스 (0) | 2022.05.06 |