클래스 위에 @ToString 주석을 추가하게 되면 lombok이 자동으로 toString()을 구현해준다. 필드 이름을 포함할지의 여부는 설정할 수 있지만 그렇지 않으면 toString()의 형식은 고정되어 있다. 클래스의 모든 필드를 문자열로 변환하여 반환하는 기본 형식을 따라갈 것이다.
정리 : 옵션을 설정하지 않으면 모든 필드를 문자열로 변환하여 반환하는 기본 형식을 따라간다.
이 예제는 toStirng을 사용할경우 필드의 이름과 값을 보여주는 예시이다.
MyClass(foo=123, bar=234)
package com.example.todaysmenu.restaurant.controller;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@ToString(includeFieldNames = false)
public class Lom {
private String name;
private int age;
}
class LomMain {
public static void main(String[] args) {
Lom lom = new Lom("dongyoung",28);
System.out.println(lom);
}
}

결과 : 다음 예제에서는 @ToString(includeFieldNames = false)으로 선언하여 콘솔 로그를 확인하였더니 값만 출력하게 되었다.
기본적으로 모두 비정적 필드가 출력이되며 특정 필드를 제외시키려면 두 가지 옵션을 사용할 수 있다.
1. @ToString.Exclude : 출력에서 제외하려는 필드에 선언하면 ToStirng에서 제외된다.
2. @ToString(onlyExplicitlyIncluded = true) : 출력시키고 싶은 필드만 출력할 수 있다.
package com.example.todaysmenu.restaurant.controller;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@ToString
public class Lom {
private String name;
@ToString.Exclude
private int age;
}
class LomMain {
public static void main(String[] args) {
Lom lom = new Lom("leedongyoung",29);
System.out.println(lom);
}
}

결과 : @ToString어노테이션을 클래스 위에 선언하고 @ToString에서 제외시키고 싶은 필드에 @ToString.Exclude를 붙여 필드의 이름과 내용을 출력에서 제외하는 예제이다. age필드에 해당 어노테이션을 선언하여 출력에서 제외되 name 필드의 이름과 값인 leedongyoung만 나오는것을 확인할 수 있다.
package com.example.todaysmenu.restaurant.controller;
import lombok.AllArgsConstructor;
import lombok.ToString;
@ToString(onlyExplicitlyIncluded = true)
@AllArgsConstructor
public class Lom {
@ToString.Include
private String name;
private int age;
}
class LomMain {
public static void main(String[] args) {
Lom lom = new Lom("leedongyoung",29);
System.out.println(lom);
}
}

결과 : @ToString(onlyExplicitlyIncluded = true)를 선언하고 출력하고 싶은 필드에만 @ToString.Include를 선언하면 해당 필드만 콘솔창 혹은 로그에 출력시킬 수 있다. 예제에서는 name필드에만 선언하였더니 결과로는 name필드의 이름과 값인 leedongyoung의 형태로 출력된것을 볼 수 있다.
callSuper속성은 클래스의 toString()에 부모클래스의 toStirng() 출력을 포함할지 여부를 결정한다.
package com.example.todaysmenu.restaurant.controller;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
public class Lom {
private String name;
private int age;
@Override
public String toString() {
return "name : " + name + "," + "age : " + age;
}
}
@ToString
class LomChild extends Lom {
private String childName;
public LomChild(String name, int age,String childName) {
super(name, age);
this.childName = childName;
}
}
class LomMain {
public static void main(String[] args) {
LomChild lomChild = new LomChild("lom",28,"childLom");
System.out.println(lomChild);
}
}

결과 : 해당 예제에서는 부모인 Lom클래스를 상속받고 @ToString을 사용하였더니 출력 결과는 차식 클래스에만 정의된 필드만 나오게 된다. 그러면 부모 클래스도 같이 출력하고 싶은 경우 어떻게 해야할 까?
@ToString(callSuper = true)
class LomChild extends Lom {
private String childName;
public LomChild(String name, int age,String childName) {
super(name, age);
this.childName = childName;
}
}

결과 : 차식 클래스에 @ToString(callSuper = true)으로 callSuper속성을 true로 선언하면 생성자에서 초기화한 부모 필드의 값도 log에 전부 출력할 수 있다.
정리 : 부모 필드에서 Object클래스의 toString메서드를 재정의를 전제로 자식 클래스에서 일반적인 @ToString을 선언하면 해당 클래스의 필드 내용만 출력하게 된다. 하지만 callSuper을 true로 선언하면 부모클래스의 필드 내용도 로그에 출력할 수 있다.