본문 바로가기

프로그래밍/libGDX

Lombok - 자바 코드를 다이어트 시키자

Lombok 

Lombok는 Java의 코드를 다이어트 시켜주기 위해 나왔습니다. Java는 단점이 꽤 많습니다. 큰 단점중 하나가 여러가지 정보를 일일히 입력해야 하다 보니까 코드가 너무 길어진다는 것입니다. Getter/Setter 메쏘드를 하나씩 만들어 주려면 메쏘드간의 띄어쓰기 까지 포함해서 8줄이 필요합니다.

private T a;

public T getA () {
    return a;
}

public void setA(T a) {
    this.a = a;
}

의미는 코딱지만한데 코드는 쓸데없이 깁니다. 이렇게 쓸데 없이 길게 만드는 코드 중에서 자주 사용되는 코드들을 어노테이션을 활용하여 제거하기 위해 나온 것이 Lombok 입니다. 


Lombok의 대표적인 Annotation

Lombok은 다음과 같은 어노테이션들을 제공합니다.

@Getter/@Setter

위에서 언급했던 Getter와 Setter입니다. 이 어노테이션을 사용하면 위에서 작성했던 코드를 아래와 같이 사용할 수 있습니다.

private @Getter @Setter T a;

!!!

한줄로 끝낼 수 있게 됩니다. Getter와 Setter는 굉장히 많이 쓰이면서 쓸데없이 코드를 길게하는 대표주자이기 때문에 Lombok을 사용할 때 가장 많이 사용하게 되는 어노테이션입니다.

@ToString

toString 메쏘드를 자동으로 만들어 줍니다. 클래스에 있는 필드들을 조사해서 적절히 string으로 만들어 줍니다.

@EqualsAndHashCode

자동으로 equlas와 hashcode 메쏘드를 만들어 줍니다.

@Data

Data를 사용하면 모든 private 필드에 @Getter와 @Setter를 적용시키고, 클래스에 @ToString 과 @EqualsAndHashCode를 적용시킵니다. 데이터 클래스에 사용하면 그야말로 뚱뚱이가 쭉쭉빵빵 개미허리가 되버리는 듯한 느낌이 듭니다.

@Data를 사용한 모습오른쪽 Outline 패널에 수많은 메쏘드들이 자동생성된 것을 볼 수 있습니다.


val

불변의 지역변수를 만들 수 있습니다. 현재 val은 필드에는 적용되지 않고 지역 변수에만 적용됩니다. final를 붙인 것과 비슷한 효과를 갖어옵니다. 또한 val은 타입을 유추하기 때문에 타입을 따로 쓰지 않고 지역변수를 선언할 수 있습니다.

Delegate

한 클래스에 다른 클래스의 메쏘드들을 위임시킬 수 있습니다. 다시 말하면 A라는 클래스와 B라는 클래스가 있으면 A에는 B클래스에 있는 메쏘드들이 생기게 되고 해당 메쏘드는 B의 메쏘드를 호출하는 형식이 됩니다. 예를 들면 다음과 같습니다.

public class DelegationExample {
    @Delegate(types=List.class)
    private final List names = new ArrayList();
}

위의 코드는 아래 코드와 일치합니다.

public class DelegationExample {
    private final List names = new ArrayList();

    public boolean add(final String item) {
        return this.names.add(item);
    }

    public boolean remove(final String item) {
        return this.names.remove(item);
    }

    //...그 외의 List의 메쏘드들
}

특정 인터페이스의 정보를 이용하여 위임할 클래스에 있는 메쏘드들을 위임받을 클래스들에게 위임시키게 됩니다. 위에 예제에서 List 인터페이스를 쓰자 않고 따로 List 인터페이스와 똑같은 이름을 가진 메쏘드들을 갖은 인터페이스를 따로 만들어서 @Delegate 타입에 넣어주게 되면 원하는 메쏘드들만 위임시킬 수 있습니다. 예를 들어 아래와 같습니다.

public class DelegationExample {
    private interface SimpleCollection {
        boolean add(String item);
        boolean remove(Object item);
    }

    @Delegate(types=SimpleCollection.class)
    private final List names = new ArrayList();
}


Lombok 사용하기

Lombok의 기능들에 대해 간략하게 알아봤습니다. 그러면 직접 사용해 보도록 할까요? 

여기서는 이클립스에 Lombok을 적용하는 방법을 설명하도록 하겠습니다. 다른 환경에서 사용 방법은 홈페이지를 참고하세요. (사실 이클립스에서만 롬복을 사용해 봤습니다.) 먼저 공식홈페이지에 들어가서 Lombok을 다운받습니다. Lombok을 받았으면 실행시킵니다. 그러면 아래와 같은 화면이 뜨게 됩니다. Specify location을 눌러서 이클립스의 위치를 지정해 줍니다. 그리고 나서 오른쪽에 있는 Install/Update를 누릅니다.


Lombok 인스톨Lombok 실행화면

Install을 누르면 eclipse에 lombok이 적용됩니다. Install 후에 해당 이클립스 폴더에 들어가 보면 lombok.jar 파일이 추가되어 있는 것을 확인할 수 있습니다.


이클립스 폴더 안에 lombok이 추가되었다이클립스 폴더 안에 lombok이 추가된 화면


이클립스에 lombok이 적용되었습니다. 마지막으로 프로젝트에도 lombok.jar 파일을 추가해 주셔야 합니다. (아니면 classpath에 lombok.jar을 추가해 주세요) 마지막 작업까지 마무리 되면 이클립스에서 lombok을 사용할 수 있게 됩니다.


마무리

자바는 정말 쓸게 많아서 손이 굉장히 힘든 언어이지만, lombok을 사용하면 코드를 획기적으로 줄일 수 있습니다. 하지만 lombok을 사용하여 만들어진 코드를 다른 사람이 컴파일 하기 위해서는 다른 사람들도 모두 lombok을 설치해야 한다는 단점이 있습니다. 협업을 할때는 lombok을 사용할지 말지 사전에 협의를 해야할 것 같습니다. (당연한 말이지만) 어느정도 불편함을 감수하더라도 기능이 너무 유용하기 때문에 저는 lombok을 사용하는 것을 추천드립니다.