The Boxer

Lombok 본문

Java

Lombok

Prower 2018. 10. 2. 21:32
728x90
반응형

[Lombok]

Java에서 사용하는 다양한 기능들을 annotation으로 처리할 수 있게 하는 라이브러리

annotation으로 처리를 하기 때문에 반복되는 코드 사용을 줄일 수 있음


[Lombok의 종류]

Stable

Lombok에서 사용하는 것을 추천하는 기능들.


[val, var]

타입이 정해지지 않은 객체 혹은 변수를 선언 가능.

- annotation없이 변수명 앞에 선언하여 사용

- 지역변수로만 선언 가능(클래스 변수로는 선언 불가)

- val과 var의 기능은 같으나 val은 final이기 때문에 값 변경이 불가

사용 예시

import lombok.*;

import java.util.Stack;

public class ValAndVar {
val classValue = 10; //#에러발생 : class 변수로는 사용 불가
var classVariable = 20; //#에러발생 : class 변수로는 사용 불가

public void method() {
val value = 10; //val 선언
var variable = 20; //var 선언
value = 20; //#에러발생 : val은 final이기 때문에 값 변경 불가
variable = 10; //var은 변경 가능

val strValue = "strValue"; //val, var은 String도 사용 가능
var strVariable = "strVariable";
strValue = "strVariable"; //#에러발생 : val은 final이기 때문에 사용 불가
strVariable = "strValue";

val stack = new Stack<Integer>(); //Stack등의 클래스도 사용가능
var person = new Person(); //사용자 지정 클래스도 가능
}
}

class Person {

}


[@NonNull]

매개변수의 Null값 여부를 검사. 매개변수가 Null일 경우 Exception처리

- Constructor와 Method에서 사용 가능

- Constructor와 Method의 매개변수 앞에 annotation으로 선언하여 사용

- if(str == null) throw new NullPointException과 동일한 기능

사용 예시

import lombok.NonNull;

public class Nonnull {
int integer;
String str;

public Nonnull(@NonNull int integer, @NonNull String str) { //Constructor의 null check용으로 사용,
this.integer = integer;
this.str = str;
}

public void method(@lombok.NonNull int integer, @lombok.NonNull String str) { //Method의 null check용으로 사용, Null일경우 Exception처리
this.integer = integer;
this.str = str;
}

public void normalMethod(int integer, String str) { //일반 Method에서 Null일경우 null 출력
this.integer = integer;
this.str = str;
}
}


[@CleanUp]

코드의 scope가 끝나기 전에 자동적으로 원소를 비움

- stream의 close와 유사한 기능

- 사용 변수명 앞에 annotation으로 선언하여 사용

사용 예시

import lombok.Cleanup;

import java.io.*;

public class CleanUp {
public static void main(String args[]) {
try {
@Cleanup InputStream inputStream = new FileInputStream("input.txt"); //close 불필요
@Cleanup OutputStream outputStream = new FileOutputStream("outut.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}

//데이터 처리...
}
}


[@Getter, @Setter]

클래스나 클래스 내부의 변수에 선언하여 변수들의 Getter와 Setter를 생성

- 변수 앞에 annotation으로 선언하여 사용

- 두개를 동시에 사용할 수도 있음

- 선언 후 AccessLevel을 설정하여 Getter와 Setter의 접근지정자 적용

- 클래스에도 사용 가능하며, 클래스에 사용시 모든 변수의 Getter나 Setter를 생성

- 적용하고 싶지 않을 경우에는 AccessLevel을 NONE으로 설정

사용 예시

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;


public class GetterAndSetter {
@Getter @Setter private int integer; //integer의 Getter, Setter 생성
@Setter public String str; //하나만 사용 가능
@Getter(AccessLevel.PROTECTED) char character; //접근 지정자 설정해서 사용


public static void main(String args[]) {
GetterAndSetter getterAndSetter = new GetterAndSetter();
Phone phone = new Phone();

getterAndSetter.getCharacter();
getterAndSetter.getInteger();
getterAndSetter.setInteger(1);
getterAndSetter.setStr("something");

phone.getName();
phone.getNumber();
phone.getModel(); //#에러발생 : getModel은 생성되지 않음
}
}

@Getter //모든 변수에 @Getter를 적용
class Phone {
private int number;
public String name;
@Getter(AccessLevel.NONE) public String model; //AccessLevel을 NONE으로 설정
}


[@ToString]

클래스의 ToString을 생성

- 클래스 앞에 @ToString을 붙임으로써 간단하게ToString 생성

- static이 아닌 필드만 출력

- @ToString.Exclude를 앞에 붙여 출력에 포함시키지 않을 수 있음

- callSuper = true 옵션 추가시 해당되는 클래스의 super클래스 주소도 같이 출력

- @includeFieldNames = true옵션을 추가하고 @ToString.Include를 붙이면 해당 필드 출력

- Method에도 가능. Method내부의 변수 출력.
*주의 : 매개변수가 없고 static이 아닌 Method만 가능

- @ToString.Include(rank = -1)로 출력 우선순위 설정 가능
rank에 대입한 수가 높을수록 먼저 출력. 기본값은 0

사용 예시

import lombok.ToString;


@ToString
public class Tostring {
private static int staticNumber = 10; //static은 출력 안됨
private String includedString = "String"; //string 출력
private int includedNumber = 20; //int 출력
@ToString.Exclude private int excludedNumber = 30; //Exclude로 출력 방지
private Square square = new Square(40, 50); //Square변수 출력
@ToString.Include(rank = 10) private int rankFirst = 100;
@ToString.Include(rank = 9) private int rankSecond = 90;

@ToString.Include public int method(){ //method도 출력, 하지만 no args의 경우에만
return 10;
}

public static void main(String args[]) {
Tostring tostring = new Tostring();

System.out.println(tostring.toString());
}
}


class Shape {
private int width, height;

public Shape(int width, int height) {
this.width = width;
this.height = height;
}
}


@ToString(callSuper = true, includeFieldNames = true)
class Square {
@ToString.Include private int width; //포함
@ToString.Exclude private int height; //미포함, 출력 방지

public Square(int width, int height) {
this.width = width;
this.height = height;
}
}

출력결과

Tostring(rankFirst=100, rankSecond=90, includedString=String, includedNumber=20, square=Square(super=Square@25618e91, width=40), method=10)


[@No/Required/All-ArgsConstructor]

클래스 앞에 선언하여 클래스의 생성자를 자동으로 생성

- NoArgsConstructor : NonNull, final등도 예외 없이 어떤 변수에 대해서도 인자를 받지 않는 생성자 생성. 초기화 되어있지 않다면 0/false/null으로 자동 초기화

RequiredArgsConstructor : NonNull, final등의 필요한 변수에 대해서만 인자를 받는 생성자 생성.

AllArgsConstructor : 모든 변수에 대해 인자를 받는 생성자 생성.

- 3기능 모두 변수 받는 순서는 클래스 내 선언된 순서.

- 3기능 모두 (staticName = "name")을 선언하여 "name"을 사용해 생성사 호출 가능

사용 예시

import lombok.*;

public class ArgsConstructor {
public static void main(String args[]) {
var noArgsConstruct = new NoArgsConstruct();
var requiredArgsConstruct = new RequiredArgsConstruct("string");
var allArgsConstruct = AllArgsConstruct.aac("string", "nullring", 20);

System.out.println(noArgsConstruct.toString());
System.out.println(requiredArgsConstruct.toString());
System.out.println(allArgsConstruct.toString());
}
}

@NoArgsConstructor //인자를 받지 않는 생성자 생성. 0/null/false로 자동 초기화. NonNull, final도 자동 초기화.
@ToString
class NoArgsConstruct {
private String string;
@NonNull private String nullString;
private int number;
}

@RequiredArgsConstructor //NonNull, final등의 반드시 초기화 해야 하는 변수만 인자로 받는 생성자 생성.
@ToString
class RequiredArgsConstruct {
private String string;
@NonNull private String nullString;
private int number;
}

@AllArgsConstructor(staticName = "aac") //모든 변수에대해 인자를 받는 생성자 생성. aac라는 이름을 사용하여 생성자 생성 가능.
@ToString
class AllArgsConstruct {
private String string;
@NonNull private String nullString;
private int number;
}

출력결과

NoArgsConstruct(string=null, nullString=null, number=0)

RequiredArgsConstruct(string=null, nullString=string, number=0)

AllArgsConstruct(string=string, nullString=nullring, number=20)


[@Data]

@Getter, @Setter, @EqualsAndHashCoded, @ToString, @RequiredArgsConstructor를 모아 놓은 기능

- 클래스 앞에 선언하여 사용

- @Getter와 @Setter는 public으로 선언됨

- callSuper, includeFieldNames, exclude등의 옵션은 사용 불가

- (staticConstructor = "")옵션 사용하여 생성자 호출을 대신하는 기능은 사용 가능

- 세부설정을 위해선 각각의 annotation을 선언해야 함


[@Value]

@Data와 동일한 기능이지만 private, final등의 불변객체가 생성됨.

- Setter는 생성되지 않음

- 선언된 클래스도 final화 => 불변객체는 subclass로 속할 수 없기 때문

- (staticConstructor = "")옵션 사용하여 생성자 호출을 대신하는 기능은 사용 가능

- 세부설정을 위해선 각각의 annotation을 선언해야 함


[@Builder, @Singular]

클래스 앞, Constructor, Method에 선언하여 클래스에 Builder클래스 생성

- @Builder를 선언하면 자동으로 static Builder클래스가 내부에 생성됨

- Builder클래스 내부구조

* 기존 클래스 변수 하나당 1개의 non-static, non-final 변수

* private, no-args인 빈 Constructor

* 기존 클래스의 변수를 초기화할 Setter와 유사한 Method
Builder를 return하기 때문에 chaning이 가능

* build() : 기존 클래스의 형식을 return

* toString() : Builder에서만 사용 가능한 toString생성

- @Singular를 변수 앞에 선언시 Setter가 아닌 여러번 사용 가능한 Adder생성

- @Singular는 Collection타입에만 적용 가능(Iterable, Collection, List, Set, Map...)

- @Singular가 적용된 변수의 이름의 끝에는 항상 's'가 붙어야함 => 여러갯수를 표시하기 위함

- @Singular가 적용된 변수의 's'를 뺀 이름은 기존 변수와 같아도 되지만 타입은 달라야함

사용 예시

import lombok.Builder;
import lombok.Singular;

import java.util.List;

public class BuilderClass {
public static void main(String args[]) {
Person person = Person.builder()
.age(20)
.name("Person")
.created(1000)
.clearNumbers()
.number(100)
.number(200)
.build();

System.out.println(Person.builder().age(20).name("Person").clearNumbers().number(100).number(200).toString()); //Builder내부의 toString 사용
}
}

@Builder
class Person {
private String name;
private int age;
@Builder.Default private long created = System.currentTimeMillis(); //기본값(0, false, null)로 설정
@Singular private List<Integer> numbers;
// @Singular private List<String> names; #컴파일에러발생 : name과 같은 메소드가 생성됨. 타입이 다르면 상관 없음
// @Singular private List<String> abc; #에러발생 : @Singular의 변수명은 s가 붙도록
}

출력결과

Person.PersonBuilder(name=Person, age=20, created=0, numbers=[100, 200])


[@Log]

클래스 앞에 선언하여 종류에 맞는 Log객체를 생성

- Java에서 지원되는 다양한 종류의 Log객체 생성 가능

- 생성가능한 Log

* Log, Slf4j, Log4j, Log4j2, CommomsLog, Flogger등...

사용 예시

import lombok.extern.log4j.Log4j;

@Log4j
public class Logging {
public static void main(String args[]) {
log.error("Logger");
}
}

[ERROR] 2018-10-04 16:26:28.926 [main] Logging - Logger




728x90
반응형

'Java' 카테고리의 다른 글

자바 용어정리Spring - Beans와 POJO  (0) 2018.11.23
Synchronized  (0) 2018.10.19
Calllback과 Synchronous/Asynchronous  (0) 2018.09.27
log4j를 사용한 logging  (1) 2018.07.17
Interface를 사용한 Callback 구현  (0) 2018.07.16
Comments