@
기호로 시작하며 클래스, 메서드, 변수, 매개변수, 패키지 등에 추가할 수 있다.✔️ 자주 사용되는 내장 어노테이션
@Override
: 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이드하고 있음을 나타낸다. 컴파일러가 실제로 오버라이드하고 있는지 확인한다. @Override
public String toString() {
return "Example";
}
@Deprecated
: 해당 요소가 더 이상 사용되지 않음을 나타내며, 사용 시 컴파일 경고를 출력한다. @Deprecated
public void oldMethod() {
System.out.println("This method is deprecated.");
}
@SuppressWarnings
: 컴파일러 경고를 무시한다. 경고의 종류(ex. unchecked, deprecation)를 지정할 수 있다. @SuppressWarnings("unchecked")
List list = new ArrayList();
강의에서는 위의 3가지 어노테이션만 설명했지만, 다른 어노테이션도 추가로 찾아보았다.
@FunctionalInterface
: 메타데이터만 제공하며 속성이 없고, 함수형 인터페이스임을 명시한다.@SafeVarargs
: 제네릭 가변인자의 안전성을 컴파일러에게 보증한다. 개발자가 안전성을 직접 확인해야 한다.@Retention
: 어노테이션의 유지 정책을 설정한다.@Target
: 어노테이션을 적용할 위치(클래스, 메서드, 필드 등)를 제한한다.@Documented
: 어노테이션이 Javadoc에 포함되도록 지정한다.@Inherited
: 클래스에만 적용 가능하며, 어노테이션을 서브 클래스에서 자동으로 상속한다.@Test
: JUnit 테스트 메서드를 표시한다.@BeforeEach
/ @AfterEach
: 테스트 메서드 실행 전/후에 실행할 작업을 지정한다.@ParameterizedTest
: 여러 입력 값을 사용하여 동일한 테스트를 반복 실행한다.어노테이션은 개발자가 필요에 따라 직접 정의할 수 있다. 사용자 정의 어노테이션은 특정 메타데이터를 추가하거나, AOP(Aspect-Oriented Programming) 같은 기술과 결합하여 다양한 기능을 구현할 수 있다.
✔️ 주요 Lombok 어노테이션
@Getter
/ @Setter
: 클래스의 모든 필드에 대한 getter와 setter 메서드를 자동으로 생성@ToString
: 객체의 toString()
메서드를 자동으로 생성@EqualsAndHashCode
: equals()
와 hashCode()
메서드를 자동으로 생성@NoArgsConstructor
/ @AllArgsConstructor
/ @RequiredArgsConstructor
: 기본 생성자를 생성 / 모든 필드를 매개변수로 하는 생성자 생성 / 필수(final) 필드만을 매개변수로 하는 생성자 생성@Data
: @Getter
, @Setter
, @ToString
, @EqualsAndHashCode
,@RequiredArgsConstructor
를 한꺼번에 적용하며, 주로 테스트 용도로 사용@Builder
: 빌더 패턴을 적용해 객체 생성@Slf4j
: 클래스에 로그를 남기기 위한 Logger
객체를 자동으로 생성spring-boot-starter-web
를 빌드 관리 도구에 추가 시, 웹 애플리케이션에 필요한 모든 종속성과 설정 자동 구성✔️ Gradle의 특징
해시 자료 구조를 사용할 때는 hashCode()
와 equals()
메서드를 반드시 재정의해서 사용해야 한다.
hashCode()
와 equals()
는 Object 클래스의 기본 기능 중 하나이다.
hashCode()
: 객체의 참조값을 기반으로 해시 코드를 반환한다.equals()
: == 동일성 비교를 한다. 따라서 객체의 참조값이 같아야 true 를 반환한다.재정의하지 않으면, Object가 기본으로 제공하는 hashCode()
와 equals()
를 사용한다. 만약 id로 회원을 저장하고, 검증한다고 할때 id가 아닌 객체의 참조값을 기반으로 작동한다면 문제가 발생할 것이다.
또한, 각 해시 인덱스 안에 여러 개의 데이터가 아니라 하나의 데이터만 있다면 equals()
를 하지 않아도 될까? 다음 set 출력값에서 [A]
, [AB]
등과 같이 해시 충돌 없이 하나의 데이터만 들어가 있다고 해서 equals()
를 하지 않아도 되는 것은 아니다.
MyHashSet{buckets=[[], [AB], [], [], [], [A], [B, SET], [C], [D], []]}
해시 인덱스가 같아도 실제 저장된 데이터는 다를 수 있다! equals()
를 재정의하지 않는다면 'B'와 'SET'의 해시 인덱스 값이 같고 [B]
만 저장했을 때, 'SET'을 검색했는데 'B'가나오는 오류가 발생할 수 있다.
오늘은 강의만 쭉 들어서 조금 지루했다..졸려서 여러 강의를 돌려가며 들었다. 한동안은 강의를 많이 들어야 할텐데 더 효율적으로 공부하는 법과 잠을 떨쳐내는 법을 생각해봐야겠다.😴