Object 클래스
- 자동으로 모든 클래스의 조상이 되는 클래스
- 클래스 계층 구조에서 루트가 되는 클래스
- 모든 클래스는 자동으로 Object 클래스를 상속받음
- 주요 메소드로 clone(), equals(), hashCode(), toString() 등이 있음
toString( ) 메소드
- 객체의 정보를 문자열로 표현해주는 메서드
- 객체를 출력할 때 자동으로 호출됨
- 주로 디버깅용, 로그 출력용으로 오버라이딩해서 많이 사용
- 자식 클래스에서 재정의 가능(String, Integer 클래스 등에서 재정의되어 있음)
// 기본형 (오버라이딩 안 했을 때)
Object obj = new Object();
System.out.println(obj.toString());
// 출력
// java.lang.Object@6d06d69c (클래스명@해시코드)
// 오버라이딩 예
class Person {
String name;
Person(String name) { this.name = name; }
@Override
public String toString() {
return "이름: " + name;
}
}
Person p = new Person("홍길동");
System.out.println(p);
// 출력
// 이름: 홍길동
equals( ) 메소드
- 두 객체가 "같은 값"인지 비교할 때 사용하는 메서드
- 단순히 == 로 비교하면 주소(참조값)를 비교하지만, equals()는 내용(값)을 비교하도록 오버라이딩 할 수 있음
- 자식 클래스에서 재정의 가능(String, Integer 클래스 등에서 재정의되어 있음)
// 예시 1. 기본형 vs 참조형 비교
int a = 10;
int b = 10;
System.out.println(a == b); // true (값이 같음)
// 기본형은 == 로 비교해도 값이 같으면 true
// 예시 2. String 비교 - == vs equals()
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false (주소가 다름)
System.out.println(str1.equals(str2)); // true (내용이 같음)
// 🔥 문자열 비교는 항상 equals()를 써야 해요!
// ==은 메모리 위치(주소)를 비교하고, equals()는 실제 문자 내용을 비교
// 예시 3. 사용자 정의 클래스에서의 equals()
// 클래스를 직접 만들면 equals()를 오버라이딩하지 않는 한 ==처럼 작동
// 오버라이딩 안 했을 경우
class Person {
String name;
Person(String name) {
this.name = name;
}
}
Person p1 = new Person("홍길동");
Person p2 = new Person("홍길동");
System.out.println(p1.equals(p2)); // false (주소 다름)
// 오버라이딩한 경우
class Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Person)) return false;
Person p = (Person) obj;
return this.name.equals(p.name);
}
}
Person p1 = new Person("홍길동");
Person p2 = new Person("홍길동");
System.out.println(p1.equals(p2)); // true (값이 같음)
// 예시 4. null 과 비교할 때 주의점
String str = null;
System.out.println("hello".equals(str)); // false
// str.equals("hello"); ← NullPointerException 발생!
// 📌 항상 "리터럴.equals(변수)" 형태로 비교하면 안전
clone( ) 메소드
- 현재 객체와 똑같은 값을 가진 객체를 새로 생성
- 기본적으로 얕은 복사(shallow copy)를 수행
- Cloneable 인터페이스를 반드시 구현해야 사용 가능
- 직접 오버라이딩하여 public으로 열어야 함
- 예외처리(CloneNotSupportedException)를 해줘야 함
class Person implements Cloneable {
String name;
Person(String name) {
this.name = name;
}
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
Person p1 = new Person("홍길동");
Person p2 = p1.clone();
System.out.println(p1 == p2); // false (다른 객체)
System.out.println(p1.name.equals(p2.name)); // true (내용 같음)
getClass( ) 메소드
- 객체가 어떤 클래스의 인스턴스인지 확인할 때 사용
- 리턴값은 class<?> 타입 객체(메타데이터)
String s = "Hello";
System.out.println(s.getClass().getName());
// 출력
// java.lang.String
// 프레임워크(Spring 등)나 리플렉션(reflection)에서 클래스 정보를 읽어올 때 자주 사용
hashCode( ) 메소드
- 객체의 정수 해시코드(식별용 숫자) 를 반환
- 주로 HashMap, HashSet 등의 자료구조에서 객체의 위치를 결정할 때 사용
- equals()와 함께 오버라이딩해서 동등성 비교 기준으로 활용됨
String a = "hello";
String b = "hello";
System.out.println(a.equals(b)); // true
System.out.println(a.hashCode()); // 같음
System.out.println(b.hashCode()); // 같음
// 사용자 정의 클래스에서 오버라이딩 예
@Override
public int hashCode() {
return name.hashCode(); // 주요 필드를 기준으로 해시값 계산
}
// equals()를 오버라이딩하면 hashCode()도 반드시 같이 오버라이딩해야 해요!
// 그렇지 않으면 HashMap, HashSet에서 제대로 동작하지 않아요.
'언어(Language) > Java' 카테고리의 다른 글
[Java] StringBuffer 클래스 (0) | 2025.06.08 |
---|---|
[Java] java.lang 패키지 (0) | 2025.06.08 |
[Java] 패키지 (1) | 2025.05.09 |
[Java] 람다식 (0) | 2025.05.03 |
[Java] 제네릭 (0) | 2025.05.03 |