[Java] toString? 그게 뭔데

hansung's·2024년 3월 11일
0

🚑 들어가기 앞서


요즘 부쩍 코테 공부를 자주 하고 있는데, 이번에 객체를 활용한 정렬 문제를 풀면서 toString에 대한 부분이 나와 해당 메서드를 찾아보고자 한다.

👀 Object 클래스


toString하다가 뜬금없이 Object 클래스를 외치고 있다. 갑자기? 그 이유를 설명하자면

먼저 Object 클래스는 모든 클래스의 최상위 클래스에 속한다.
Object는 java.lang패키지에 속하는데, 여기서 java.lang 패키지를 짧게 설명하면

java.lang 패키지는 자바에서 기본적인 동작을 수행하는 클래스들의 집합이다.
그래서 자바에서는 java.lang 패키지의 클래스들은 import를 하지 않아도 클래스 이름으로 바로 사용이 가능하다. (대표적으로 import하는 패키지가 java.util)

그런 패키지에서 가장 많이 사용되는 클래스가 바로 Object클래스이다.
그래서 Object 클래스의 메서드는 import를 하지 않아도 바로 사용할 수 있다.

또한, 자바 컴파일러가 클래스들을 자동으로 Object 클래스 하위로 설정해 우리가 만든 클래스는 Object 클래스를 부모클래스로 상속 받아 사용하게 됩니다.

끝으로 Object 클래스에는 총 11가지의 메서드가 존재하는데, 그 중 오늘 살펴볼 toString()메서드가 여기에 존재합니다.

사진 출처: https://www.tcpschool.com/java/java_api_object
TCP School Object클래스

👍 toString()


toString()메서드는 해당 인스턴스에 대한 정보를 문자열로 반환하는데,
우리가 객체를 만들고 주소를 주소를 나타내고 싶을 때, toString() 메서드를 사용하면 주솟값(인스턴스 정보)를 출력할 수 있습니다.

		Person p1 = new Person();
        Person p2 = new Person();

        System.out.println(p1.toString());
        System.out.println(p2.toString());

그렇다면 이게 무엇인지 조금 더 살펴보면

toString()메서드의 로우 코드는 다음과 같은데, 이를 해석하면

getClass(): 현재 위치한 상위 클래스
getName(): 객체 클래스 이름
@: 위치
Integer.toHexString(hashCode()): 16진수 해시코드
↘해당 해시코드 값이 곧 인스턴스 주소를 해싱한 값이다. 이는 고유 숫자로 다른 인스턴스와 다르게 변환된다.

이렇게 toString()은 해당 인스턴스의 정보를 문자열로 반환받고 싶을때 사용하지만
보통 toString은 해당 메서드를 필요한 출력형태에 따라 재정의하여 많이 사용합니다.

그렇다면 어떻게 재정의를 하는지 알아보자

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("아버지", "남자");
        Person p2 = new Person("어머니", "여자");

        System.out.println(p1);
        System.out.println(p2);
    }

    static class Person{
        String name;
        String gender;

        Person(String name, String gender) {
            this.name = name;
            this.gender = gender;
        }

        @Override
        public String toString() {
            return "나의 이름은 " + name + " 이고 성별은 " + gender + "이다.";
        }
    }
}

출력 결과
//나의 이름은 아버지 이고 성별은 남자이다.
//나의 이름은 어머니 이고 성별은 여자이다.

이런 형태로 나타낼 수 있다.
여기서 toString은 반드시 @Override를 한 상태로 나타내줘야 한다.
그래야 오버라이딩을 통해 재정의를 할 수 있는 것이다.

여기서 유의할 점.
메서드 오버라이딩은 접근제어자를 잘 지정해야 하는데,
부모 메서드에 정의된 접근 제어자 범위보다 낮게 설정할 수 없다.

사진이 잘 안보이겠지만, 이를 해석하면
Person 클래스의 toString이 private로 더 약한 접근제어자로 시도해 Object클래스의 toString과 충돌이 일어나고 있다.
Java11 기준으로 toString()메서드는 public이다.

즉 부모메서드가 public인데 으디 감히 자식메서드가 private을 하는가? 이다.

오버라이딩을 할 떄 이렇게, 접근제어자를 유의해서 지정해야 컴파일 에러가 발생하지 않는다.

또한 우리가 흔하게 쓰는 String클래스에서도 toString이 내부적으로 사용되는데,

		String test = "ABCDE";
        System.out.println(test);
        
        //실제 출력
        ABCDE

이렇듯, test 값 그대로 나올 수 있는 것은 String클래스 내부에서 이를 재정의 해놨기 때문에 가능한 것이다.

위의 영어를 해석하면, 이 개체(이미 문자열인 경우)는 그 자체로 반환됩니다.
즉, 문자열이면 값 그대로 반환된다는 것을 설명하고 있다.

그리고 toString()메서드는 우리가 호출하지 않아도 자동적으로 호출 되기 때문에
우리가 System.out.println을 했을때 그냥 변수만 넣어도 값을 출력할 수 있는 것이다.

💜 참고자료


자바 toString 오버라이딩 - 완벽 이해하기

TCP School Object 클래스

자바 to String이란??

profile
ABAPER를 꿈꾸는 개발자

0개의 댓글