자바의정석 ch9

soso·2023년 2월 20일
0
post-thumbnail

Chapter9 java.lang패키지와 유용한 클래스

Object클래스

java.lang패키지는 자바프로그래밍에 가장 기본이 되는 클래스들을 포함하고있다.
java.lang패키지의 클래스들은 import문 없이도 사용 할 수 있게 되어 있다.

Object클래스
Object클래스는 모든 클래스의 최고 조상이기 때문에 Object클래스의 멤버들은 모든 클래스에서 바로 사용가능하다.

Object클래스는 멤버변수는 없고 오직 11개의 메서드만 가지고 있다.
이 메서들은 모두 인스턴스가 가져야 할 기본적인 것들이다.

Object클래스의 메서드 -equals()

매개변수로 객체의 참조변수를 받아 비교하여 그 결과를 boolean값으로 알려 주는 역활을 한다.

public boolean equals(Object obj){
return (this == obj);
}
두 객체의 같고 다름을 참조변수의 값으로 판단한다.
서로 다른 두 객체를 equals메서드로 비교하면 항상 false를 결과를 얻게된다.

equals()의 오버라이딩

equals메서드는 두 참조 변수에 저장된 값(주소값)이 같은지를 판단하는 기능밖에 할 수 없다는 것을 알 수 있다.

equals메서드로 Value인스턴스가 가지고 있는 value값을 비교하도록 하려면 Value클래스에서 equals메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 변경하면 된다.

Object클래스의 메서드 -hashCode()

해싱(hashing)기법에 사용되는 '해시함수(hash functom)를 구현한 것이다.
해시함수는 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드(hash code)를 반환한다.

Object클래스에 정의된 hashCode메서드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 서로 다 른 두 객체는 결코 같은 해시코드를 가질 수 없다.
단, 64 bit JVM에서는 주소가 64 bit이므로 주소를 해시코드(32 bit)로 변환하면 중복된 값이 나올 수도 있다.

Object클래스의 메서드 -toString()

인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한것이다.

toString()의 오버라이딩

tostring()은 일반적으로 인스턴스나 클래스에 대한 정보 또는 인스턴스 변수들의 값을 문자열로 변환하여 반환하도록 오버라이딩되는 것이 보통이다.

String클래스

String클래스는 문자열을 저장하고 이름을 다루는데 필요한 메서드를 함께 제공한다.

변경 불가능한(immutable)클래스
String클래스에는 문자열을 저장하기 위해 문자형 배열 참조변수(char[]) value를 인스턴스 변수로 정의해놓고 있다.

인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수(value)에 문자형 배열(char[])로 저장되는 것이다.

덧셈연산자'+'를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리공간을 차지하게 되므로 가능한 한 결합횟수를 줄이는 것이 좋다.

문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 StringBuffer클래스를 사용하는 것이 좋다.

StringBuffer인스턴스에 저장된 문자열은 변경이 가능하므로 문자열을 다루는 것이 가능하다.

문자열(String)의 비교

문자열을 만들 때 두가지 방법,
문자열 리터럴을 지정하는 방법과 String클래스의 생성자룰 사용해서 만드는 방법이있다.

 String str1 = "abc"	// 문자열 리터럴 "abc"의 주소가 str1에 저장됨
 String str2 = "abc"	// 문자열 리터럴 "abc"의 주소가 str2에 저
 String str3 = new String("abc");	// 새로운 String인스턴스를 생성
 String str4 = new String("abc");	// 새로운 String인스턴스를 생성

String클래스의 생성자를 이용한 경우에는 new연산자에 의해서 메모리 할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성된다.

문자열 리터럴(String리터럴)

자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다.
이 때 같은 내용의 문자열 리터럴은 한번만 저장된다.
문자열 리터럴 String인스턴스이고, 한번 생성하면 내용을 변경할 수 없으니 하나의 인스턴스를 공유하면 되기 때문이다.

빈 문자열(empty string)

길이가 0인 배열이 존재할수 있다.
char형 배열도 길이가 0인 배열을 생성할 수 있고, 이 배열을 내부적으로 가지고 있는 문자열이 바로 빈 문자열이다.

char[] chArr = new char[0]; // 길이가 0인 char배열
int[] iArr ={}; // 길이가 0인 int배열

String s = null;  → String s =""; //빈 문자열로 초기화
char c ='\u0000'; → char c ='';   // 공백으로 초기화

String클래스의 생정자와 메서드

String클래스 내에 정의된 생성자와 메서드의 목록이다.
전체목록은 아니고 자주 사용될만한 것들이다.

join()과 StringJoiner

join()은 여러문자열 사이에 구분자를 넣어서 결합한다.

String animals ="dog, cat, bear";
String[] arr = animals.split(","); // 문자열을 ','를 구분자로 나워서 배열에 저장
String str = String.join("_", arr); //배열의 문자열을 '-'로 구분해서 결합
System.out.printIn(str); //dog-cat-bear

문자열과 기본형 간의 변환

숫자를 문자열로 바꾸는 방법
int i = 100;
String str1 = i+ ""; //100을 "100"으로 변환하는 방법1
String str2 = String. valueof(1); // 100을 "100"으로 변환하는 방법2

문자열을 숫자로 바꾸는 방법
int i = Integer .parseInt ("100"); //"100"을 100으로 변환하는 방법1
int i2 = Integer .valuef("100"); //"100"을 100으로 변환하는 방법2
Integer i2 = Integer. valueOf ("100"); //원래는 반환 타입이 Integer

StringBuffer클래스

String처럼 문자형 배열(char[])을 내부적으로 가지고 있다.
그러나 String과 달리 내용을 변경할 수 있다.(mutable)

StringBuffer의 생성자

배열은 길이 변경 불가한다.
공간이 부족하면 새로운 배열을 생성해야 한다.
StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다.

StringBuffer의 변경

StringBuffer는 String과 달리 내용 변경이 가능하다.
append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환한다.

stringBuffer sb2 = new StringBuffer("abc");
sb.append("123");
sb.append("ZZ");

    ↓↓↓↓
    
stringBuffer sb2 = new StringBuffer("abc");   
sb.append("123").append("ZZ");

StringBuffer의 비교

StringBuffer는 equals()가 오버라이딩 되어있지 않다.(주소비교를 비교한다.)
StringBuffer를 String으로 변환 후에 equals()로 비교해야 한다.

String s = sb.toString();	// StringBuffer를 String으로 변환
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true

StringBuffer의 생성자와 메서드

StringBuffer클래스 역시 문자열을 다루기 위한 것이기 때문에 String클래스와 유사한 메서드를 많이 가지고 있다.
StringBuffer는 추가, 변경, 삭제와 같이 저장된 내용을 변경할 수 있는 메서드들이 추가로 제공된다.

StringBuilder

StringBuffer는 멀티쓰레드에 안전(thread-safe) 하도록 동기화되어있다.
멀티 쓰레드 프로그램이 아닌 경우, 동기화 불필요한 성능저하시킨다.
이럴땐 StringBuffer대신 StringBuilder응 사용하면 선능 향상시킨다.

StringBuffer sb;
sb = new StringBuffer();
sb.append("abc");

    ↓↓↓↓
StringBuilder sb; 
sb = new StringBuilder();
sb.append("abc");

Math클래스

수학계산 관련 static메서드의 집합이다
올림, 버림, 반올림
소수점 n번째 자리에서 반올림한 값을 얻기 위해서는 round()를 사용해야 하는데, 이 메서드 는 항상 소수점 첫째자리에서 반올림을 해서 정수값(Iong)을 결과로 돌려준다.

1. 원래 값에 100을 곱한다.
		90.7552 * 100 → 9075.52
2. 위의 결과에 Math.round()를 사용한다.
		Math.round(9075.52) → 9076
3. 위의 결과를 다시 100.0으로 나눈다.
		9076 / 100.0 → 90.76
        9075 / 100 → 90

Math의 클래스

래퍼(wrapper) 클래스

기본형을 감싸는클래스 이다
8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스이다.

Number클래스

모든 숫자 레퍼 클래스의 조상이다.Number클래스 자손으로 BigInteger와 BigDecimal 등이 있는데, BigInteger는 long으로도 다룰 수 없는 큰 범위의 정수를, BigDecimal은 double로도 다룰 수 없는 큰 범 위의 부동 소수점수를 처리하기 위한 것으로 연산자의 역할을 대신하는 다양한 메서드를 제공한다.

문자열을 숫자로 변환하기

문자열을 숫자로 변환하는 다양한 방법이 있다.
문자열을 숫자로 변환할 때는 아래의 방법중 하나를 선택해서 사용하면 된다.

int i = new Integer("100").intValue(); // floatValue(), longValue(), ...
int i2 = new Integer.parseInt("100"); // 주로 많이 사용하는 방법
Integer i3 = Integer.ValueOf("100");

아래의 표는 래퍼 클래스의 '타입. parse타입(String s) 형식의 메서드와 '타입. ralueof)메 서드를 정리한 것이다. 둘 다 문자를 숫자로 바꿔주는 일을 하지만, 전자는 반환값이 기본형(prinitive type)이고 후자는 반환값이 래퍼 클래스 타입이라는 차이가 있다.

오토박싱과 언박싱

JDK1.5이전에는 기본형과 참조형 간의 연산이 불가능했다.
그러나 이제는 기본형과 참조형 간의 덧셈이 가능하다.
컴파일러가 자동으로 변환하는 코드를 넣어주기 때문이다.

이 외에도 내부적으로 객체 배열을 가지고 있는 Vector클래스나 ArragList클래스에 기본형 값을 저장해야할 때나 형변환이 필요할 때도 컴파일러가 자동적으로 코드를 추가해 준다.
기본형 값을 래퍼 클래스의 객체로 자동 변환해주는 것을 '오토박싱(autoboxing)'이라고 하고, 반대로 변환하는 것을 '언박싱(unboxing)이라고 한다.

profile
오늘의 기록

0개의 댓글