혜야의 코딩스토리

[자바의 정석] java.rang패키지와 유용한 클래스/ 날짜와 시간 & 형식화 본문

꿈 : 멋진 개발자 🧸/자바의 정석

[자바의 정석] java.rang패키지와 유용한 클래스/ 날짜와 시간 & 형식화

hyeya_ 2022. 5. 23. 20:51

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를 생성할 때는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해주는 것이 좋다.

-StringBufferString과 달리 내용 변경이 가능하다.

-append( )는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환

-StringBufferequals( )가 오버라이딩 되어있지 않다. (주소비교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

-DateCalendar의 단점을 개선한 새로운 클래스들을 제공(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); //2020831일로 설정

 

date.add(Calendar.DATE,1) //날짜(DATE)1을 더한다. -> 202091

date.add(Calendar.MONTH,-8) //(MONTH)에서 8을 뺀다.  -> 202011

-roll( )은 특정필드의 값을 증가 또는 감소(다른 필드에 영향X)

date.set(2020, 7, 31); //2020831일로 설정

//add( )와 달리 roll( )은 다른 필드에 영향을 미치지 않는다.

date.roll(Calendar.DATE, 1); //날짜(DATE)1을 더한다. -> 202081

date.roll(Calendar.MONTH,-8); //(MONTH)에서 8을 다. ->202012 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( )는 콤마가 포함된 문자열을 숫자로 변환 못함