Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발새발

#enum #애노테이션 본문

자바

#enum #애노테이션

개발하는후추 2022. 7. 27. 23:39

Enum - 열거형

  • 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 깨 사용
  • 타입에 안전한 열거형이라서 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생 —-> 값뿐만 아니라 타입까지 체크하기 때문에 타입에 안전하다

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

enum Seasons { SPRING, SUMMER, FALL, WINTER }. ——> 상수는 대소문자가 상관이 없지만 관례적으로 대문자로 적음

  • 클래스의 static변수를 참조하는 것과 동일한 방법으로 사용 열거형 이름.상수명
  • sout(Seasons.SUMMER);
  • Seasons타입의 다른 변수에 넣을 수 있다
  • Seasons hotSeason = Seasons.SUMMER;
    sout(hotSeason);

장점
1. 상수명의 중복을 피할 수 있다
2. 타입에 대한 안정성을 보장
3. 코드가 단순해지고 가독성이 좋아진다
4. switch문에 사용할 수 있다

열거 객체 메소드
리턴 타입 메소드(매개변수) 설명
String name() 열거 객체가 가지고 있는 문자열을 리턴하며, 리턴되는 문자열은 열거타입을 정의할 때 사용한 상수 이름과 동일합니다.
int ordinal() 열거 객체의 순번(0부터 시작)을 리턴합니다.
int compareTo(비교값) 주어진 매개값과 비교해서 순번 차이를 리턴합니다.
열거 타입 valueOf(String name) 주어진 문자열의 열거 객체를 리턴합니다.
열거 배열 values() 모든 열거 객체들을 배열로 리턴합니다.

Annotation - 어노테이션

  • 주석과 같은 기능을 수행
  • 애너테이션은 모두 소스 코드에 아무런 영향을 미치지 않으면서 정보를 제공
  • 단 ‘누구에게 정보를 제공하는가’에 주석과 애너테이션의 차이
  • 코드 사이에 주석처럼 츠로그래밍 언어에 영향을 미치지 않으면서 다른 프로그램에게 유용한 정보를 제공하는 역할

@Test // 아래 메서드가 테스트 대상임을 테스트 프로그램에게 알리는 애너테이션
public void run() {}

기능
1. 컴파일러에세 문법 에러를 체크하도록 정보 제공
2. 프로그램을 빌드할 때 코드를 자동적으로 생성할 수 있도록 정보 제공
3. 런타임에 특정 기능을 실행하도록 정보 제공

자바에서 기본저그올 제공하는 어노테이션 종류

  1. @Override
  • 선언한 메서드가 오버라이드 되었다는 것을 나타낸다
  • 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킨다
  1. @Deprecated
  • 해당 메서드가 더 이상 사용되지 않음을 표시
  • 만약 사용할 경우 컴파일 경고를 발생
  1. @SuppressWarnings
  • 선언한 곳의 컴파일 경고를 무시

애너테이션 설명
@SuppressWarings(”all”) 모든 경고를 억제
@SuppressWarings (”deprecation”) Deprecated 메서드를 사용한 경우 나오는 경고 억제
@SuppressWarings (”fallthrough”) switch문에서 break 구문이 없을 때 경고 억제
@SuppressWarings (”finally”) finally 관련 경고 억제
@SuppressWarings(”null”) null 관련 경고 억제
@SuppressWarings (”uncheched”) 검증되지 않은 연산자 관련 경고 억제
@SuppressWarings (”unused”) 사용하지 않는 코드 관련 경고 억제

  1. @SafeVarargs
  • Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시
  1. @FunctionalInterface
  • Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션
  • 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생

메타 어노테이션

  • 애너테이션에 붙이는 애너테이션으로, 애너테이션의 적용 대상이나 유지 기간을 정하는 등 애너테이션의 정의하는데 사용

종류

  1. @Retention
  • 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정
  • 종류는 다음과 같습니다.
    • RetentionPolicy.SOURCE : 컴파일 전까지만 유효. (컴파일 이후에는 사라짐)
    • RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
    • RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)
  1. @Target
  • 어노테이션이 적용할 위치를 선택
    • ElementType.PACKAGE : 패키지 선언
    • ElementType.TYPE : 타입 선언
    • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
    • ElementType.CONSTRUCTOR : 생성자 선언
    • ElementType.FIELD : 멤버 변수 선언
    • ElementType.LOCAL_VARIABLE : 지역 변수 선언
    • ElementType.METHOD : 메서드 선언
    • ElementType.PARAMETER : 전달인자 선언
    • ElementType.TYPE_PARAMETER : 전달인자 타입 선언
    • ElementType.TYPE_USE : 타입 선언
  1. @Documented
  • 해당 어노테이션을 Javadoc에 포함
  1. @Inherited
  • 어노테이션의 상속을 가능하게 한다
  1. @Repeatable
  • Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 해준다
  • 일반적인 애너테이션과 달리 같은 이름의 애너테이션이 여러번 적용될 수 있기 때문에, 이 애너테이션들을 하나로 묶어주는 애너테이션도 별도로 작성해야한다
  1. @Retention
  • 속성으로 유지정책(RetentionPolicy)이 있다
  • 유지정책이랑 애너테이션이 유지되는 기간을 지정
    유지 정책 설명
    SOURCE .java 소스 파일까지는 애노테이션이 존재, 컴파일 되어 클래스 파일이 되면 사라짐
    CLASS .class 파일까지는 애노테이션이 존재, 런타임에서 사라짐
    RUNTIME 런타임 실행시까지 애노테이션이 남아있음

사용자 정의 애너테이션

  • 직접 애너테이션을 정의해서 사용
  • 인터페이스를 정의하는 것돠 비슷
  • 애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속 받을 수 없다

@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다.
타입 요소명(); // 애너테이션 요소를 선언
}

Lamda - 람다

  • 함수형 프로그래밍을 위해 람다식을 지원
  • 수학자 알론조 처치가 발표한 계산법에서 사용된 시이며, 이를 제자 존 맥카시가 프로그래밍 언어에 도입

람다식 작성
1. 메서드의 이름과 반환타입을 제거하고 ->를 블록{}앞에 추가
2. 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능(끝에 ; 안붙임)
3. 매개변수의 타입이 추론 가능하면 생략가능

  • 람다식은 익명할수를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다

Runnable runnable = new Runnable() { ——————————————> Runnable runnable = () -> { ... };
public void run() { ... }
};

// 1. 기본 작성
(타입 매개변수) -> { ... }

// 2. 매개변수가 1개 일 때, 매개변수 () 생략가능
매개변수 -> { ... }

// 3. 매개변수가 2개 이상이고, 리턴문만 존재할 때는 return을 생략가능
(매개변수1, 매개변수2) -> 리턴값;
(num1, num2) -> {return num1 + num2} // return문만 존재하므로
(num1, num2) -> num1 + num2 // return 생략가능, 중괄호도 생략

// 4. 매개변수가 2개 이상이고, 실행문을 실행하고 결과값을 리턴할 경우
(매개변수1, 매개변수2) -> { ... };

함수형 인터페이스

  • 클래스에서 공통적으로 사용하는 기능이 있어도 클래스마다 메서드를 정의해야 한다
  • 이를 해결하기 위한 방법이 --->람다식
  • 새로운 함수 문법을 정의하는 대신, 인터페이스의 문법을 활용해 람다식을 표현
  • 하나의 추상 메서드만을 포함하는 인터페이스를 함수형 인터페이스라고 한다
    public void accept();
}


MyFunctionalInterface example = () -> { ... };

매개변수와 리턴값이 없는경우
public class MyFunctionalInterfaceExample {
	public static void main(String[] args) throws Exception {
		MyFunctionalInterface example;
		example = () -> {
			String str = "Calling Method, First";
			System.out.println(str);
		};
		example.accept();

		example = () -> System.out.println("Calling method, Second");
		//실행문이 하나라면 중괄호 { }는 생략 가능
		example.accept();
	}
}
/*
Calling Method, First
Calling method, Second
*/```


메서드 레퍼런스

- 람다식에서 불필요한 매개변수를 제거하는 목적

(left, right) -> Math.max(left, right);      ——————>.   Math :: max; // 메서드 레퍼런스

'자바' 카테고리의 다른 글

#JSON  (0) 2022.08.03
#스트림  (0) 2022.07.27
# 내부 클래스  (0) 2022.07.27
#제네릭 #컬렉션 프레임워크  (0) 2022.07.27
복습  (0) 2022.07.27
Comments