ν‹°μŠ€ν† λ¦¬ λ·°

πŸ“Œ μ• λ„ˆν…Œμ΄μ…˜

: μ£Όμ„μ²˜λŸΌ μ†ŒμŠ€μ½”λ“œμ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμœΌλ©΄μ„œ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μœ μš©ν•œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” 것 ('@'κ°€ 뢙은 νƒœκ·Έ)

 

https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Annotation.html

 

Annotation (Java Platform SE 8 )

Returns the hash code of this annotation, as defined below: The hash code of an annotation is the sum of the hash codes of its members (including those with default values), as defined below: The hash code of an annotation member is (127 times the hash cod

docs.oracle.com

 

πŸ“Œ ν‘œμ€€ μ• λ„ˆν…Œμ΄μ…˜

: μžλ°”μ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜

 

βœ”οΈ @Override

: μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” λ©”μ„œλ“œλΌλŠ” 것을 μ•Œλ¦Ό → μ»΄νŒŒμΌλŸ¬κ°€ 같은 μ΄λ¦„μ˜ μ‘°μƒλ©”μ„œλ“œκ°€ μ—†μœΌλ©΄ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΄!

: λ©”μ„œλ“œ μ•žμ—λ§Œ 뢙일 수 있음

class MyClass extends Object {
    @Override
    public String toString() { ... } // Object 클래슀의 toString() λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œ
}

❗ @Override μ• λ„ˆν…Œμ΄μ…˜μ„ 뢙이지 μ•Šμ•˜μœΌλ©΄, toString()을 tostring()으둜 잘λͺ»μ¨λ„ 였λ₯˜ λ°œμƒX → μ‹€ν–‰ ν›„ μ–΄λ””μ„œ 잘λͺ»λ˜μ—ˆλŠ”μ§€ μ•Œμ•„λ‚΄κΈ° 어렀움!

 

βœ”οΈ @Deprecated

: 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” ν•„λ“œλ‚˜ λ©”μ„œλ“œμ— μ‚¬μš©ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜, 이 μ• λ„ˆν…Œμ΄μ…˜μ΄ 뢙은 λŒ€μƒμ€ λ‹€λ₯Έ κ²ƒμœΌλ‘œ λŒ€μ²΄λ˜μ—ˆμœΌλ‹ˆ 더 이상 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것을 κΆŒν•œλ‹€(κ°•μ œX)λŠ” 의미!

: @Deprecated μ• λ„ˆν…Œμ΄μ…˜μ΄ 뢙은 ν•„λ“œλ‚˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄, 컴파일 μ—λŸ¬ X, ν•΄λ‹Ή ν•„λ“œ λ˜λŠ” λ©”μ„œλ“œκ°€ Deprecatedλ˜μ—ˆλ‹€λŠ” λ©”μ‹œμ§€λ§Œ!

:보톡 JDK 버전이 μ—…κ·Έλ ˆλ“œ 될 λ•Œ μ‚¬μš©!

 

βœ”οΈ @FunctionallInterface

: 'ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€'λ₯Ό μ„ μ–Έν•  λ•Œ, 이 μ• λ„ˆν…Œμ΄μ…˜μ„ 뢙이면 μ»΄νŒŒμΌλŸ¬κ°€ 'ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€'λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ„ μ–Έν–ˆλŠ”μ§€ ν™•μΈν•˜κ³ , 잘λͺ»λœ 경우 μ—λŸ¬λ₯Ό λ°œμƒ

(ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” λ’·μͺ½μ— λ‚˜μ˜΄)

 

βœ”οΈ @SuppressWarnings

: μ»΄νŒŒμΌλŸ¬κ°€ λ³΄μ—¬μ£ΌλŠ” κ²½κ³ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚˜μ§€ μ•Šκ²Œ μ–΅μ œ!

❗ 일반적으둜 컴파일러의 κ²½κ³ λ©”μ‹œμ§€λŠ” λͺ¨λ‘ ν™•μΈν•˜κ³  ν•΄κ²°ν•΄μ„œ 컴파일 후에 μ–΄λ– ν•œ λ©”μ‹œμ§€λ„ λ‚˜νƒ€λ‚˜μ§€ μ•Šκ²Œ 해야함! κ·Έλž˜μ„œ μ•Œκ³ λ„ λ¬΄μ‹œν•˜κ³  싢을 λ•Œ @SuppressWarningsλ₯Ό μ‚¬μš©!

 

@SuppressWarnings("deprecation") // deprecation κ΄€λ ¨ κ²½κ³ λ₯Ό μ–΅μ œ
public static void main(String args[]) {
    ...
    @SuppressWarnings("unchecked") // μ§€λ„€λ¦­μŠ€ κ΄€λ ¨ κ²½κ³ λ₯Ό μ–΅μ œ
    ArrayList<Integer> list = new ArrayList();
}

: @SuppressWarnings({"deprecation", "unchecked"})와 같이 ν•œλ²ˆμ— μ–΅μ œ κ°€λŠ₯! but ν•΄λ‹Ή λŒ€μƒμ—λ§Œ μ• λ„ˆν…Œμ΄μ…˜μ„ λΆ™μ—¬μ„œ 경고의 μ–΅μ œ λ²”μœ„λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것이 best! → λ‚˜μ€‘μ— mainν•¨μˆ˜μ— μΆ”κ°€λ˜λŠ” μ½”λ“œκΉŒμ§€ κ²½κ³ κ°€ μ–΅μ œλ μˆ˜λ„ 있기 λ•Œλ¬Έ

 

πŸ™‹πŸ»‍♀️ μ–΅μ œν•  수 μžˆλŠ” κ²½κ³  λ©”μ‹œμ§€λŠ” μ–΄λ–€ 것이 μžˆλ‚˜μš”? (주둜 μ‚¬μš©λ˜λŠ” 것)

βœ”οΈ deprecation : @Deprecatedκ°€ 뢙은 λŒ€μƒμ„ μ‚¬μš©ν•΄μ„œ λ°œμƒν•˜λŠ” κ²½κ³  μ–΅μ œ

βœ”οΈ unchecked : μ§€λ„€λ¦­μŠ€λ‘œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ λ°œμƒν•˜λŠ” κ²½κ³  μ–΅μ œ

βœ”οΈ rawtypes : μ§€λ„€λ¦­μŠ€λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„μ„œ λ°œμƒν•˜λŠ” κ²½κ³  μ–΅μ œ

βœ”οΈ varargs : κ°€λ³€μΈμžμ˜ νƒ€μž…μ΄ μ§€λ„€λ¦­ νƒ€μž…μΌ λ•Œ λ°œμƒν•˜λŠ” κ²½κ³ λ₯Ό μ–΅μ œ

❕ 였λ₯˜ λ©”μ‹œμ§€μ—μ„œ λŒ€κ΄„ν˜Έ [] μ•ˆμ— μžˆλŠ” 것이 λ©”μ‹œμ§€μ˜ μ’…λ₯˜

 

βœ”οΈ @SafeVarargs

: λ©”μ„œλ“œμ— μ„ μ–Έλœ κ°€λ³€μΈμžμ˜ νƒ€μž…μ΄ non-reifiable일 경우, ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ„ μ–Έ, ν˜ΈμΆœν•˜λŠ” λΆ€λΆ„μ—μ„œ "unchecked" κ²½κ³ κ°€ λ°œμƒν•˜λŠ”λ°, 이 κ²½κ³ λ₯Ό μ–΅μ œν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©

 

πŸ™‹πŸ»‍♀️ non-reifiable?

πŸ‘©πŸ»‍🏫 컴파일 ν›„ μ œκ±°λ˜λŠ” νƒ€μž…(ex. T) λ°˜λŒ€λ‘œ reifiable νƒ€μž…μ€ 컴파일 ν›„ 제거X. λŒ€λΆ€λΆ„μ˜ μ§€λ„€λ¦­ νƒ€μž…μ€ non-reifiable νƒ€μž…!

@SafeVarargs // unchecked κ²½κ³  μ–΅μ œ
@SuppressWarnings("varargs") // varargs κ²½κ³  μ–΅μ œ
public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a); // List<Integer> list =  asList(new int[3]);
}

❕ @SafeVarargs으둜 'unchecked' κ²½κ³ λŠ” μ–΅μ œν•  수 μžˆμ§€λ§Œ 'varargs' κ²½κ³ λŠ” μ–΅μ œν•  수 μ—†κΈ° λ•Œλ¬Έμ— 보톡 @SuppressWarnings("varargs")와 ν•¨κ»˜ μ‚¬μš©

 

πŸ™‹πŸ»‍♀️ κ·ΈλŸΌ κ·Έλƒ₯ @SuppressWarnings("unchecked")λ₯Ό μ“°λ©΄ λ˜μ§€ μ•Šλ‚˜μš”?

πŸ‘©πŸ»‍🏫 λ©”μ„œλ“œμ— μ„ μ–Έλœ κ°€λ³€μΈμžμ˜ νƒ€μž…μ΄ non-reifiable(ex. μ§€λ„€λ¦­ νƒ€μž…)일 경우, ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ„ μ–Έ, ν˜ΈμΆœν•˜λŠ” λΆ€λΆ„μ—μ„œ "unchecked" κ²½κ³ κ°€ λ°œμƒ! λ”°λΌμ„œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ„ μ–ΈλΆ€ + ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ @SuppressWarnings("unchecked")λ₯Ό λΆ™μ—¬μ€˜μ•Όν•¨ but @SafeVarargsλ₯Ό μ‚¬μš©ν•˜λ©΄ μ„ μ–ΈλΆ€μ—λ§Œ ν•΄λ‹Ή μ• λ„ˆν…Œμ΄μ…˜μ„ 뢙이면 ν˜ΈμΆœν•  λ•Œ μžλ™μœΌλ‘œ κ²½κ³ κ°€ μ–΅μ œ!

 

πŸ“Œ 메타 μ• λ„ˆν…Œμ΄μ…˜

: μ• λ„ˆν…Œμ΄μ…˜μ„ μœ„ν•œ μ• λ„ˆν…Œμ΄μ…˜, μ• λ„ˆν…Œμ΄μ…˜μ„ μ •μ˜ν•  λ•Œ μ• λ„ˆν…Œμ΄μ…˜μ˜ 적용 λŒ€μƒ(target)μ΄λ‚˜ μœ μ§€κΈ°κ°„(retention)등을 μ§€μ •ν•˜λŠ”λ° μ‚¬μš©

: 메타 μ• λ„ˆν…Œμ΄μ…˜λ„ ν‘œμ€€ μ• λ„ˆν…Œμ΄μ…˜!

 

βœ”οΈ @Target

: μ• λ„ˆν…Œμ΄μ…˜μ΄ μ μš©κ°€λŠ₯ν•œ λŒ€μƒμ„ μ§€μ •ν•˜λŠ”λ° μ‚¬μš©

import static java.long.annotation.ElementType.*;

@Target({FIELD, TYPE, TYPE_USE})
public @interface MyAnnotation { ... }

 

πŸ“‹ @Target으둜 μ§€μ •ν•  수 μžˆλŠ” μ• λ„ˆν…Œμ΄μ…˜ μ μš©λŒ€μƒμ˜ μ’…λ₯˜

β–ͺ ANNOTATION_TYPE : μ• λ„ˆν…Œμ΄μ…˜

β–ͺ CONSTRUCTOR :  μƒμ„±μž

β–ͺ  FIELD : ν•„λ“œ(λ©€λ²„λ³€μˆ˜, enumμƒμˆ˜)

β–ͺ  LOCAL_VARIABLE : μ§€μ—­λ³€μˆ˜

β–ͺ  METHOD : λ©”μ„œλ“œ

β–ͺ  PACKAGE : νŒ¨ν‚€μ§€

β–ͺ  PARAMETER : λ§€κ°œλ³€μˆ˜

β–ͺ  TYPE : νƒ€μž…(클래슀, μΈν„°νŽ˜μ΄μŠ€, enum)

β–ͺ  TYPE_PARAMETER : νƒ€μž… λ§€κ°œλ³€μˆ˜

β–ͺ  TYPE_USE : ν‹°μž…μ΄ μ‚¬μš©λ˜λŠ” λͺ¨λ“  κ³³

@MyAnnotation // TYPE
class MyClass {
    @MyAnnotation // FIELD
    int i;
    
    @MyAnnotation // TYPE_USE
    MyClass mc
}

 

βœ”οΈ @Retention

: μ• λ„ˆν…Œμ΄μ…˜μ΄ μœ μ§€λ˜λŠ” 기간을 μ§€μ •ν•˜λŠ”λ° μ‚¬μš©

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface { ... }

 

πŸ“‹ @Retention으둜 μ§€μ •ν•  수 μžˆλŠ” μ• λ„ˆν…Œμ΄μ…˜ μœ μ§€μ •μ±…μ˜ μ’…λ₯˜

β–ͺ  SOURCE : μ†ŒμŠ€ νŒŒμΌμ—λ§Œ 쑴재 ← 컴파일러λ₯Ό 직접 μž‘μ„±ν•  것이 μ•„λ‹ˆλ©΄ μ‚¬μš©ν•  일이 μ—†μŒ!

β–ͺ  CLASS : 클래슀 νŒŒμΌμ— 쑴재 (κΈ°λ³Έκ°’)

β–ͺ  RUNTIME : λŸ°νƒ€μž„(μ‹€ν–‰ μ‹œ)에도 μ‚¬μš©κ°€λŠ₯ (by λ¦¬ν”Œλ ‰μ…˜)

 

πŸ™‹πŸ»‍♀️ λ¦¬ν”Œλž™μ…˜?

πŸ‘©πŸ»‍🏫  ν΄λž˜μŠ€μ˜ λ©”μ†Œλ“œ, νƒ€μž…, λ³€μˆ˜λ“€μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” μžλ°” API, Class 객체λ₯Ό ν†΅ν•΄μ„œ μ‚¬μš©

https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

 

Class (Java Platform SE 8 )

Determines if the specified Class object represents a primitive type. There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as the primitive types tha

docs.oracle.com

import static java.long.annotation.ElementType.*;

@Target(TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();
}

@MyAnnotation("you can put the value here")
class AnnotationResolver {
    Class<AnnotationResolver> me = AnnotationResolver.class;
    
    MyAnnotation anno = (MyAnnotation) me.getAnnotation(AnnotationResolver.class);
    System.out.println(anno.value()); // you can put the value here
}

❕ getAnnotations()λ₯Ό 톡해 λͺ¨λ“  μ• λ„ˆν…Œμ΄μ…˜μ„ λ°°μ—΄λ‘œ 받을 μˆ˜λ„ 있음!

 

βœ”οΈ @Documented

: μ• λ„ˆν…Œμ΄μ…˜μ— λŒ€ν•œ 정보가 javadoc으둜 μž‘μ„±ν•œ λ¬Έμ„œμ— ν¬ν•¨λ˜λ„λ‘ 함

https://www.geeksforgeeks.org/java-documented-annotations/

 

Java @Documented Annotations - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

βœ”οΈ @Inherited

: μ• λ„ˆν…Œμ΄μ…˜μ΄ μžμ† ν΄λž˜μŠ€μ—λ„ μƒμ†λ˜λ„λ‘ ν•˜λŠ” 것

@Inherited
public @interface MyAnnotation { ... }

@MyAnnotation
class MyClass { ... }

class MyLittleClass extends MyClass { ... } // @MyAnnotation이 뢙은 κ²ƒμœΌλ‘œ 인식

 

βœ”οΈ @Repeatable

: ν•˜λ‚˜μ˜ λŒ€μƒμ— 같은 μ• λ„ˆν…Œμ΄μ…˜μ„ μ—¬λŸ¬λ²ˆ 뢙일 수 있게 ν•˜λŠ” 것

@Repeatable(ToDos.class)
public @interface ToDo {
    String value();
}
@ToDo("delete test codes")
@ToDo("override inherited method")
class MyClass { ... }

 

❕ 일반적인 μ• λ„ˆν…Œμ΄μ…˜κ³Ό 달리 같은 μ΄λ¦„μ˜ μ• λ„ˆν…Œμ΄μ…˜μ΄ μ—¬λŸ¬ κ°œκ°€ ν•˜λ‚˜μ˜ λŒ€μƒμ— 적용될 수 있기 λ•Œλ¬Έμ—, 이 μ• λ„ˆν…Œμ΄μ…˜λ“€μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ λ‹€λ£° 수 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆ μ• λ„ˆν…Œμ΄μ…˜λ„ μΆ”κ°€λ‘œ μ •μ˜ν•΄μ•Όν•¨! (ex. ToDos.class)

@interface ToDos {
    ToDo[] value();
}

 

βœ”οΈ @Native

: λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œμ— μ˜ν•΄ μ°Έμ‘°λ˜λŠ” μƒμˆ˜ ν•„λ“œμ— λΆ™μ΄λŠ” μ• λ„ˆν…Œμ΄μ…˜

 

πŸ™‹πŸ»‍♀️ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ?

πŸ‘©πŸ»‍🏫 JVM이 μ„€μΉ˜λœ OS의 λ©”μ„œλ“œ, 보톡 Cμ–Έμ–΄λ‘œ μž‘μ„±λ˜λ©° μžλ°”μ—μ„œλŠ” λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λ§Œ μ •μ˜ν•˜κ³  κ΅¬ν˜„μ€X, ν˜ΈμΆœν•˜λ©΄ OS의 λ©”μ„œλ“œκ°€ 호좜됨

❕ 이것을 μœ„ν•΄μ„œ μžλ°”μ— μ •μ˜λœ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œμ™€ OS의 λ©”μ„œλ“œλ₯Ό μ—°κ²°ν•΄μ£ΌλŠ” μž‘μ—…μ΄ μΆ”κ°€λ‘œ ν•„μš”ν•¨(JNI의 μ—­ν• )

 

πŸ“Œ μ• λ„ˆν…Œμ΄μ…˜μ„ 직접 λ§Œλ“€μ–΄λ³΄μž!

@interface μ• λ„ˆν…Œμ΄μ…˜μ΄λ¦„ {
    νƒ€μž… μš”μ†Œμ΄λ¦„(); // μ• λ„ˆν…Œμ΄μ…˜μ˜ μš”μ†Œ μ„ μ–Έ
    ...
}

 

βœ”οΈ μ• λ„ˆν…Œμ΄μ…˜ μš”μ†Œ

: μ• λ„ˆν…Œμ΄μ…˜ 내에 μ„ μ–Έλœ λ©”μ„œλ“œ(λ°˜ν™˜κ°’O, λ§€κ°œλ³€μˆ˜X, 상속을 톡해 κ΅¬ν˜„ν•  ν•„μš”X)

: μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  λ•Œ 이 μš”μ†Œλ“€μ˜ 값을 빠짐없이 지정해주어야함! (λ””ν΄νŠΈκ°’ μ§€μ • OK)

 

πŸ“‹ μ• λ„ˆν…Œμ΄μ…˜ μš”μ†Œ κ·œμΉ™

1️⃣ μš”μ†Œμ˜ νƒ€μž…μ€ κΈ°λ³Έν˜•, String, enum, μ• λ„ˆν…Œμ΄μ…˜, Class만 ν—ˆμš©

2️⃣ ()μ•ˆμ— λ§€κ°œλ³€μˆ˜ μ„ μ–ΈX

3️⃣ μ˜ˆμ™Έ μ„ μ–ΈX

4️⃣ μš”μ†Œλ₯Ό νƒ€μž… λ§€κ°œλ³€μˆ˜(T)둜 μ •μ˜X

@interface TestInfo {
    int count() default 1;
    String testedBy();
    String[] testTools() default { "JUnit", "AutoTester" };
    TestType testType() default TestType.FIRST; // enum TestType { FIRST, FINAL }
    DataTime testDate(); //μžμ‹ μ΄ μ•„λ‹Œ λ‹€λ₯Έ μ• λ„ˆν…Œμ΄μ…˜μ„ 포함O
}

@interface DataTime {
    String yymmdd();
    String hhmmss();
}
@TestInfo(testedBy="aaa", 
        testDate=@DateTime(yymmdd="230719", hhmmss="010859"))

 

❕ μ• λ„ˆν…Œμ΄μ…˜ μš”μ†Œκ°€ ν•˜λ‚˜λΏμ΄κ³  이름이 value인 경우, μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  λ•Œ μš”μ†Œμ˜ 이름을 μƒλž΅ν•΄λ„ 됨

@interface TestInfo { String value(); }

@TestInfo("passed")
class MyTest() { ... }

 

❕ λͺ¨λ“  μ• λ„ˆν…Œμ΄μ…˜μ˜ 쑰상은 Annotationμž„. ν•˜μ§€λ§Œ μ• λ„ˆν…Œμ΄μ…˜μ€ 상속 ν—ˆμš©X 

❕ μ• λ„ˆν…Œμ΄μ…˜μ— μš”μ†Œκ°€ ν•˜λ‚˜λ„ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ 마컀 μ• λ„ˆν…Œμ΄μ…˜μ΄λΌκ³  함!

 

 

'μ–Έμ–΄ > μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

λžŒλ‹€(lambda)  (0) 2023.08.06
μ“°λ ˆλ“œ  (0) 2023.07.30
μ—΄κ±°ν˜•  (0) 2023.07.17
μ§€λ„€λ¦­μŠ€  (0) 2023.07.14
μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›  (0) 2023.07.13
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/05   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
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
κΈ€ 보관함