[자바] Obejct class

박지운·2023년 8월 15일
0

자바 꽉 자바

목록 보기
10/12

Obejct가 뭐야

가끔 지피티에게 자바 코드를 질문하면 자료형을 Object로 하는 코드를 제시해줄 때가 종종있다. 현재 진행중인 프로젝트에서 '리우'가 추가한 MBTI별 게시글 수 조회코드도 Object를 사용했다. Object를 알아보면서 아래 코드를 이해해보자.

BoardList getBoardCountRes() { 
	BoardList boardList = new BoardList();
    //전체 게시글 개수 설정
    boardList.setBoardCount(boardRepository.countAllByStateTrue());
    //MBTI별 게시글 개수 설정
	List<Object[]> boardCountList = boardRepository.countBoardsByMbti();
    
    for(Object[] row: boardCountList) {
    	MbtiEnum mbti = (MbtiEnum) row[0];
        Long count = (Long) row[1];
        
        switch(mbti) {
        	case INFJ -> boardList.setINFJ(count);
            ...
    	}
    }
    return boardList;
}

Object 클래스

모든 클래스의 최상위 클래스이다. Obejct 클래스는 필드가 없고 메소드로 구성되어 있다. 이 클래스의 메소드는 어떤 클래스에서도 호출이 가능하다.
자주 쓰는 메소드를 알아보자

equals()

모든 객체가 매개 값이 될 수 있다. Object가 최상위 타입이므로 모든 객체가 타입 변환이 가능하기 때문이다. 또한 equals는 실제 데이터가 아닌 참조 값으 기반으로 비교한다. 예를 보자

//object class의  equals 함수
public static void main(String args[])
{
        User user1 = new User("shlee", 20);
        User user2 = new User("shlee", 20);
        System.out.println(user1.equals(user2));
         // 결과는 false
}

두 User객체는 필드의 값이 같아도 참조 값이 다르기 때문에 false가 출력된다.

Object를 오버라이딩한 String의 equals는 어떨까

  • 리터럴 비교시
      String aa = "soju";
      String bb = "soju";
      System.out.println(aa.equals(bb)); 
        
      //결과 true

이때 자바는 문자열 리터럴 풀이라는 공간에 해당 문자열을 해당한다. 따라서 aa와 bb는 둘다 동일한 주소값을 참조하게 되므로 true가 나오게 된다.

  • 문자열 객체 비교시
String aa = new String("soju");
String bb = new String("soju");
System.out.println(aa.equals(bb))

이 경우에는 위 User를 비교할 때처럼 equals를 사용한다. 하지만 String의 equals는 true를 반환한다. 왜일까
이 경우에는 오버라이딩되어 문자열의 내용을 비교하기 때문이다!

equals는 주의해서 사용해야할 것 같다. 클래스 사용시에는 사용할 클래스에 오버라이딩을 해서 사용하자.

toString()

해당 인스턴스에 대한 정보를 문자열로 반환한다. 이때 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며, 그 뒤로 16진수 해시 코드가 추가된다.

Person2@2a139a55

이미 모든 객체가 이 메소드를 갖고 있기 때문에 재정의해서 클래스를 나타내는 용도로 사용할 수 있을 것 같다.


그래서 Object를 왜 썼을까

코드를 다시 보면 Obejct[] 반복문 안에 각각 MBTIEnum과 Long으로 형변환한 것이 보인다. 위에서 봤듯이 모든 클래스는 Object를 상속 받기 때문에 타입 변환이 자유롭다.

위 코드에서 countsBoardByMbti 쿼리는

@Query("select b.mbti, count(b) from Board b where b.state = true group by b.mbti")
    List<Object[]> countBoardsByMbtiAndStateIsTrue();

이렇게 되어있다. 보면 mbti와 해당 mbti별 count를 동시에 받아야하는 상황에서 object는 둘을 한번에 받을 수 있는것이다.

결론 : 쿼리 결과의 다양한 자료형 데이터들을 효율적으로 묶어 사용할 때에는 Object를 사용하자.

출처 : 애플통 티스토리
TCP SCHOOL

profile
앞길막막 전과생

1개의 댓글

comment-user-thumbnail
2023년 8월 20일

실제로 짠 코드가 너무 이해하기 쉽게 되어 있어서 이해가 쉬웠습니다!!
잘 읽고 갑니다~~

답글 달기