The Boxer
Lombok 본문
[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
'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 |