이번에는 Object클래스에 대해 알아보자
Object 클래스란?
- Object 클래스는
java.lang
패키지에 속한 클래스로, 모든 클래스들의 최상위 조상 클래스이다.- 자바에서 만들어지는 모든 클래스는 기본적으로 Object 클래스를 상속받음
- 따라서 Object 클래스에 속한 메서드들을 사용할 수 있음java.lang 패키지란?
- 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합
- java.lang 패키지의 클래스는 import문 없이 클래스 이름만으로 사용 가능
이번에는 Object 클래스에 속한 메서드를 알아보자. Object 클래스에는 총 11가지의 메서드가 있고 이 중 자주 사용되는 메서드를 중점으로 공부해보자.
toString()
메서드는 객체를 문자열로 표현된 정보값으로 반환한다.다음은 Object 클래스에 정의되어 있는 toString()
메서드 소스코드이다.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
이번에는 Bex 클래스를 통해 알아보자.
처음에는 toString()
을 오버라이드하지 않으면 어떠한 결과가 나오는지 알아보자.
class Bex {
public String saying;
public Double grade;
public Bex(String saying, Double grade) {
this.saying = saying;
this.grade = grade;
}
}
public class toStringExample {
public static void main(String[] args) {
Bex bex1 = new Bex("난 아무렇지 않아", 4.5);
Bex bex2 = new Bex("나 슬퍼", 3.0);
System.out.println(bex1.toString());
System.out.println(bex2.toString());
}
}
위의 코드의 결과는 다음과 같다. Object 클래스에 정의된 것처럼 나오는 것을 알 수 있다
이번에는 toString()
을 원하는 양식으로 나오도록 오버라이드 해보자
public class Bex {
public String saying;
public Double grade;
public Bex(String saying, Double grade) {
this.saying = saying;
this.grade = grade;
}
public String toString() {
return "Bex의 학점은 " + grade + "라서 '" + saying + "'라고 말했다.";
}
}
public class toStringExample {
public static void main(String[] args) {
Bex bex1 = new Bex("난 아무렇지 않아", 4.5);
Bex bex2 = new Bex("나 슬퍼", 3.0);
System.out.println(bex1.toString());
System.out.println(bex2.toString());
}
}
위의 코드의 결과는 다음과 같다. 내가 원하는 방식으로 나오는 것을 알 수 있다.
equals()
메서드는 object 객체와 자신의 객체가 같은지 비교하는 메서드로, 두 객체가 같으면 true
, 다르면 false
를 반환한다.다음은 Object 클래스에 정의되어 있는 equals()
메서드 소스코드이다.
public boolean equals(Object obj) {
return (this == obj);
}
이번에는 Soju 클래스를 통해 알아보자
public class Soju {
private Double ABG;
public Soju(Double ABG) {
this.ABG = ABG;
}
@Override
public boolean equals(Object obj) { // equals() 오버라이드
if(obj instanceof Soju soju) { // 형변환 체크
return Objects.equals(ABG, soju.ABG);
} else {
return false;
}
}
@Override
public int hashCode() { // 보통 equals()와 함께 오버라이드함
return Objects.hash(ABG);
}
}
public class equalsExample {
public static void main(String[] args) {
Soju soju1 = new Soju(16.9);
Soju soju2 = new Soju(20.1);
Soju soju3 = new Soju(16.9);
System.out.println("soju1과 soj2는 도수가 같은가? : " + soju1.equals(soju2));
System.out.println("soju1과 soj3는 도수가 같은가? : " + soju1.equals(soju3));
}
}
위의 코드의 결과는 다음과 같다. 만약 여러가지 필드값이 존재한다면 오버라이드를 통해 원하는 필드값만 비교하는 방식으로도 구현할 수 있다.
hashCode() 메서드란?
- 객체의 메모리 번지를 이용해서 해시코드를 만들어 return
- 객체마다 다른값을 가짐
getClass()
메서드는 객체의 클래스 정보를 알 수 있는 메서드로, 해당 정보를 Class 타입의 객체로 반환한다.getName()
: 클래스의 이름을 반환하는 메서드getSuperclass()
: 부모클래스의 이름을 반환하는 메서드getDeclaredFields()
: 클래스에 선언되어있는 멤버변수이름을 배열로 반환하는 메서드getDeclaredMethods()
: 클래스에 선언되어 있는 멤버함수이름을 배열로 반환하는 메서드이번에는 이전에 만든 소주 클래스와 참이슬 클래스를 통해 알아보자.
// Soju 클래스
public class Soju {
// 필드 입력
public String model;
public double ABV;
// 생성자(객체 값 세팅)
public Soju(String model, double ABV) {
this.model = model;
this.ABV = ABV;
}
// 메서드 입력
public void drink() {
System.out.println(model + "을 마십니다.");
}
public void mix() {
System.out.println(model + "을 맥주에 섞습니다.");
}
// Getter 생성
public String getModel() { return model; }
public double getABV() { return ABV; }
}
// 참이슬 클래스
public class Chamiseul extends Soju{
// 필드 입력
private String type;
// 생성자 입력
public Chamiseul(String model, double ABV, String type) {
super(model, ABV);
this.type = type;
}
// 메서드 입력
public void typeDrink() {
System.out.println(model + "소주의 " + type + "종류를 마십니다.");
}
// Getter 생성
public String getType() { return type; }
}
위의 예제 클래스들을 통해서 getClass()
를 사용해보자
public class getClassExample {
public static void main(String[] args) {
Chamiseul chamiseul = new Chamiseul("참이슬", 20.1, "오리지널");
Class c1 = chamiseul.getClass();
System.out.println(c1.getName());
System.out.println(c1.getSuperclass());
System.out.println(c1.getSuperclass().getName());
Field[] fields = c1.getDeclaredFields();
for(int i = 0; i < fields.length; i++) {
System.out.println("멤버변수" + i + " : " + fields[i]);
}
Method[] methods = c1.getDeclaredMethods();
for(int i = 0; i < methods.length; i++) {
System.out.println("멤버함수" + i + " : " + methods[i]);
}
}
}
위의 코드의 결과는 다음과 같다.
final Object clone()
: 현재 객체의 복사본을 생성 후 반환final void notify()
: 현재 객체를 사용하기 위해 대기하고 있는 쓰레드 하나를 깨final void notifyAll()
: 현재 객체를 사용하기 위해 대기하고 있는 모든 쓰레드를 깨움final void wait()
: 다른 쓰레드가 깨울때까지 현재 쓰레드를 대기시킴final void wait(long timeoutMilis)
: 다른 쓰레드가 깨우거나 정해진 시간만큼 현재 쓰레드를 대기시킴final void wait(long timeoutMilis, int nanos)
: 다른 쓰레드가 깨우거나 정해진 시간만큼 현재 쓰레드를 대기시킴protected void finalize()
: 객체가 소멸되기 전 자동으로 호출되는 메서드로, 현재는 사용되지 않음
예시가 참 항상 이해하기 쉽네요!! 잘 읽고 갑니당!!