모든 클래스의 원형: Object
java.lang.Object
매서드 종류
boolean equals(Object obj) : 객체의 주소를 비교하여 결과를 리턴
int hashCode(): 객체의 해시 코드를 리턴
String toString(): 객체의 문자 정보를 리턴
일반적으로 equals() 매서드와 toString() 매서드는 재정의 되어 있는 경우가 꽤 있다.
객체의 주소가 다르더라도 핵심값만 같다면 같다고 판단하는게 옳을 경우에는 재정의를 해준다.
toString()도 마찬가지 일반적인 Object면 이상한 클래스명 뱉는데, 이상 클래스명 말고 확실하게 클래스만의
이름이나 정보를 출력하는게 옳은 경우라면 재정의 해줘야지.
Integer나 String은 전부 재정의되어 의도에 맞게 편하게 사용할 수 있는거
hashCode()의 정의 자체는 클래스가 현재 가리키고 있는 메모리 주소이다.
그런데 동등 비교할때 혹은 참조할때 사용한다. hashCode()가 같다면 값 상세비교 연산 할 필요도 없이 그냥 같은거고
만약 다르다면 그때서야 좀더 세부적으로 같은지를 비교하는 코드가 돌아가는 방식을 Java Wrapper 클래스들 뿐만 아니라
컬렉션 자료구조에서도 활용하고 있다. 나름 속도 최적화의 도구
record 키워드 : DTO 담당 일진
클래스 키워드를 이용하여 복잡하게 게터 세터 투스트링 컨스트럭터 생성하던 걸 한방에 생략시켜버리는 녀석
public record 이름 (String 변수1, Integer 변수2, int 변수3){}
이 한줄 코드로 DTO역할을 전부 수행해버린다.
롬복
어노테이션으로 코드 자동생성 해주는 라이브러리
어노테이션
너무 어려운 내용이라 마지막으로...
System
운영체제와 관련된 직접적 기능들 정의 되어 있음
정적 멤버 | 설명 | |
필드 | out | 모니터 출력 객체 |
err | 모니터 출력 객체(에러로) | |
in | 키보드 입력 객체 | |
메서드 | void exit(int status) | 프로세스 종료. 0은 정상 그 외 비정상. status 값을 이용한 제어를 java17 전까진 허용했으나 이제 권고하지 않으니 안하도록 |
long currentTimeMillis() | 현재 시간을 밀리초 단위로 겟. | |
long nanoTime() | 위와 동일 단지 단위가 나노초 | |
String getProperty(String key) | properties에 현재 JVM이 알고 있는 시스템 속성 값들이 있는데 key로 검색하면 String으로 토해냄 ex 버전이나, 디렉토리 같은 값 알고 싶을때 |
|
public static java.util.Map<String,String> getenv() { ... } public static String getenv(String name) { ... } |
위와 비슷하나 콘솔 환경변수로 검색해 가져온다는 점이 다름. |
out | err | in
out과 err 둘다 println(String content); 이 정의 되어 있으요. 하나는 일반 출력 하나는 에러로 출력이에요.
in에 저장된 객체의 정체는 static InputStream 사실 out과 err도 정체는 static PrintStream
셋다 스태틱이라 스태틱 영역에서 System 객체 생성할 필요없이 다이렉트로 가져올수 있던것.
out과 err는 둘다 static PrintStream인데 그럼 두개가 같은건가? 라는 착각은 NO static은 그저 스태틱영역에 System.out 으로 접근가능한 인스턴스를 생성시킨다일뿐 PrintStream 내부에 생성자는 단 하나만 생성시키는 클래스에요 라고 정의되어 있지 않는 한 즉 싱글턴 패턴으로 구현된게 아닌 이상은 그런일은 일어나지 않음. 확인해보니 싱글턴이 아니였음. 고로 둘은 서로 다른 인스턴스!
다시 in으로 돌아오면
- read
Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.Returns:the next byte of data, or -1 if the end of the stream is reached.Throws:IOException - if an I/O error occurs.
A subclass must provide an implementation of this method.
- public abstract int read() throws IOException
핵심을 색깔놀이 해봄.
in.read(): InputStream과 input stream의 차이
전자는 자바에 정의된 클래스 명이다.
후자는 JVM이 운영체제와 연결한 stream 개념이라고 생각.
하여간 InputStream.read(); 호출시에 input stream으로 부터 데이터를 받을 준비를 하며
스트림의 끝을 감지할때까지(Enter입력) 대기타고,
정작 1바이트 코드만 반환하거나, 에러를 발생시킨다.
이거 써먹겠나 이래서. 못써먹겠네~~~ -> 이 것을 이용하여 실제로 써먹기 좋은 형태로 구현한 클래스들이 존재함.
System.in.read()는 완전 바이너리한 함수라고 생각.
더 자세한 내용은 https://st-lab.tistory.com/41
JAVA [자바] - 입력 뜯어보기 [Scanner, InputStream, BufferedReader]
이 글을 지금 이 시점에 써야 할까 고민을 많이 했다. 사실 자바를 그냥 다룰 줄만 아는 것에 목표를 둔다면 이 글이 무의미할 수도 있다. 그러나 자바에 대해 조금이라도 관심이 있고 더 배우고
st-lab.tistory.com
결론: Scanner or BufferedReader를 쓰자
문자열: String | StringBuilder | StringTokenizer
String은 Imutable 객체다.
String 객체가 저장하는건 문자열 리터럴을 참조하기위한 메모리 주소다.
문자열 리터럴은 String Pool이라는 메모리 영역을 만들어서 효과적으로 관리한다.
---------
1. 문자열 수정의 복잡도
String: O(n) 복사 붙여넣기 싸그리 다하기에 불리함
StringBuilder: O(1) 행위 자체당 하나의 수행만 하면 됨
2. String 써먹는 목잡한 문법: 바이트 배열을 문자열로 치환할때 (네트워크 프로그래밍)
//소스 기본 인코딩 보통은 UTF-8
public String byteToString(byte[] arr){
retrun Arrays.toString(arr);
}
//차셋을 지정
public String byteToString(byte[] arr, String charSet){
//예를 들어 charSet == "EUC-KR"
retrun Arrays.toString(arr, charSet);
}
3. 스트링 가지고 이것저것 할거 같은 문제를 해결해야한다면 StringBuilder
리턴 | 메서드 | 설명 |
StringBuilder | append(String content) | 끝에 추가 |
StringBuilder | insert(int index, String content) | index 위치에서 시작하여 밀어넣기 |
StringBuilder | delete(int start, int end) | start부터 end까지 지우기 |
StringBuilder | replace(int start, int end, String content) | delete + insert |
String | toString() | 완성된 문자열을 리터럴로 리턴 |
4. split() | StringTokenizer
split(): 정규표현식
String data = "123&;53453,aaa, || 1234";
// 정규 표현식으로 숫자만 추출
String[] numbers = data.split("[^0-9]+"); // 숫자가 아닌 것들을 구분자로 사용
// 출력: 숫자만 출력
for (String num : numbers) {
if (!num.isEmpty()) { // 빈 문자열이 나오지 않도록 필터링
System.out.println(num);
}
}
StringTokenizer
String data = "123&;53453,aaa, || 1234";
// 구분자(,)를 기준으로 StringTokenizer 사용
StringTokenizer tokenizer = new StringTokenizer(data, ",&; ||");
// 문자열을 하나씩 출력
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
Math
수학클래스는 모든 메서드가 전부 Static이다. 얘는 실상 매서드 밖에 없는 놈이라 필드를 저장하기 위해 instance 만들고 자시고 할게 없으니 이런거 같음
구분 | 코드 | 값 |
절대값 | int v1 = Math.abs(-5) | 5 |
올림 | double v2 = Math.ceil(5.3) | 6.0 |
내림 | double v3 = Math.floor(-2.6) | -3 |
최대 | int v4 = Math.max(8,3) | 8 |
최소 | double v5 = Math.min(-3.2, -4.4) | -4.4 |
랜덤 | double v6 = Math.random(); | 0.0 ~ 0.9999999999 |
반올림 | long v7 = Math.round(5.2) | 5.0 |
Date | Calender | LocalDateTime
Date: 날짜 정보
실상 이제 자바가 권고하는건 new Date()로 현재 시스템 날짜 정보를 가져오는것 말곤 없다.
Date + SimpleDateFormat 으로 현재 날짜 시간 가져오는 용도로 사용
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
System.out.println(sdf.format(now));
Calender: 다양한 역법에 따라 날짜와 시간을 표현하는 다양한 필드들이 내부에 구현되어 있음. 기본 달력용 변수들에 변주를 주고 싶다면 상속하여 오버라이딩. 달력 만들때 요일, 년, 월일, 시간, am, pm 등 다양한 변수들이 있으니 활용하여 달력 만들 수 있음
//타임존과 캘린더의 조합
TimeZone tz_LA = TimeZone.getTimeZone("America/Los_Angeles");
Calender now = Calender.getInstance( tz_LA );
LocalDateTime: 날짜를 가져오는걸 넘어 연산까지 조작하고 싶다면, 이놈활용.
Format 클래스: java.text.DecimalFormat | java.text.SimpleDateFormat
특히 SSR 앱일 경우에는 이거 없이는 숫자나 시간 표현이 쉽지 않을듯..한번 눈 딱감고 외워둬야 나중에 봐도 덜 힘들거라고 위로.
공통: 소수점은 과감히 비우지만, 정수부는 앵간하면 표현
기호 | 의미 | 예 | 원형: 12345.6789의 결과 값 |
0 | 10진수 자리 표시. 채울 숫자가 없다면 0으로 채워 | 0 00000000.00000000 |
12346 00012345.67890000 |
# | 10진수 자리 표시. 채울 숫자가 없다면 비워 | # ########.######## |
12346 12345.6789 |
. | 소수점 | 0.# | 12345.7 |
+ | - | 부호 기호 | +0.## -#.00000 |
+12345.68 -12345.67890 |
, | 단위 구분 | #,###.0 | 12,345.7 |
E | 지수문자 | 0.0E0 | 1.2E4 |
; | 패턴 구분자. 양수 음수 둘다 정의하려 할때 | +#,### ; -#,###.0 | +12,346 -12,345.7 |
% | %로 표현 자연스레 정의안해도 100이 곱해짐 | #,###.#% | 1,234,567.9% |
\u00A4 | 원화 기호 | \u00A4#,### | ₩ 12,346 |
어질어질 하네...
공부 -> 연습문제 -> 응용문제 공식에 따라 일단 연습문제는 풀어봐야겠지. 클로드에게 문제를 내달라해따..
- 숫자 1234567.89를 "1,234,568"로 반올림하여 출력하는 DecimalFormat 패턴을 작성하세요.
- 숫자 0.567을 백분율로 변환하여 "56.7%"로 출력하는 패턴을 만드세요.
- -1234.5678을 소수점 둘째 자리까지 표시하고, 음수 기호 대신 괄호를 사용하여 "(1,234.57)"로 출력하세요.
- 123.4를 "000123.400"처럼 정수부 6자리, 소수부 3자리로 강제하는 패턴을 작성하세요.
- 1234567.89를 "₩1,234,568"처럼 원화 기호와 함께 표시하는 패턴을 만드세요.
- 0.1234를 과학적 표기법을 사용하여 "1.23E-1"로 출력하는 패턴을 작성하세요.
- 123456.789를 "12만3457"처럼 만 단위로 표시하고 반올림하는 패턴을 만드세요.
- 0.125를 분수로 표현하여 "1/8"로 출력하는 패턴을 작성하세요.
- 1234.5678을 소수점 이하는 표시하지 않고 "1235"처럼 반올림하여 출력하는 패턴을 만드세요.
- -0.0023을 "-.23%"처럼 백분율로 변환하고 불필요한 0은 제거하여 출력하는 패턴을 작성하세요.
나의 응답
- DecimalFormat df = new DecimalFormat("#,###"); System.out.println(df.format(input));
-> 이제부터 변수 할당 부는 생략하고 DecimalFormat 패턴표현식만 쓰겠다.. - #.#%
- 뭐야 이건 안배웠어.. 틀렸네
- 000000.000
- \u00A4#,###
- 0.00E0
- #만####
- 뭐야 이것도 안배웠어
- #
- #.##%
답 공개
푼건 맞음. 못푼건 틀림
3. 음수를 괄호로 표시하는 패턴은 #,##0.00;(#,##0.00) 입니다. 세미콜론 앞은 양수일 때의 패턴, 뒤는 음수일 때의 패턴입니다.
8.별도 로직이 필요합니다. 분수로 바꿔 출력하는건 없습니다. 죄송합니다. ->????
SimpleDateFormat
노가다 그만하고 싶어..
패턴 | 의미 | 패턴 | 의미 | 패턴 | 의미 |
y | 년 | M | 월 | d | 일 |
D | 일(1~365) | E | 요일 | a | 오전 or 오후 |
w | 년도의 몇째 주 | W | 월의 몇째 주 | H | 시(0~23) |
h | 시(1~12) | K | 시(0~11) | k | 시(1~24) |
m | 분 | s | 초 | S | 밀리초 |
클로드
- 2024년 3월 15일 오후 2시 30분을 "2024년 03월 15일 금요일 오후 02:30"으로 출력하는 패턴을 작성하세요.
- 1999년 12월 31일 23시 59분 59초를 "999일 23:59:59 (12월의 마지막 주)"와 같이 출력하는 패턴을 만드세요. (365일 중 며칠째인지 표시)
- 2024년 3월 1일을 "Mar 1, '24 (Q1)"처럼 분기(Quarter)를 포함해 출력하는 패턴을 작성하세요.
- 2024년 2월 29일 오전 9시를 "29th of February, 2024 at 09:00 AM" 형식으로 출력하는 패턴을 만드세요.
- 현재 시간을 "현재는 오후 3시이며, 하루 중 15번째 시간입니다."처럼 12시간제와 24시간제를 동시에 표현하는 패턴을 작성하세요.
- 2024년 7월 4일을 "목요일 (185번째 날, 27번째 주)"처럼 해당 연도의 몇 번째 날, 몇 번째 주인지 표시하는 패턴을 만드세요.
- 특정 시간을 "UTC+09:00 KST 기준 2024-03-15T14:30:00" 형식으로 출력하는 패턴을 작성하세요.
- 2024년 12월 31일 23시 59분을 "12/31/24 23:59 (W53)"처럼 해당 연도의 몇 번째 주인지를 포함해 출력하는 패턴을 만드세요.
- 2024년 3월 15일 14시 30분을 "금요일 오후 2시 30분 (태평양 표준시 기준 3/14 22:30)" 같이 두 개의 시간대를 동시에 표시하는 패턴을 작성하세요.
- 특정 날짜를 "MMMMM dd, yyyy (음력 윤년)"처럼 월을 한 글자로 표현하고 윤년 여부를 표시하는 패턴을 만드세요.
나의 답
//공통 코드
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(sdfpattern);
- "yyyy년 MM월 dd일 E요일 a hh:mm"
- "DDD일 HH:mm:ss(12월의 마지막 주)"
- 이건 일단 안배웠네
- "ddth of ?, yyyy at hh:mm a" -> 영어로 표기하는거 안배웠어 Calender를써야되는거 같은데 쩝.
- "현재는 a h시이며, 하루 중 HH번째 시간입니다."
- "E요일 (DDD번째 날, w번째 주)"
- "???" 이건 좀 특별한가 보네..
- "MM/dd/yy HH:mm ('W'w)" <- w 문자열을 어캐 표현하지?
- "E요일 a h시 mm분 (태평양 표준시 기준 ...)"
- ????
답비교.. 왕창틀렸네
- 2. "DDD일 HH:mm:ss(12월의 마지막 주)" - 거의 맞았습니다. 괄호 안의 텍스트는 작은따옴표로 묶어주어야 해요: "DDD일 HH:mm:ss '(12월의 마지막 주)'"
- 3. 분기를 표시하려면 MMM d, ''yy '(Q'q')' 를 사용합니다. q가 분기를 나타내는 패턴입니다.
- 4. 맞습니다. 영어 서수 표현은 SimpleDateFormat만으로는 불가능하고, Calendar나 별도 로직이 필요합니다. 기본 패턴은: "d 'of' MMMM, yyyy 'at' hh:mm a"
- 7. ISO 8601 형식으로 표현하려면: "'UTC+09:00 KST 기준 'yyyy-MM-dd'T'HH:mm:ss" 입니다.
- 8. "MM/dd/yy HH:mm ('W'w)" - 거의 맞았습니다! W를 표현하려면: "MM/dd/yy HH:mm '''W'''w"처럼 작은따옴표를 3개 사용합니다.
- 9. 두 개의 시간대는 SimpleDateFormat 하나로는 처리가 어렵습니다. TimeZone 설정을 따로 해주어야 합니다.
- 10. 월을 한 글자로 표현하려면 "MMMMM d, yyyy '(음력 윤년)'" 이지만, 윤년 판단은 별도 로직이 필요합니다.
정규 표현식
문자열이 정해져 있는 형식으로 구성되어 있는지 검증해야할때 사용하는게 정규 표현식.
표를 숙지하고 사용예와 비교해가며 익히자..
기호 | 설명 | 기호 | 설명 |
[] | 한개의 문자 [abc] 얘네들 중 하나 [^abc] 얘네들 제외한 하나 [a-zA-z]모든 알파벳 중 하나 |
||
\d | 한개의 숫자 | \s | 공백 |
\w | 한개의 char | \. | . |
. | 모든 문자들 중 한개 | ? | 없거나 한개거나 |
* | 없거나 한개 이상 | + | 한개 이상 |
{n} | n개 | {n,} | 최소 n개 |
{n,m} | n~m개 | a|b | a 또는 b |
() | 그룹핑 |
이 외에도 많지만 일단 이것만.. 죽겠네..
- 올바른 이메일 주소를 검증하는 정규식을 작성하세요.
- 예: test@example.com (매칭)
- 예: invalid.email@.com (비매칭)
- 전화번호 형식을 검증하는 정규식을 작성하세요. (010-1234-5678 또는 010 1234 5678 형식 모두 허용)
- 예: 010-1234-5678 (매칭)
- 예: 010 1234 5678 (매칭)
- 예: 01012345678 (비매칭)
- 8~16자의 영문 대/소문자, 숫자, 특수문자를 최소 하나씩 포함하는 비밀번호 정규식을 작성하세요.
- 예: Password123! (매칭)
- 예: onlylowercase (비매칭)
- HTML 태그를 제거하는 정규식을 작성하세요.
- 예: "<p>Hello World</p>" → "Hello World"
- URL에서 쿼리 파라미터를 추출하는 정규식을 작성하세요.
- 예: "http://example.com?name=John&age=25" → name=John, age=25 추출
- 주민등록번호 형식을 검증하는 정규식을 작성하세요. (숫자6자리-숫자7자리)
- 예: 123456-1234567 (매칭)
- 예: 123-45-1234567 (비매칭)
- 파일명에서 확장자를 추출하는 정규식을 작성하세요.
- 예: "document.pdf" → "pdf" 추출
- 예: "image.jpg.png" → "png" 추출
- 문자열에서 연속된 공백을 하나로 치환하는 정규식을 작성하세요.
- 예: "Hello World !" → "Hello World !"
- IP 주소 형식을 검증하는 정규식을 작성하세요. (0~255 범위의 숫자 4개)
- 예: 192.168.0.1 (매칭)
- 예: 256.1.2.3 (비매칭)
- 카멜 케이스를 스네이크 케이스로 변환하는 정규식을 작성하세요.
- 예: "camelCase" → "camel_case"
- 예: "thisIsAVariable" → "this_is_a_variable"
[내 답]
- \w{1,}@\w{1,}\.\w{1,}(\.\w{1,})*
- (010)-?\d{3,4}-?\d{3,4}
- 특수문자 어떻게 표현하는지 몰라서 못풀겠네
- 지우는건 안배웠어..
- 매치만 배웠지 추출은 안배웠어..
- \d{6}-\d{7}
- 추출 몰라~
- ????
- 어?.. 문자열인데 대소비교가 안되는데?...모르겠다
- 추출 변경 몰라!!!
지쳤어 힘들어.. 정규표현식 그지같아
[클로드]
1. `\w{1,}@\w{1,}\.\w{1,}(\.\w{1,})*` - 거의 좋습니다! 하지만 email에서 허용되는 `.` `-` `+` 등도 포함하려면:
```
[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}
```
2. `(010)-?\d{3,4}-?\d{3,4}` - 훌륭합니다! 다만 공백도 허용하려면:
```
010[-\s]?\d{4}[-\s]?\d{4}
```
3. 비밀번호 정규식은 다음과 같습니다:
```
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,16}$
```
- `(?=.*패턴)`: 전방 탐색(앞쪽에 패턴이 있는지 확인)
- `[!@#$%^&*]`: 특수문자 집합
4. HTML 태그 제거는 replaceAll()과 함께 사용:
```
<[^>]*>
```
5. 쿼리 파라미터 추출:
```
[?&]([^=&]+)=([^&]*)
```
그룹1은 파라미터 이름, 그룹2는 값입니다.
6. `\d{6}-\d{7}` - 정답입니다! 완벽해요.
7. 확장자 추출:
```
\.([^.]+)$
```
8. 연속된 공백을 하나로:
```
\s+
```
replaceAll()로 " "로 치환
9. IP 주소 검증은 복잡합니다:
```
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
```
10. 카멜케이스를 스네이크케이스로:
```
([a-z])([A-Z])
```
replaceAll()로 "$1_$2"로 치환 후 toLowerCase()
Reflection: 반사 -> 왜 매니징이 아닐까?
public class Class 이 놈이 뭔데? -> 메타 데이터를 관리하는 클래스라고 하네요... 장난해? 메타데이터를 어디에 저장하는지 검색해봤는데.. 어라? 메서드만 주구장창 구현되어 있지 실제로는 변수는 아무것도 없는 깡통이었다..
Class공개 생성자가 없습니다. 대신 객체는 클래스가 로드되고 클래스 로더의 메서드 Class 에 대한 호출에 의해 Java 가상 머신에 의해 자동으로 생성됩니다
이게 공식 문서 설명이다... 역시나 이딴거 Object 상속이니 다 말이 안되는거였고, JVM이 알아서가 정답이었다.
Class<String> stringClass = String.class; // 클래스 리터럴 -> JVM이 뽑아낸다.
Class<Integer> intClass = int.class; // 기본 타입도 가능 -> JVM이
Class<?> arrayClass = int[].class; // 배열 타입도 가능 -> Jvm이
objinstance.getClass()는 좀 다른데 얘는 실제 Object 에 있는 메서드가 맞다.. 그러나.. 내부 동작은 결국 리터럴을 가리키고 그 리터럴을 만드는 코드는 JVM이...
관리한다고 하는데 Managing이 아니라 Reflection 뜬금 없이 반사인 이유는 어딘가에서 막 싹 관리하는건 아니고, 메모리 공간 어딘가에 리터럴로 메타 데이터 값을 저장은 해두었고 그 리터럴 주소는 JVM이 관리하는건 맞긴한데
실상 사용할때 클래스.class 로 메타데이터 반사. instance.getClass() 메타데이터 반사 이기 때문이다. 그니까 호출할때 호출하는 녀석 자기 자신에대한 정보를 반사 반사 할 수 있어서 이런 기능을 Reflection이라고 한다.
핵심은. 호출하는 녀석의 메타데이터를 바로바로 가져와서 처리할 수 있는 기능. == Reflection
하여간 이렇게 Class를 얻어내면 여기엔 주구장창 30여가지의 매서드들이 많다. 다 클래스에대한 정보들이다.
실제 좀 이것만을 이용하여 좀 찾아내야되는 경우는
Class c = data.getClass();
String photoPath = c.getResource("photo.png").getPath();
찐 막 Annotation
핵심: 어노테이션의 역할이 무엇인가
1. 컴파일시 사용하는 정보 전달
2. 빌드 툴이 코드를 자동으로 생성해야될때 사용하는 정보들을 전달
3. 실행 시 특정 기능을 처리할 때 사용하는 정보를 전달
정보를 전달하는 거다. 결론. 왜 전달하는게 필요한건데? 코드 한줄 더 줄일려고...
좀 더 상세..
정의
public @interface AnnotationName{
//생략
}
사용
@AnnotaionName
//여기에 매서드 정의가 올수도 / 클래스 정의가 올수도 / 필드가 올수도 등등등 너무 많다 타겟이...
구현
@Retention(RetentionPolicy.RUNTIME) //정보전달 타이밍의 정의
@Target({ElementType.TYPE, ElementType.METHOD})
//해당 어노테이션을 누구에게 적용할 수 있는지 정의
public @interface AnnotaionName{
String value();
int prop1() default 0;
}
그런데 이런 어노테이션은 실상 어디에 뭘 어떤 정보를 담아서 전달할건데 만 정의되어 있지 실상 어노테이션이 붙었을때 실질적 동작은 그 어노테이션을 활용하여 소스코드 동작을 하게 만드는 다른 메서드들을 구현해야 동작이 의미가 있다.
'Learn > 이것이 자바다' 카테고리의 다른 글
[이것이 자바다] chapter 13 확인문제 (0) | 2024.12.04 |
---|---|
제네릭, 와일드카드 (0) | 2024.12.03 |
[이것이 자바다] chapter 12 확인 문제 (0) | 2024.12.03 |
[이것이 자바다]chapter14 확인문제 (0) | 2024.11.30 |
멀티 스레드, 메인 스레드, 스레드 상태, 스레드 동기화, 데몬 스레드, 스레드풀 (2) | 2024.11.30 |