java.lang 패키지는 자바에서 기본이 되는 클래스를 담고 있다. 그렇기 때문에 import 없이도 전역으로 사용할 수 있다.
Object 클래스는 모든 객체의 조상이 되는 클래스로 11개의 메소드가 있다. 주로 사용하는 메소드는 아래와 같다.
Method | description |
---|---|
clone() : Object | 객체의 얕은 복사본을 반환 |
equals() : Boolean | 객체의 주소를 비교해 같은 객체인지 판별 |
getClass() : Class | 객체 자신의 클래스 정보를 가지고 있는 Class 인스턴스를 반환 |
hashCode() : int | 객체 자신의 해시코드를 반환 |
toString() : String | 객체 자신의 정보를 문자열로 반환 |
clone() 메소드는 얕은 복사를 수행함에 유의해야 한다.
얕은 복사 : 객체가 참조하는 객체는 복사하지 않고 가리킨다. 즉 객체를 복사했더라도 원본과 복제 객체는 한 객체를 가리킴.
깊은 복사 : 객체가 참조하는 객체까지 모두 복사한다. 즉 원본과 복제 객체가 서로 다른 객체를 가리킴.
문자열을 위한 클래스로 문자열 조작을 위한 다양한 메소드를 가지고 있다.
String 인스턴스를 초기화 하는 방법은 new 연산자를 사용하는 것과 문자열 리터럴을 사용하는 두가지 방식이 있다.
// 문자열 리터럴
String str1 = "abc"
String str2 = "abc"
// new 연산자를 사용한 생성자 호출
String str3 = new String("abc")
String str4 = new String("abc")
문자열 리터럴로 String 객체를 생성할 경우 str1과 str2를 '==' 비교 연산자로 비교할 경우 true가 나온다. 그 이유는 문자열 리터럴은 컴파일 타임에 메모리에 올라가고 같은 문자열은 단 한번만 저장되기 때문에 같은 주소를 가리키기 있다. 비교 연산자 '=='는 객체의 경우 객체의 주소를 비교하기 때문에 true 라는 결과가 나온다.
str3와 str4는 생성자로 생성한 서로 다른 객체이기 때문에 '=='로 비교시 당연히 false다. 하지만 내용은 같은 상태이다. String 객체를 비교하기 위해서는 어떻게 해야할까?
바로 equals() 메소드다. 여기서 의문을 가지는 사람도 있을 것이다. equals() 메소드는 객체의 주소를 비교하는 Object 클래스의 메소드이라고 생각했기 때문이다. 하지만 String 클래스에는 equals() 메소드를 오버라이딩하여 주소와 상관없이 문자열 값이 같은지를 비교한다. 그렇기 때문에 인스턴스의 문자열 값이 서로 같다면 true, 다르다면 false를 반환한다.