자바 정복 일기 - Object

Bex·2023년 8월 16일
0
post-thumbnail

이번에는 Object클래스에 대해 알아보자

1. Object 클래스

Object 클래스란?

  • Object 클래스java.lang 패키지에 속한 클래스로, 모든 클래스들의 최상위 조상 클래스이다.
  • 자바에서 만들어지는 모든 클래스는 기본적으로 Object 클래스를 상속받음
    - 따라서 Object 클래스에 속한 메서드들을 사용할 수 있음

java.lang 패키지란?

  • 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합
  • java.lang 패키지의 클래스는 import문 없이 클래스 이름만으로 사용 가능

1) Object 클래스의 메서드 종류

이번에는 Object 클래스에 속한 메서드를 알아보자. Object 클래스에는 총 11가지의 메서드가 있고 이 중 자주 사용되는 메서드를 중점으로 공부해보자.

(1) toString() 메서드

  • toString() 메서드는 객체를 문자열로 표현된 정보값으로 반환한다.
  • 일반적으로 유의미한 데이터를 반환하도록 오버라이드하여 사용한다.

다음은 Object 클래스에 정의되어 있는 toString() 메서드 소스코드이다.

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

이번에는 Bex 클래스를 통해 알아보자.

toString() 예제

처음에는 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());
    }
}

  

위의 코드의 결과는 다음과 같다. 내가 원하는 방식으로 나오는 것을 알 수 있다.


(2) equals() 메서드

  • equals() 메서드는 object 객체와 자신의 객체가 같은지 비교하는 메서드로, 두 객체가 같으면 true, 다르면 false를 반환한다.

다음은 Object 클래스에 정의되어 있는 equals() 메서드 소스코드이다.

  public boolean equals(Object obj) {
  	return (this == obj);
  }

이번에는 Soju 클래스를 통해 알아보자

equals() 예제

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
  • 객체마다 다른값을 가짐

(3) getClass() 메서드

  • getClass() 메서드는 객체의 클래스 정보를 알 수 있는 메서드로, 해당 정보를 Class 타입의 객체로 반환한다.
  • 반환된 Class 타입의 객체는 클래스 정보에 접근할 수 있는 메서드를 가지고 있고, 우리는 이 메서드들을 통해 클래스 정보를 확인할 수 있다.
  1. getName() : 클래스의 이름을 반환하는 메서드
  2. getSuperclass() : 부모클래스의 이름을 반환하는 메서드
  3. getDeclaredFields() : 클래스에 선언되어있는 멤버변수이름을 배열로 반환하는 메서드
  4. getDeclaredMethods() : 클래스에 선언되어 있는 멤버함수이름을 배열로 반환하는 메서드

이번에는 이전에 만든 소주 클래스와 참이슬 클래스를 통해 알아보자.

getClass() 예제

// 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]);
        }
    }
}

위의 코드의 결과는 다음과 같다.


(4) 이외의 클래스

  1. final Object clone() : 현재 객체의 복사본을 생성 후 반환
  2. final void notify() : 현재 객체를 사용하기 위해 대기하고 있는 쓰레드 하나를 깨
  3. final void notifyAll() : 현재 객체를 사용하기 위해 대기하고 있는 모든 쓰레드를 깨움
  4. final void wait() : 다른 쓰레드가 깨울때까지 현재 쓰레드를 대기시킴
  5. final void wait(long timeoutMilis) : 다른 쓰레드가 깨우거나 정해진 시간만큼 현재 쓰레드를 대기시킴
  6. final void wait(long timeoutMilis, int nanos) : 다른 쓰레드가 깨우거나 정해진 시간만큼 현재 쓰레드를 대기시킴
  7. protected void finalize() : 객체가 소멸되기 전 자동으로 호출되는 메서드로, 현재는 사용되지 않음
profile
초보 개발자의 코딩 일기

1개의 댓글

comment-user-thumbnail
2023년 8월 20일

예시가 참 항상 이해하기 쉽네요!! 잘 읽고 갑니당!!

답글 달기