애너테이션 (1)

 

 

 

❑ 열거형(Enum)

 

 

➤ enum이란?

 

enumeration : 열거, 목록

관련이 있는 상수들의 집합

자바에서 final로 선언하는 상수(고정된 값)들을 집합으로 묶어 놓은 것이다.

enum형 상수도 객체이다

JDK 1.5 버전부터 생김

 

 

➤ 문법

 

enum 열거형이름 { 상수명1, 상수명2, 상수명3, ... }

 

enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

 

열거형의 원소들은 대소문자 모두 사용 가능하지만 상수는 대문자로 작성하는 관례가 있음

 

 

 

➤ 사용법

 

enum은 쉽게 말하자면 class 처럼 사용하면 된다.

class 자리에 enum을 작성하고

사용할 때 클래스의 static 변수를 참조하는 것과 같은 방법으로 사용하면 된다.

 

System.out.println(Day.MONDAY);

 

열거형의 객체를 생성해서 값을 할당할 수 있다.

 

Day today = Day.THURSDAY;
System.out.println(today);	// THURSDAY 출력

 

 

 

 

➤ 열거 객체 메소드

 

enum

name()

ordinal()

compareTo(비교값)

valueOf(String name)

values()

 

 

➤ enum을 사용하는 이유

 

상수를 하나씩 선언하는 것보다 코드가 단순, 가독성이 좋음

인스턴스 생성과 상속을 방지

키워드를 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있음

 

 

 

➤ public static final의 문제점 ⚠️ 헷갈리는 개념

 

'public static final'을 이용해서 하나씩 상수를 선언하게 되면

-> 중복이 발생할 수 있다.

-> 이부분은 인터페이스에 상수를 작성해서 일차적으로 해결 가능하지만

인터페이스는 타입 안정성의 문제가 생긴다.

인터페이스를 사용해서 넣은 상수 값끼리 서로 비교 가능한 문제가 발생한다.

직접 비교해도 에러가 발생하지 않아서 타입안정성이 떨어지게 된다.

비교자체가 불가능하게 하려면 서로 다른 객체로 만들어야 한다.

이 부분은 공부해도 아직 설명할 정도로 이해하진 못했다. 추후에 공부필요!

객체를 따로따로 만들면 코드 안정성은 올라가지만 switch문에 사용은 못함

enum은 switch문에 사용 가능

 

 


 

 

❑ 애너테이션(Annotation)

 

주석과 비슷한 것

@ 로 나타냄

애너테이션은 주석처럼 프로그램에 영향을 미치지 않음

 

 

➤ 주석 vs 애너테이션

 

누구를 위한 정보인가?

주석: 코드를 읽는 사람

애너테이션: 프로그램

 

 

 

➤ 애너테이션의 용도

 

프로그램에 직접적으로 영향을 미치진 않으면서 컴파일러에게 정보를 제공해줄 때 사용한다.

예를 들어서 자주 쓰는 애너테이션인 @Override는 컴파일러에게 밑의 메소드가 상위 클래스의 메소드를 오버라이딩한 메소드라는 것을 알려준다.

그래서 메소드 이름의 오타같은 문제를 컴파일러가 잡아줄 수 있도록 해준다.

만약에 @Override로 컴파일러에 정보를 제공하지 않는다면 어떤 문제가 생길까?

만약에 상위 클래스에서 run()이라고 정의한 메소드가 있다고 생각하자.

그리고 하위 클래스에서 이 메소드를 재정의해서 작성하려는데 급하게 코딩하다가 rnu()이라고 오타를 냈다고 가정해보자.

이때 프로그램을 실행하게 되면 컴파일러는 이 rnu()이라는 오타난 메소드를 상위 클래스의 메소드를 재정의한 메소드가 아닌 새로 정의한  아예 새로운 메소드라고 인식한다.

이런 문제를 방지하기 위해 컴파일러에 @Override 라는 애너테이션으로 정보를 제공하고 컴파일러는 개발자가 잘못 작성한 부분을 오류로 알려주게 된다.

 

 

 

➤ 애너테이션의 종류

 

표준 애너테이션

자바에서 기본 제공하는 애너테이션

@Override : 컴파일러에게 메서드를 오버라이딩하는 것이라고 알림

@Deprecated : 앞으로 사용하지 않는다고 알림

@FunctionalInterface : 함수형 인터페이스임을 알림

@SuppressWarning : 컴파일러가 경고메세지를 나타내지 않음

 

 

메타 애너테이션

애너테이션에 붙는 애너테이션, 애너테이션을 정의하는데 사용

@Target : 애너테이션을 정의할 때 적용 대상을 지정하는데 사용

@Documented : 애너테이션 정보를 javadoc으로 작성된 문서에 포함시킴

@Inherited : 애너테이션이 하위 클래스에 상속되도록 함

@Repeatable : 애너테이션을 반복해서 적용할 수 있게 함

 

 

사용자 정의 애너테이션

사용자가 직접 정의하는 애너테이션

 

읽어주셔서 감사합니다 😍

오개념에 대한 지적은 언제나 환영입니다

 

1