📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page
  • 애노테이션 선언과 적용
  • 리플렉션

Was this helpful?

  1. Kotlin In Action

애노테이션과 리플렉션

애노테이션을 통해서는 라이브러리가 요구하는 의미를 클래스에서 부여하는 것이 가능하고시점에 컴파일러 내부 구조를 분석하는 것이 가능하다

애노테이션 선언과 적용

애노테이션의 사용법은 자바에서 사용하는 것 처럼 그냥 애노테이션 선언 시, 메소드, 필드 등 적용범위에 대해서 적용하는데 그렇게 적용한 곳에서 사용할 수 있다 근데 지정하는데 있어서 살짝은 다르다고 한다

  • 클래스를 애노테이션 인자로 지정할 때는 @MyAnnotation(MyClass::class) 이렇게 ::class 를 클래스 이름 뒤에 넣어주어야 한다

  • 다른 애노테이션을 인자로 지정할 때는 인자로 들어가는 애노테이션의 이름 앞에 @을 넣지 않아야 한다

  • 배열을 인자로 지정하기 위해서라면 arrayOf 함수를 사용한다

애노테이션 인자를 컴파일 시점에 알아야 한다 > 그래서 임의의 프로퍼티를 인자로 지정할 수는 없다 만약에 프로퍼티를 애노테이션 인자로 사용하기 위해서는 const 키워드를 사용해야 한다 컴파일러는 const가 부은 프로퍼티를 컴파일 시점 상수로 취급한다

json 직렬화는 객체 > 텍스트나 이진형태로 변환하는 방식, 역직렬화는 반대로 변환하는 방식이다 여기서 @JsonExclude 애노테이션을 통해서 직렬화, 역직렬화 시 해당 프로퍼티를 무시할 수 있다 또한 @JsonName 애노테이션을 사용하면 프로퍼티를 표현하는 키-값 쌍을 키로 프로퍼티 이름 대신 애노테이션이 지정한 이름으로 쓰게 할 수 있다

애노테이션을 선언하는 방법은 이러하다 간단하게 annotation 으로해서 생성하면 annotation class 뭐시기 이렇게 생성된다 이렇게 보면 일반 클래스와 차이는 없지만 단순하게 그냥 앞에 annotation 키워드가 붙냐 안붙냐 차이이다 하지만 애노테이션이라는 클래스는 오직 선언이나 식과 관련 있는 메타데이터의 구조를 정의하기 때문에 아무거나 들어갈 순 없다 자바와의 차이를 생각해보면 코틀린에서는 annotation class JsonName(val name: String) 그리고 애노테이션 클래스에서는 모든 파라미터 앞에 항상 val 키워드를 추가해야 한다 자바에서는 public @interface JsonName{ String value(); } 이런식으로 작성한다

메타애노테이션이란 애노테이션 클래스의 내부에 붙혀준 애노테이션을 보고 메타애노테이션이라고 한다 자주 사용하는 것들은 @Target이고 이 애노테이션을 통해서 해당 애노테이션을 적용할 수 있는 요소의 유형을 지정한다 꼭 있어야 애노테이션을 이제 붙히는 것이 가능하니 기억하자 그리고 해당 리스트는 AnnotationTarget 이라는 enum 값에 들어 있으니까 사용하는 것이 가져와서 리스트 선언하면 된다 그리고 @Retention 이라는 애노테이션은 정의 중인 애노테이션 클래스를 소스에서만 유지할 것인지, .class파일에 넣을 것인지, 실행시점에만 접근가능하게 할 것인지에 대한 메타 애노테이션이다

리플렉션

리플렉션의 개념은 실행 시점에 객체의 프로퍼티와 메소드에 접근할 수 있게 해주는 방법이다 > 컴파일러가 실제 메소드나 프로퍼티의 이름을 적어두면 이놈들을 컴파일 시점에 정적으로 찾아서 해당하는 선언이 실제로 존재하는 것을 보장해준다 근데 타입과 관계없이 객체를 다뤄야 하거나 객체가 제공하는 메소드나 프로퍼티 이름을 실행 시점에만 알 수 있는 경우에는 리플렉션을 사용해야 한다 예시로는 JSON 직렬화이다

일단 리플렉션을 사용하기 위해서는 2가지의 리플렉션 API를 사용해야 한다 java.lang.reflect 패키지를 통해서 제공하는 표준 리플렉션 > 코틀린은 자바 바이트코드로 완벽하게 호환되기 때문에 자바 패키지를 사용할 수 있다 kotlin.reflect 패키지를 통해 제공하는 코틀린 리플렉션 api > 여기에서는 자바에서는 없는 프로퍼티나 널이 될 수 있는 타입과 같은 코틀린 고유 개념에 대한 리플렉션 제공한다

코틀린 리플렉션으로는 KClass, KCallable, KFunction, KProperty 이렇게 존재한다 코틀린 리플렉션으로 처음 접하게 되는 건 클래스를 표현는 KClass 이다 > 이놈은 java.lang.Class에 해당하고 이걸 사용하면 클래스 안에 있는 모든 선언을 열거하고 각 선언에 접근하거나 클래스의 상위 클래스를 얻는 등의 작업이 가능하다 그리고 사용항법은로는 MyClass::class 이렇게 선언함으로써 KClass의 인스턴스를 얻는 것이 가능하다 실행 시점에 객체의 클래스를 얻으려면 먼저 객체의 javaClass 프로퍼티를 통해서 객체의 자바 클래스를 얻어야 한다

그리고 이것의 상위 개념으로는 KCallable 이라는 것이 있다 > 클래스의 모든 멤버의 목록이 KCallable 인스턴스의 컬렉션이다 그리고 정확하게 KCallable은 함수와 프로퍼티를 아우르는 공통 상위 인터페이스이고 그 안에 call 메소드를 통해서 함수나 프로퍼티의 getter를 호출한다 call을 사용할때는 함수 인자를 vararg 리스트로 전달함을 통해서 call 이라는 메소드를 통해서 함수를 호출하는 것이 가능하다

::foo 식의 값 타입이 리플렉션 API에 있는 KFunction 클래스의 인스턴스이다 > 이 함수 참조가 가리키는 함수를 호출하기 위해서는 KCallable.call 메소드를 호출한다 근데 KFunction 을 통해서 invoke 메소드로 함수를 호출하는 것도 가능은 하다 하지만 KFunction의 invoke 메소드를 초훌할 때는 인자 개수나 타입이 맞아 떨어지지 않으면 컴파일이 안된다 결론으로는 KFunction의 인자 타입과 반환 타입을 모두 다 안다면 invoke 메소드를 호출하는 것이 더 좋다 대신 call 메소드는 모든 타입의 함수에 적용할 수 있다는 일반적인 메소드이지만 타입 안전성을 보장하지 않는다

마지막 KProperty의 call 메소드도 있다. 요 KProperty의 call은 프로퍼티의 getter를 호출하긴하는데 이것 보다 get 메소드가 더 좋다 이 get 메소드에 접근하려면 프로퍼티가 선언된 방법에 따라 올바른 인터페이스를 사용해야 한다

예시로 들어준 직렬화, 역직렬화의 과정에서 여러가지 애노테이션이 있다 @JsonExclude, @JsonName, @CustomSerializer 이렇게 있다 @JsonExclude은 프로퍼티를 직렬화하는 과정에서 특정 프로퍼티를 제외하고 싶을 때 사용하고 @JsonName은 프로퍼티를 직렬화할 때 JSON에 넣을 때 사용되는 이름이다 그리고 마지막으로 @CustomSerialize 은 직렬화를 구현한대로 커스텀해서 사용하는 방식이다

어느정도 정리는 끝났다! 앞으로 남은건 코루틴과 async/await 항목만이 남았다!

Previous제네릭스Next코루틴

Last updated 2 years ago

Was this helpful?