BACKEND/JAVA

자바 클래스 - Object 클래스

우진하다 2023. 5. 27. 16:40

시작하며.

JDK는 Java Development Kit의 약자로, Java 프로그래밍을 위한 개발 도구들의 집합을 말합니다.
JDK는 Java 언어로 작성된 애플리케이션, 애플릿, 라이브러리 등을 개발하고 실행하기 위해 필요한 도구들을 제공.
이런 JDK에서 제공하는 많은 클래스를 활용하면 프로그램을 효율적으로 구현할 수 있다.
다 외울 필요는 없고 찾아보며 쓰면 되지만 기본적인 내용은 알고 넘어가기 위해 정리하고자 한다.

 

java.lang 패키지.

java.lang 패키지는 Java에서 가장 기본적이고 핵심적인 클래스들을 포함하는 패키지이다.
이 패키지는 자동으로 컴파일할 때 import되기 때문에 별도의 import 문을 추가하지 않아도 사용할 수 있다.
그렇기 때문에 직접 import하지 않아도 java.lang 패키지의 모든 하위 클래스를 참조할 수 있다.
앞으로 작성할 기본 클래스는 이 java.lang 패키지에 속해있다.

Mac OS 기준 intelliJ JDK

모든 클래스의 최상위 클래스 Object.

Object 클래스는 모든 자바 클래스의 최상위 클래스다.
모든 클래스는 Object 클래스르로부터 상속을 받는다.
하지만 우리는 클래스를 만들 때 extends Object를 하진 않는다.
컴파일 시 자동으로 쓰인다고 이해하면 된다.

class Student { // compile 과정에서 자동으로 class Student extends Object 
	int studentId;
    String studentName;
}

직접 만드는 클래스 뿐만 아니라 JDK에서 제공하는 클래스 모두 Object를 상속받는다.
String class를 보면 Object 클래스를 상속하는 걸 확인할 수 있다.

이는 모든 클래스가 Object 클래스를 상속받았으니 Object의 메서드를 사용할 수 있고
재정의할 수 도 있고 항변환 역시 가능하다.(모든 메서드를 재정의 할 수 있는건 아님, final로 선언되어 있다면 불가)

Object의 주요 메서드.

  • String toString() 
    객체를 문자열로 표현하여 반환, 재정의해 객체에 대한 설명이나 특정 멤버 변수 값을 반환

class Book {
    private String title;
    private String author;

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

    public String toString() { // toString() 재정의
        return "제목 : " + title + ", 저자 : " + author;
    }
}
public class ObjectClassTest {
    public static void main(String[] args) {
        Book book = new Book("루피의 하루", "잔망루피");
        System.out.println(book); // 제목 : 루피의 하루, 저자 : 잔망루피
    }
}

// 재정의 하지 않으면 day025.Book@28a418fc 이런 객체정보를 문자열로 반환

 

  • boolean equals(Object obj)
    두 인스턴스가 동일한지 여부를 반환, 재정의하여 논리적으로 동일한 인스턴스임을 정의할 수 있음

package day025;
import java.lang.*;
import java.util.Objects;

class Book {
    private String title;
    private String author;

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

    public String toString() { // toString() 재정의
        return "제목 : " + title + ", 저자 : " + author;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Book book = (Book) obj;

        if (author != book.author) {
            return false;
        }
        return Objects.equals(author, book.author); // author로 비교하는 것으로 재정의
    }
}
public class ObjectClassTest {
    public static void main(String[] args) {
        Book book = new Book("루피의 하루", "잔망루피");
        Book book1 = new Book("루피의 하루", "크롱");
        System.out.println(book); // 제목 : 루피의 하루, 저자 : 잔망루피
        System.out.println(book.equals(book1)); // false
    }
}

 

  • Object clone()
    객체를 복제하여 동일한 멤버 변수 값을 가진 새로운 인스턴스를 생성
    몇가지 단계를 거쳐 구현해야 함
    배열의 경우 이미 Cloneable 인터페이스를 구현하고 있어 바로 사용가능

package day025;
import java.lang.*;
import java.util.Objects;

class Book implements Cloneable {
    private String title;
    private String author;

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

	//... 

    @Override
    public Book clone() throws CloneNotSupportedException {
        return (Book) super.clone();
    }
}

public class ObjectClassTest {
    public static void main(String[] args) {
        Book book = new Book("루피의 하루", "잔망루피");
        try {
            Book book1 = book.clone();
            System.out.println(book); // 제목 : 루피의 하루, 저자 : 잔망루피
            System.out.println(book1); // 제목 : 루피의 하루, 저자 : 잔망루피
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

 

이 외에도 Class get Class(), void finalize(), void wait(). noid nofity() 등 다양한 메서드가 있다.