[Java] Object 클래스

minhyeok·2023년 8월 20일
0

Java 개념 정리

목록 보기
7/8
post-thumbnail

Object 클래스란?

  • java.lang 패키지

java.lang 패키지는 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합입니다.
따라서 자바에서는 java.lang 패키지의 클래스들은 import 문을 사용하지 않아도 클래스 이름만으로 바로 사용할 수 있도록 하고 있습니다.

  • java.lang.Object 클래스

java.lang 패키지 중에서도 가장 많이 사용되는 클래스는 바로 Object 클래스입니다.
Object 클래스는 모든 자바 클래스의 최고 조상 클래스가 됩니다.
따라서 자바의 모든 클래스는 Object 클래스의 모든 메소드를 바로 사용할 수 있습니다.

이러한 Object 클래스는 필드를 가지지 않으며, 총 11개의 메소드만으로 구성되어 있습니다.

toString() 메소드

toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환합니다.

이때 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며, 그 뒤로 16진수 해시 코드(hash code)가 추가됩니다.

16진수 해시 코드 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환됩니다.

equals() 메소드

equals() 메소드는 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여, 그 결과를 반환합니다.

이때 참조 변수가 가리키는 값을 비교하므로, 서로 다른 두 객체는 언제나 false를 반환하게 됩니다.

Object 메소드

  • protected Object clone() : 해당 객체의 복제본을 생성하여 반환함.
  • boolean equals(Object obj) : 해당 객체와 전달받은 객체가 같은지 여부를 반환함.
  • protected void finalize() : 해당 객체를 더는 아무도 참조하지 않아 가비지 컬렉터가 객체의 리소스를 정리하기 위해 호출함.
  • Class<T> getClass() : 해당 객체의 클래스 타입을 반환함.
  • int hashCode() : 해당 객체의 해시 코드값을 반환함.
  • void notify() : 해당 객체의 대기(wait)하고 있는 하나의 스레드를 다시 실행할 때 호출함.
  • void notifyAll() : 해당 객체의 대기(wait)하고 있는 모든 스레드를 다시 실행할 때 호출함.
  • String toString() : 해당 객체의 정보를 문자열로 반환함.
  • void wait() : 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
  • void wait(long timeout) : 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지날 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
  • void wait(long timeout, int nanos) : 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지나거나 다른 스레드가 현재 스레드를 인터럽트(interrupt) 할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.

실제 적용한 예시

제가 프로젝트에서 작성한 코드 중에, Object 클래스를 활용하여 코드를 작성한 부분이 있습니다.
코드를 작성할 때도 공부하며 되게 신기했는데, 이번 기회에 정리하게 되었습니다.

//게시판 별 게시글 개수 조회
    public BoardList getBoardList() {
        //BoardList 객체 생성
        BoardList boardList = new BoardList();
        //전체 게시글 개수
        boardList.setBoardCount(boardRepository.countAllByStateIsTrue());
        //MBTI별 게시글 개수
        List<Object[]> boardCountList = boardRepository.countBoardsByMbtiAndStateIsTrue();
        //조회한 데이터를 해당하는 MBTI에 할당
        for (Object[] row : boardCountList) {
            MbtiEnum mbti = (MbtiEnum) row[0];
            Long count = (Long) row[1];

            switch (mbti) {
                case INFJ -> boardList.setINFJ(count);
                case INFP -> boardList.setINFP(count);
				.
                .
                .
            }
        }
        return boardList;
    }
    @Query("select b.mbti, count(b) from Board b where b.state = true group by b.mbti")
    List<Object[]> countBoardsByMbtiAndStateIsTrue();

    Long countAllByStateIsTrue();

위의 코드를 작성하게 된 배경은, 저희가 진행하는 프로젝트에 MBTI별 게시판이 있습니다.
해당 게시판별로 작성된 게시글 수를 출력하기 위해, mbti별로 게시글 수와 그에 해당하는 mbti를 받아와야 했습니다.

이걸 한번에 받아오는 방법이 고민이였는데, 기능을 구현하기 위해 Object로 이루어진 List를 활용하여 구현하였습니다.

해당 Object[] 에 row[0] 에는 mbti가, row[1]에는 count 수가 저장되어 있어, for문을 돌며 해당하는 mbti 별로 게시글 수를 내려주도록 하였습니다.

0개의 댓글