> 개발-IT-인터넷/> JAVA

[해커랭크(HackerRank) JAVA 풀이] - Java Annotations

jini:) 2023. 12. 1. 10:16
728x90
반응형
해커랭크 - https://www.hackerrank.com/
Prepare > Java > Advanced > Java Annotations
 

HackerRank

HackerRank is the market-leading technical assessment and remote interview solution for hiring developers. Learn how to hire technical talent from anywhere!

www.hackerrank.com

 

Java Annotations은 Java 클래스 또는 클래스 요소의 메타데이터를 정의하는 데 사용할 수 있습니다. 컴파일 시간에 Java Annotations을 사용하여 컴파일러에 빌드 프로세스에 대해 지시할 수 있습니다. Annotations은 또한 클래스 요소의 속성에 대한 통찰력을 얻기 위해 런타임에 사용됩니다.

Java Annotations은 다음과 같은 방법으로 요소에 추가할 수 있습니다.

@Entity
Class DemoClass{

}

Annotations 멤버에 값을 설정할 수도 있습니다. 예를 들어:

@Entity(EntityName="DemoClass")
Class DemoClass{

}

Java에는 몇 가지 기본 제공 Annotations이 있습니다. 다음과 같은 방법으로 고유한 Annotations을 정의할 수도 있습니다.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface FamilyBudget {
   String userRole() default "GUEST";
}

여기에서 userRole이 해당 사용자 정의 Annotations의 유일한 구성원인 Annotations FamilyBudget을 정의합니다. userRole은 문자열 유형 값만 사용하며 기본값은 "GUEST"입니다. 이 Annotations 멤버에 대한 값을 정의하지 않으면 기본값이 사용됩니다. @Target을 사용하여 Annotations을 사용할 수 있는 위치를 지정할 수 있습니다. 예를 들어 FamilyBudget Annotations은 클래스의 메서드에만 사용할 수 있습니다. @Retention은 Annotations이 런타임에 사용 가능한지 여부를 정의합니다. Java Annotations에 대해 자세히 알아보려면 자습서 및 Oracle 문서를 참조하세요.

다음 코드 세그먼트를 살펴보십시오.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface FamilyBudget {
    String userRole() default "GUEST";
}

class FamilyMember {

    public void seniorMember(int budget, int moneySpend) {
        System.out.println("Senior Member");
        System.out.println("Spend: " + moneySpend);
        System.out.println("Budget Left: " + (budget - moneySpend));
    }

    public void juniorUser(int budget, int moneySpend) {
        System.out.println("Junior Member");
        System.out.println("Spend: " + moneySpend);
        System.out.println("Budget Left: " + (budget - moneySpend));
    }
}

public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int testCases = Integer.parseInt(in.nextLine());
        while (testCases > 0) {
            String role = in.next();
            int spend = in.nextInt();
            try {
                Class annotatedClass = FamilyMember.class;
                Method[] methods = annotatedClass.getMethods();
                for (Method method : methods) {
                    if (method.isAnnotationPresent(FamilyBudget.class)) {
                        FamilyBudget family = method
                                .getAnnotation(FamilyBudget.class);
                        String userRole = family.userRole();
                        int budgetLimit = family.budgetLimit();
                        if (userRole.equals(role)) {
                            if(spend<=budgetLimit){
                                method.invoke(FamilyMember.class.newInstance(),
                                        budgetLimit, spend);
                            }else{
                                System.out.println("Budget Limit Over");
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            testCases--;
        }
    }
}

여기에서 Annotations FamilyBudget과 FamilyMember 클래스를 부분적으로 정의합니다. 이 문제에서는 사용자 역할과 사용자가 입력으로 지출하는 금액을 제공합니다. 사용자 역할에 따라 FamilyMember 클래스에서 적절한 메서드를 호출해야 합니다. 지출한 금액이 해당 사용자 역할의 예산 한도를 초과하면 예산 한도 초과가 인쇄됩니다.

당신의 임무는 FamilyBudget Annotations과 FamilyMember 클래스를 완성하여 Solution 클래스가 정의된 제약 조건과 완벽하게 작동하도록 하는 것입니다.

Hint : 편집기에서 5개의 불완전한 줄을 완료해야 합니다. 다른 라인을 변경, 삭제 또는 수정할 수 없습니다. 원본 코드를 복원하려면 편집기의 왼쪽 상단 버튼을 클릭하고 새 버퍼를 만듭니다.

 

 

Input Format

입력의 첫 번째 줄에는 총 테스트 케이스 수를 나타내는 정수 N이 포함됩니다. 각 테스트 케이스에는 다음 형식의 한 줄에 공백으로 구분된 문자열과 정수가 포함됩니다.

UserRole MoneySpend

 

Constraints

  • 2 ≤ N ≤ 10
  • 0 ≤ MoneySpend ≤ 200
  • |UserRole| = 6
  • 이름에는 영문 소문자만 포함됩니다.

 

Output Format

사용자 역할 및 예산 출력을 기반으로 특정 방법의 내용을 출력합니다. 지출한 금액이 예산 한도를 초과하면 예산 한도 초과를 출력합니다.

 

Sample Input

3
SENIOR 75
JUNIOR 45
SENIOR 40

 

Sample Output

Senior Member
Spend: 75
Budget Left: 25
Junior Member
Spend: 45
Budget Left: 5
Senior Member
Spend: 40
Budget Left: 60

 

반응형

 

Code

import java.lang.annotation.*;
import java.lang.reflect.*;
import java.util.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface FamilyBudget {
    String userRole() default "GUEST";
    int budgetLimit() default 0;
}

class FamilyMember {
    @FamilyBudget(userRole = "SENIOR", budgetLimit = 100)
    public void seniorMember(int budget, int moneySpend) {
        System.out.println("Senior Member");
        System.out.println("Spend: " + moneySpend);
        System.out.println("Budget Left: " + (budget - moneySpend));
    }
    @FamilyBudget(userRole = "JUNIOR", budgetLimit = 50)
    public void juniorUser(int budget, int moneySpend) {
        System.out.println("Junior Member");
        System.out.println("Spend: " + moneySpend);
        System.out.println("Budget Left: " + (budget - moneySpend));
    }
}

public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int testCases = Integer.parseInt(in.nextLine());
        while (testCases > 0) {
            String role = in.next();
            int spend = in.nextInt();
            try {
                Class annotatedClass = FamilyMember.class;
                Method[] methods = annotatedClass.getMethods();
                for (Method method : methods) {
                    if (method.isAnnotationPresent(FamilyBudget.class)) {
                        FamilyBudget family = method
                            .getAnnotation(FamilyBudget.class);
                        String userRole = family.userRole();
                        int budgetLimit = family.budgetLimit();
                        if (userRole.equals(role)) {
                            if(spend <= budgetLimit) {
                                method.invoke(FamilyMember.class.newInstance(),
                                budgetLimit, spend);
                            } else {
                                System.out.println("Budget Limit Over");
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            testCases--;
        }
    }
}

 

 

어노테이션 (Annotations)
 @ 기호를 사용하여 표시.
 코드에 메타데이터를 추가하는 방법.
 클래스, 메서드, 변수 등의 요소에 정보를 부여할 수 있다.
 메타데이터는 컴파일러, 런타임 라이브러리 또는 개발 도구에 의해 활용될 수 있다.
 코드의 가독성과 유지 보수성을 높이고 특정 기능을 확장하는데 도움을 준다.

기본 제공 어노테이션
 1. @Override : 메서드가 부모 클래스나 인터페이스의 메서드를 재정의 하는 것.
 2. @Deprecated : 이 요소가 더 이상 권장되지 않는다는 것.
 3. @SuppressWarnings : 컴파일러 경고를 무시하도록 지시.

사용자 정의 어노테이션
 @interface 키워드를 사용하여 정의.
 개발자가 필요에 따라 메타데이터를 추가하여 코드에 정보를 부여할 수 있다.

사용 목적
 - 컴파일 타임 검사 : 컴파일러가 코드를 검사하고 경고를 표시하거나 특정 동작을 수행하도록 지시.
 - 런타임 처리 : 리플렉션을 사용하여 런타임에 어노테이션 정보를 읽고 처리할 수 있다. 어노테이션 정보를 기반으로 특정 동작을 수행할 수 있다.
 - 코드 문서화 : 코드에 대한 추가적인 설명이나 문서화 정보를 제공할 수 있다.

 

 

개인 공부를 위한 포스팅입니다.
모든 번역, 코드는 완벽하지 않을 수 있습니다.

 

 

 

728x90
반응형