티스토리 뷰
Object클래스의 메서드
equals(Object obj)
두 객체의 같고 다름을 참조변수의 값으로 비교하는 메서드
서로 다른 두 객체를 비교하면 return false
String클래스에서는 equals메서드를 오버라이딩 → 문자열 값 비교 결과 반환
hashCode()
객체의 주소값을 이용해서 해시코드를 만들어 반환
다른 객체는 같은 해시코드를 가질 수 없음
String클래스에서는 hashCode메서드를 오버라이딩 → 문자열이 같으면 동일 해쉬코드 반환
clone()
객체에 저장된 값을 복제
→ 기본형이 아닌 경우 주소값을 복제하므로 원본가 복제본이 동일
→ 얕은복사(shallow copy)
c.f. 원본이 참조하는 객체까지 복제
→ 깊은복사(deep copy)
String클래스
immutable → 문자열 결합 시, 새로운 String 인스턴스 생성
// final → 다른 클래스에서 상속받을 수 없음
public final class String implements Serializable, Comparable {
private char[] value;
...
}
- int compareTo(String str) : str과 사전순으로 비교하여 같으면 0, 이전이면 1, 이후면 -1 반환
- int indexOf(int ch, int pos) : ch가 pos (포함)이후 문자열에 존재하면 해당 index, 존재하지 않으면 -1 반환
- String intern() : 문자열을 constant pool에 등록. 이미 있을 경우 그 문자열 주소값 반환
- String.join() : 여러 문자열을 구분자를 이용해 결합
- String.format() : printf()와 같이 형식화된 문자열 생성
StringBuffer클래스
mutable → 내부적으로 문자열 편집을 위한 버퍼(buffer)가 있음
멀티쓰레드 환경에서 사용 (동기화)
- int capacity() : 인스턴스의 버퍼크기를 알려줌
StringBuilder클래스
mutable → 내부적으로 문자열 편집을 위한 버퍼(buffer)가 있음
싱글쓰레드 환경에서 사용
String Constant Pool
String s1 = "abc"; // literal
String s2 = "abc"; // literal
String s3 = new String("abc");
System.out.println(s1.equals(s2)); // true
System.out.println(s2.equals(s3)); // true
System.out.println(s1 == s2); // true
System.out.println(s2 == s3); // false
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(System.identityHashCode(s3));
s1과 s2의 경우, 리터럴(literal)로 생성했고, s3는 new 연산자로 생성했다.
String을 리터럴로 생성하면 JVM내 Constant Pool에 저장되며, 같은 문자열을 또 생성하려는 경우 재사용한다.
s1, s2, s3 모두 String의 equals 메서드로 비교하면, 동일한 문자열이기 때문에 true를 반환한다.
객체를 비교하는 '==' 연산자에서도 s1과 s2는 같은 객체를 재사용 했으므로 true를 반환하며,
s3는 신규 생성 객체이기 때문에 s1과 s3, 그리고 s2와 s3를 비교한 결과는 모두 false를 반환한다.
재사용을 통해 String은 StringBuffer나 StringBuilder와 달리 immutable하다는 특성을 살릴 수 있기 때문에
String 사용은 가급적 new 연산자보다 리터럴로 생성하는 것이 좋다.
Wrapper클래스
8개 기본형을 대표한 8개 래퍼클래스 존재 (기본형 값을 객체로 다룰 때 사용)
JDK1.5에 추가된 오토박싱(autoboxing) : 기본형 값을 래퍼 클래스의 객체로 자동 변환
→ 반환값이 기본형일 때와 래퍼 클래스일 때 차이가 없어짐
Math클래스
난수 범위
- 0.0 <= Math.random() < 1.0
// 1~10까지의 난수 만들기
int randomNumber = (int)(Math.random() * 10) + 1
- 정수형 간의 연산에서는 반올림이 이루어지지 않음
- rint() : 소수점 첫째자리에서 반올림. return double타입
'KR > Java' 카테고리의 다른 글
[JAVA] Nested Static Class (스태틱 중첩 클래스) (0) | 2022.02.09 |
---|---|
놓치기 쉬운 자바(JAVA) : (2) 객체지향 (0) | 2021.04.22 |
놓치기 쉬운 자바(JAVA) : (1) 기초개념 (0) | 2021.04.22 |
[Lombok] 롬복 설치 및 STS(eclipse) 연동하기 (1) | 2020.02.28 |
[Spring] 스프링 프레임워크(Spring Framework)를 사용하는 이유 (0) | 2019.10.02 |