가끔 지피티에게 자바 코드를 질문하면 자료형을 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;
}
모든 클래스의 최상위 클래스이다. Obejct 클래스는 필드가 없고 메소드로 구성되어 있다. 이 클래스의 메소드는 어떤 클래스에서도 호출이 가능하다.
자주 쓰는 메소드를 알아보자
모든 객체가 매개 값이 될 수 있다. 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는 주의해서 사용해야할 것 같다. 클래스 사용시에는 사용할 클래스에 오버라이딩을 해서 사용하자.
해당 인스턴스에 대한 정보를 문자열로 반환한다. 이때 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며, 그 뒤로 16진수 해시 코드가 추가된다.
Person2@2a139a55
이미 모든 객체가 이 메소드를 갖고 있기 때문에 재정의해서 클래스를 나타내는 용도로 사용할 수 있을 것 같다.
코드를 다시 보면 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
실제로 짠 코드가 너무 이해하기 쉽게 되어 있어서 이해가 쉬웠습니다!!
잘 읽고 갑니다~~