일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- maven systempath
- 도커 컨테이너에 mysql
- maven 외부 라이브러리 배포
- 자바object다형성
- 외부 라이브러리 jar 배포
- java
- 자바
- 졸프
- 스프링
- java object 클래스
- object배열
- maver 외부 jar 배포
- object tostring
- object다형성
- niceid_v1.1.jar maven
- java object 다형성
- Spring
- map vs multivaluemap
- maven repository jar
- JS
- nice_v1.1.jar
- object 다형성
- javascript
- maven jar 배포
- map multivaluemap
- 배포시 systempath
- 맥북 port kill
- 자바스크립트
- Object
- object 배열
- Today
- Total
모래블로그
[Java] Object toString() 본문
5. toString()
toString()
Object.toString() 메서드는 객체의 정보를 문자열 형태로 제공한다. 그래서 디버깅과 로깅에 유용하게 사용된다.
이 메서드는 Object 클래스에 정의되므로 모든 클래스에서 상속 받아 사용할 수 있다.
public class ToStringMain1 {
public static void main(String[] args) {
Object object = new Object();
String string = object.toString();
// toString() 반환값 출력
System.out.println(string);
// object 직접 출력
System.out.println(object);
}
}
실행 결과
둘이 같은 결과가 나왔다.
클래스 정보@참조값 형태로 출력됨
Object.toString()
Object가 제공하는 toString() 메서드는 기본적으로 패키지를 포함한 객체의 이름과 객체의 참조값(해시코드)를 16진수로 제공한다.
해시코드(hasCode())에 대한 정확한 내용은 이후에 별도로 다룸. 지금은 객체의 참조값 정도로 생각하면 됨
println()과 toString()
그런데 toString()의 결과를 출력한 코드와 object를 println()에 직접 출력한 코드의 결과가 완전히 같다.
// toString() 반환값 출력
String string = object.toString();
System.out.println(string);
// object 직접 출력
System.out.println(object);
Object 타입(자식 포함)이 println()에 인수로 전달되면 내부에서 obj.toString() 메서드를 호출해서 결과를 출력한다.
println 메서드 내부
valueOf 메서드 내부
따라서 println()을 사용할 때, toString()을 직접 호출할 필요 없이 객체를 바로 전달하면 객체의 정보를 출력할 수 있다.
toString() 오버라이딩
Object.toString() 메서드가 클래스 정보와 참조값을 제공하지만 이 정보만으로는 객체의 상태를 적절하게 나타내지 못한다.
(-> java.lang.Object@b4c966a 이걸 가지고 안에 어떤 값을 가지고 있는지알 수 없으므로)
그래서 보통 toString()을 재정의(오버라이딩)해서 보다 유용한 정보를 제공하는 것이 일반적이다.
Car
public class Car {
private String carName;
public Car(String carName) {
this.carName = carName;
}
}
Car 에는 toString()을 재정의 하지 않음
Dog
public class Dog {
private String dogName;
private int age;
public Dog(String dogName, int age) {
this.dogName = dogName;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"dogName='" + dogName + '\'' +
", age=" + age +
'}';
}
}
Dog에는 toString()을 재정의함
ObjectPrinter
public class ObjectPrinter {
public static void print(Object obj) {
String string = "객체 정보 출력: " + obj.toString();
System.out.println(string);
}
}
ToStringMain2
public class ToStringMain2 {
public static void main(String[] args) {
Car car = new Car("Model Y");
Dog dog1 = new Dog("멍멍이1", 2);
Dog dog2 = new Dog("멍멍이2", 5);
System.out.println("1. 단순 toString 호출");
System.out.println(car.toString());
System.out.println(dog1.toString());
System.out.println(dog2.toString());
System.out.println("2. println 내부에서 toString 호출");
System.out.println(car);
System.out.println(dog1);
System.out.println(dog2);
System.out.println("3. Object 다형성 활용");
ObjectPrinter.print(car);
ObjectPrinter.print(dog1);
ObjectPrinter.print(dog2);
}
}
실행 결과
Dog 인스턴스는 toString()을 재정의 한 덕분에 객체의 상태를 명확하게 확인할 수 있다.
ObjectPrinter.print(Object obj) 분석 - Car 인스턴스(toString() 재정의 X)
- Object obj의 인수로 car(Car) 가 전달 된다.
- 메서드 내부에서 obj.toString()을 호출한다.
- obj는 Object 타입이다. 따라서 Object 에 있는 toString() 을 찾는다.
- 이때 자식에 재정의(오버라이딩) 된 메서드가 있는지 찾아본다. 재정의된 메서드가 없다.
- Object.toString()을 실행한다.
ObjectPrinter.print(Object obj) 분석 - Dog 인스턴스(toString() 재정의 O)
- Object obj의 인수로 dog(Dog) 가 전달 된다.
- 메서드 내부에서 obj.toString()을 호출한다.
- obj는 Object 타입이다. 따라서 Object 에 있는 toString() 을 찾는다.
- 이때 자식에 재정의(오버라이딩) 된 메서드가 있는지 찾아본다. Dog에 재정의된 메서드가 있다.
- Dog.toString()을 실행한다.
참고- 객체의 참조값 직접 출력
toString()은 기본적으로 객체의 참조값을 출력한다.
그런데, toString()이나 hashCode()를 재정의하 객체의 참조값을 출력할 수 없다.
(-> 예를 들어, toString()을 재정의한 Dog의 경우 ObjectPrinter.print(dog1); 를 했을 때, 참조값이 아닌 Dog{dogName='멍멍이1', age=2}가 출력됐었음)
이때는 다음 코드를 사용하면 객체의 참조값을 출력할 수 있다.
String refValue = Integer.toHexString(System.identityHashCode(dog1));
System.out.println("refValue = " + refValue);
System.identityHashCode를 사용하면 참조값이 나오는데, 보통 16진수로 나타내므로 Integer.toHexString까지 해줌
실행결과
참고 강의 : 김영한 - 실전 자바 중급 1편
'Language > Java' 카테고리의 다른 글
[Java] java.lang 패키지 (0) | 2024.07.15 |
---|---|
Map, MultiValueMap의 차이 (1) | 2024.06.11 |
JAVA (자바) (0) | 2023.11.22 |