CS ( Computer Science )/알고리즘과 데이터 구조 (Algorithms and Data Struct

[AG&DS] 어노테이션 (Annotation)

JABHACK 2024. 12. 8. 20:34

Annotation

📌 코드에 메타데이터를 추가할 수 있는 기능을 제공하며 주로 코드에 특별한 의미를 부여하거나, 컴파일러와 런타임에 특정 동작을 트리거하기 위해 사용된다.

  • 어노테이션은 코드에서 직접적인 로직 실행에 영향을 미치지 않지만, 코드의 의미를 설명하거나 추가적인 처리를 위해 사용됩니다.
  • "명함"를 생각하면 편하다. 이 명함은 "사람"에서 "프로그래머인 사람"이 된다. 사람이라는 정체성은 그대로이지만, 이 사람의 용도를 알 수 있다. 코드의 용도를 표시하며 실제로 컴파일러도 그 의미를 알지만 프로그램(사람) 자체에는 변화가 없다.

[1]  어노테이션 정의

  • 어노테이션은 @ 기호로 시작하며, 클래스, 메서드, 변수, 매개변수, 패키지 등에 추가할 수 있다.

[2]  내장 어노테이션

  • @Override
    • 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이드하고 있음을 나타낸다.
      • 이때 컴파일러는 메서드가 실제로 오버라이드하고 있는지 확인한다.
  • @Deprecated
    • 해당 요소가 더 이상 사용되지 않음을 나타낸다.
    • 해당 어노테이션이 붙은 코드를 사용하면 컴파일 경고가 발생한다.
  • @SuppressWarnings
    • 컴파일러 경고를 억제한다.
      • 사용되지 않는 변수에 대한 경고를 무시할 수 있다.

[3]  사용자 정의 어노테이션

  • 개발자가 필요에 따라 직접 어노테이션을 정의할 수 있다.
  • 사용자 정의 어노테이션은 특정 메타데이터를 추가하거나,
  • AOP(Aspect-Oriented Programming) 같은 기술과 결합하여 다양한 기능을 구현할 수 있다.
    • AOP는 심화 주차에 배울 내용

 

Lombok

📌 Java에서 반복적인 코드를 줄여주는 라이브러리로, 코드의 가독성과 유지보수성을 높이는 데 도움이 됩니다. 주로 getter, setter, toString, equals, hashCode 메서드와 같은 보일러플레이트 코드를 자동으로 생성해줍니다.

 

[1]  Lombok 사용 시 장점:

  • 보일러플레이트 코드 감소: Lombok은 반복적인 코드(예: getter, setter, 생성자 등)를 자동으로 생성해 주어 코드가 간결해집니다.
  • 코드의 가독성 향상: 중요한 로직에 집중할 수 있어 코드가 더 깔끔하고 이해하기 쉬워집니다.
  • 생산성 향상: 반복적인 코드 작성에 소모되는 시간을 절약할 수 있습니다.

 

[2]   Lombok 사용 시 단점:

  • 자동 생성된 코드의 가시성 부족: Lombok은 컴파일 시 코드 생성이 이루어지기 때문에, IDE에서 코드가 어떻게 처리되는지 확인하기 어려운 경우가 있습니다.
  • 디버깅 어려움: Lombok이 생성한 코드는 실제로 파일에 존재하지 않기 때문에, 디버깅 시 자동으로 생성된 메서드를 추적하는 데 어려움이 있을 수 있습니다.

 

@Getter, @Setter

  • 클래스의 모든 필드에 대한 getter와 setter 메서드를 자동으로 생성한다.
  • 예시 코드
@Getter
@Setter
public class User {
    private String name;
    private int age;
  
  /** 아래 코드를 @Getter, @Setter 어노테이션이 생성해준다.
    public String getName() {
	    return name;
    }

    public void setName(String name) {
	    this.name = name;
    }
    
    public int getAge() {
	    return age;
    }

    public void setAge(int age) {
	    this.age = age;
    }
    **/
}

위 코드에서 getName(), setName(String name), getAge(), setAge(int age) 메서드가 자동으로 생성된다.



@ToString

  • 객체의 toString() 메서드를 자동으로 생성한다.
  • 기본적으로 클래스의 모든 필드를 포함하며, 특정 필드를 제외하거나 포맷을 지정할 수도 있다.
  • 예시코드
@ToString
public class User {
    private String name;
    private int age;
}
  • toString() 메서드는 객체를 String으로 변환해주는 역할을 수행한다.

@EqualsAndHashCode

  • equals()와 hashCode() 메서드를 자동으로 생성한다.
  • 객체의 동일성과 해시 코드를 정의하는데 사용된다.
  • 예시 코드
@EqualsAndHashCode
public class User {
    private String name;
    private int age;
}

 


 

@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

  • 기본 생성자를 생성한다.
  • 모든 필드를 매개변수로 하는 생성자를 생성한다.
  • 필수(final) 필드만을 매개변수로 하는 생성자를 자동으로 생성한다.
  • 예시 코드
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

 

@Data

  • @Getter, @Setter, @ToString, @EqualsAndHashCode,@RequiredArgsConstructor를 한꺼번에 적용하는 어노테이션이다.
  • 주로 테스트 용도로 사용한다.
  • 예시 코드
@Data
public class User {
    private String name;
    private int age;
}

@Builder

  • 빌더 패턴을 적용해 객체를 생성할 수 있게 합니다. 복잡한 객체 생성에 유용하며, 필드 이름을 명시적으로 지정하면서 객체를 생성할 수 있다.
  • 예시 코드
@Builder
public class User {
    private String name;
    private int age;
}
  • 사용 예시
User user = User.builder()
                .name("John")
                .age(30)
                .build();

@Slf4j

  • 클래스에 로그를 남기기 위한 Logger 객체를 자동으로 생성한다.
  • 예시 코드
@Slf4j
public class UserService {
    public void logMessage() {
        log.info("This is a log message");
    }
}