본문 바로가기
공부/자바 (Java)

[Java] Object 클래스 & Class 클래스 - toString(), equals(), hashCode(), clone(), forName()

by Lagooni 2021. 12. 29.

모든 클래스의 최상위 클래스이다.

java.lang.Object 클래스 (따로 import하지 않아도 된다.)

  • 모든 클래스는 Object클래스에서 상속 받는다.
  • 모든 클래스는 Object클래스의 메소드를 사용할 수 있다.
  • 모든 클래스는 Object클래스의 일부 메서드를 재정의 하여 사용할 수 있다. (final로 정의된 메서드가 있기 때문)

Object클래스의 toString메서드

toString()메서드의 원형: getClass().getName() + '@' + Integer.toHexString(hashCode())

객체의 정보를 String으로 바꾸어 사용할 때 유용하다.

package Object;

class Book{
    String title;
    String author;

    public Book(String title, String author){
        this.title = title;
        this.author = author;
    }

    @Override
    public String toString() {
        return author + "," + title;
    }
}

public class ToStringTest {
    public static void main(String[] args) {

        Book book = new Book("냠냠냠냠", "쩝쩝");
        System.out.println(book);

    }
}

Book객체를 생성하여 book을 출력하면 Object.Book@3f0ee7cb 이와같은 형식으로 출력된다.

이는 Object클래스의 toString메서드를 재정의 해주면 수정할 수 있다.

equals() 메서드

두 객체의 동일함을 논리적으로 재정의 할 수 있다.

물리적으로 동일함: 같은 주소를 가지는 객체

논리적으로 동일함: 같은 학번의 학생, 같은 주문 번호의 주문

물리적으로 다른 메모리에 위치한 객체라도 논리적으로 동일함을 구현하기 위해 사용하는 메서드이다.

package Object;

public class EqualsTest {
    public static void main(String[] args) {

        String str1 = new String("abc");
        String str2 = new String("abc");

        System.out.println(str1 == str2);       //결과: false (같은 메모리에 있는가를 확인한다.)
        System.out.println(str1.equals((str2)));//결과: true	(문자열이 같으면 같음)
    }
}

다운캐스팅을 사용한 equals()메서드 오버라이딩 (예: 같은 객체인지에 대한 논리적 참거짓 판별하기)

더보기
package Object;

class Student{
    int studentNum;
    String studentName;

    public Student(int studentNum, String studentName){
        this.studentNum = studentNum;
        this.studentName = studentName;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Student){
            Student st = (Student)obj;
            return (this.studentNum == st.studentNum);
        }
        return false;
    }
}

public class EqualsTest {
    public static void main(String[] args) {

        Student st = new Student(123, "lagoon");
        Student st1 = new Student(123, "lagoon");


        System.out.println(st.equals(st1));
    }
}

 

hashCode()메서드

hashCode() 메서드의 반환값: 인스턴스가 저장된 가상머신의 주소를 10진수로 반환

두 개의 서로 다른 메모리에 위치한 인스턴스가 동일하다는 것은?

  • 논리적으로 동일: equals()의 반환값이 true
  • 동일한 hashCode값을 가짐 = hashCode()의 반환 값이 동일하다.

clone() 메서드

객체의 복사본을 만든다.

기본 틀(prototype)로 부터 같은 속성 값을 가진 객체의 복사본을 생성할 수 있다.

객체지향 프로그래밍의 정보은닉에 위배되는 가능성이 있으므로 복제할 객체는 cloneable 인터페이스(마크 인터페이스라고도 함)를 명시해야함.

더보기
package Object;

class Book implements Cloneable{
    String title;
    String author;

    public Book(String title, String author){
        this.title = title;
        this.author = author;
    }

    @Override
    public String toString() {
        return author + "," + title;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class ToStringTest {
    public static void main(String[] args) throws CloneNotSupportedException {

        Book book = new Book("신데렐라", "쿠쿠");
        System.out.println(book);

        String str = new String("토지");
        System.out.println(str.toString());

        Book book2 = (Book)book.clone();
        System.out.println(book2);
    }
}

Class 클래스

자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일로 생성된다.

class 파일에는 객체의 정보 (멤버변수, 메서드, 생성자등)가 포함되어 있다.

Class클래스는 컴파일된 calss 파일에서 객체의 정보를 가져올 수 있다.

Class클래스 가져오기

// 1
String s = new String();
Class c = s.getClass();

// 2
Class c = String.Class;

// 3
Class c = Class.forName("java.lang.String"); //동적 로딩

reflection 프로그래밍

Class 클래스로부터 객체의 정보를 가져와 프로그래밍 하는 방식. 로컬에 객체가 없고 자료형을 알 수 없는 경우 유용한 프로그래밍.

java.lang.reflect 패키지에 있는 클래스 활용

더보기
package Classex;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ClassTest {
    public static void main(String[] args) throws ClassNotFoundException {

        Class c3 = Class.forName("java.lang.String");

        Constructor[] cons = c3.getConstructors();
        for(Constructor con : cons){
            System.out.println(con);
        }

        System.out.println();

        Method[] methods = c3.getMethods();
        for(Method method: methods){
            System.out.println(method);
        }
    }
}

forName() 메서드와 동적 로딩

Class클래스 static 메서드

동적로딩이란?

컴파일시 데이터 타입이 모두 바인딩 되어 자료형이 로딩되는 것(Static loading)이 아니라 실행 중에 데이터 타입을 알고 바인딩 되는 방식

실행시 로딩되므로 경우에 따라 다른 클래스가 사용될 수 있어 유용하다.

컴파일 타임에 체크할 수 없으므로 해당 문자열에 대한 클래스가 없는 경우 예외가 발생할 수 있다.(ClassNotFoundException)

댓글