toString()

박영준·2023년 4월 3일
0

Java

목록 보기
58/111

1. toString() 메소드

class MyObject extends Object {		// extends Object 는 생략해도 무방 
    int objId;
    String objName;

    public MyObject(int objId, String objName) {
        this.objId = objId;
        this.objName = objName;
    }
}

public class Main {
    public static void main(String[] args) {
        MyObject o1 = new MyObject(101, "First Object");
        MyObject o2 = new MyObject(102, "Second Object");

        // 클래스 타입 이름 @ 객체주소 해시코드
        System.out.println(o1.toString());		// MyObject@251a69d7
        System.out.println(o2.toString());		// MyObject@7344699f
    }
}
  • 해당 인스턴스에 대한 정보를 문자열로 반환

  • 객체를 출력할때 toString() 메서드를 붙여주지 않고 변수만 출력해도 메서드를 붙인것과 똑같은 값이 출력된다.
    → 컴파일러가 객체만 출력할 경우 자동으로 toString()을 붙여주고 컴파일 하기 때문

  • 일차원 배열에서만 사용 가능

    참고: 배열, ArrayList - 9) 2차원 배열

2. toString() 오버라이딩

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // @Overriding : 오버라이딩은 메서드 시그니처가 일치해야 한다. 블록 안의 내용만 재정의 하는 것이다.
    public String toString() {
        return String.format("이름 : %s, 나이 : %d세", this.name, this.age);
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("홍길동", 54);

        // p1 객체를 출력하면 이름과 나이가 출력
        System.out.println(p1);		// 이름 : 홍길동, 나이 : 54세
    }
}
  • 객체의 이름이나 주소값이 아닌 객체의 고유 정보(재정의된 문자열 값)를 출력하고 싶을 때
    오버라이딩을 통해, toString() 메소드를 재정의 하면 된다.

  • 재정의된 toString 메소드는 직접 호출하지 않더라도
    문자열 출력시, 문자열 결합 연산자 등을 사용할 때 자동으로 호출된다.

3. toString() & 배열

class MyInt {
    final int num;

    MyInt(int num) {
        this.num = num * 100;
    }

	// 이 부분이 필요하다!
	/* --- 배열 내의 각각의 원소들을 String화 하지 않을 경우, System.out.println(Arrays.toString(arr)); 에서 원하는 값이 나오지 않는다 --- */
    @Override
    public String toString() {
        return Integer.toString(num);
    }
    /* ------------------------------------ */
}

public class Main {
    public static void main(String[] args) {

        Object[] arr = new Object[5];
        arr[0] = new MyInt(1);
        arr[1] = new MyInt(2);
        arr[2] = new MyInt(3);
        arr[3] = new MyInt(4);
        arr[4] = new MyInt(5);

		/* 배열 자체를 Stirng화 한 것 → 따라서, 배열 내의 각각의 원소들도 String화가 필요했음 */
        System.out.println(Arrays.toString(arr));		// 출력 결과 : [100, 200, 300, 400, 500]
    }
}

배열의 원소들이 primitive 타입(int형 같은)이 아닌 reference 타입(객체와 같은)일 경우,
배열을 출력할 때 안에 있는 값을 출력하기 위해선 반드시 일일이 각 객체의 클래스마다 toString() 을 재정의 해야 된다.

4. deeptoString

  • 다차원 배열에서 사용 (2차 배열, 3차 배열 ...)

참고: [JAVA] ☕ toString 오버라이딩 - 완벽 이해하기
참고: Java 에서 toString 메소드의 올바른 사용 용도에 대하여
참고: (Java)Arrays.deepToString - 2차원 배열 출력

profile
개발자로 거듭나기!

0개의 댓글