롬복 @ToStirng 정리

이동영·2024년 3월 9일

자바 개념정리

목록 보기
8/21

클래스 위에 @ToString 주석을 추가하게 되면 lombok이 자동으로 toString()을 구현해준다. 필드 이름을 포함할지의 여부는 설정할 수 있지만 그렇지 않으면 toString()의 형식은 고정되어 있다. 클래스의 모든 필드를 문자열로 변환하여 반환하는 기본 형식을 따라갈 것이다.

정리 : 옵션을 설정하지 않으면 모든 필드를 문자열로 변환하여 반환하는 기본 형식을 따라간다.
이 예제는 toStirng을 사용할경우 필드의 이름과 값을 보여주는 예시이다.

MyClass(foo=123, bar=234)

includeFieldNames

  • includeFieldNames 매개변수를 false로 설정하게 되면 필드의 이름을 생략하고 필드의 값만 표출하게 된다.
  • includeFieldNames의 속성을 false로 설정하면 필드의 이름과 값이 모두 출력이 된다. includeFieldNames의 기본 속성은 true이다.
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)으로 선언하여 콘솔 로그를 확인하였더니 값만 출력하게 되었다.

ToString제외하기

기본적으로 모두 비정적 필드가 출력이되며 특정 필드를 제외시키려면 두 가지 옵션을 사용할 수 있다.
1. @ToString.Exclude : 출력에서 제외하려는 필드에 선언하면 ToStirng에서 제외된다.
2. @ToString(onlyExplicitlyIncluded = true) : 출력시키고 싶은 필드만 출력할 수 있다.

@ToString.Exclude 예제 및 결과

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만 나오는것을 확인할 수 있다.

@ToString(onlyExplicitlyIncluded = true) 예제 및 결과

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의 형태로 출력된것을 볼 수 있다.

@ToString의 callSuper속성은

callSuper속성은 클래스의 toString()에 부모클래스의 toStirng() 출력을 포함할지 여부를 결정한다.

기본동작

  • 기본적으로 toString()은 현재 클래스에서 정의된 필드만 출력한다.
  • callSuper속성을 true로 설정하면 부모 클래스의 toStirng()도 출력하게 된다.
    정리 : 상속받은 자식 클래스에 toString()을 사용하면 자식클래스의 toString()만 출력이 되지만 callSuper속성을 true로 설정하면 상속받은 부모 클래스의 toString()도 같이 호출이 된다.

callSuper 속성을 사용하는 이유

  • java.lang.Object 클래스의 기본 toString()은 클래스 이름과 해시코드만 반환하여 별로 유용하지 않다.
  • 부모 클래스의 필드를 출력하고 싶을 경우에 사용할 수 있다.

callSuper 속성을 사용해야 할 때

  • 완전한 정보의 출력을 위해 부모 클래스와 결합해야 하는 경우
  • 상속 받은 클래스의 toString() 메서드가 유용한 정보를 제공하는 경우 예를들어 필드 값, 객체 상태, 객체 식별 정보 등을 제공하는 메서드가 부모 클래스에서 정의된 경우
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로 선언하면 부모클래스의 필드 내용도 로그에 출력할 수 있다.

profile
가치를 제공하는 개발자

0개의 댓글