๐ ์ด๊ฑฐํ (Enum)
enum Seasons { SPRING, SUMMER, FALL, WINTER }
enum Frameworks { DJANGO, SPRING, NEST, EXPRESS }
- ์ฌ๋ฌ ์์๋ค์ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ์ ์ธํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํด ์ค๋ค.
- ์์๋ช ์ ์ค๋ณต์ ํผํ ์ ์๋ค.
- ํ์ ์ ๋ํ ์์ ์ฑ์ ๋ณด์ฅํ๋ค.
- ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข๋ค.
- switch๋ฌธ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๋ฆฌํด ํ์ | ๋ฉ์๋(๋งค๊ฐ๋ณ์) | ์ค๋ช |
String | name() | ์ด๊ฑฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์์ด์ ๋ฆฌํดํ๋ฉฐ, ๋ฆฌํด๋๋ ๋ฌธ์์ด์ ์ด๊ฑฐํ์ ์ ์ ์ํ ๋ ์ฌ์ฉํ ์์ ์ด๋ฆ๊ณผ ๋์ผํ๋ค. |
int | ordinal() | ์ด๊ฑฐ ๊ฐ์ฒด์ ์๋ฒ(0๋ถํฐ ์์)์ ๋ฆฌํดํ๋ค. |
int | compareTo(๋น๊ต๊ฐ) | ์ฃผ์ด์ง ๋งค๊ฐ๊ฐ๊ณผ ๋น๊ตํด์ ์๋ฒ ์ฐจ์ด๋ฅผ ๋ฆฌํดํ๋ค. |
์ด๊ฑฐ ํ์ | valueOf(String name) | ์ฃผ์ด์ง ๋ฌธ์์ด์ ์ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค. |
์ด๊ฑฐ ๋ฐฐ์ด | values() | ๋ชจ๋ ์ด๊ฑฐ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด๋ก ๋ฆฌํดํ๋ค. |
enum Level {
LOW, // 0
MEDIUM, // 1
HIGH // 2
}
public class EnumTest {
public static void main(String[] args) {
Level level = Level.MEDIUM;
Level[] allLevels = Level.values();
for(Level x : allLevels) {
System.out.printf("%s=%d%n", x.name(), x.ordinal());
}
Level findLevel = Level.valueOf("LOW");
System.out.println(findLevel);
System.out.println(Level.LOW == Level.valueOf("LOW"));
switch(level) {
case LOW:
System.out.println("๋ฎ์ ๋ ๋ฒจ");
break;
case MEDIUM:
System.out.println("์ค๊ฐ ๋ ๋ฒจ");
break;
case HIGH:
System.out.println("๋์ ๋ ๋ฒจ");
break;
}
}
}
//์ถ๋ ฅ๊ฐ
LOW=0
MEDIUM=1
HIGH=2
LOW
true
์ค๊ฐ ๋ ๋ฒจ
๐ ์ ๋ํ ์ด์ (Annotation)
์ฃผ์์ ์ฝ๋๋ฅผ ์ฝ๋ '์ฌ๋'์๊ฒ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ , ์ ๋ํ ์ด์ ์ ํน์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ 'ํ๋ก๊ทธ๋จ'์๊ฒ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
๐ ์ ๋ํ ์ด์ ์ ์ข ๋ฅ
๐ ํ์ค ์ ๋ํ ์ด์
์๋ฐ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ ๋ํ ์ด์
ํ์ค ์ ๋ํ ์ด์ | ์ค๋ช |
@Override | ์ปดํ์ผ๋ฌ์๊ฒ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๊ฒ์ด๋ผ๊ณ ์๋ฆฐ๋ค. |
@Deprecated | ์์ผ๋ก ์ฌ์ฉํ์ง ์์ ๋์์์ ์๋ฆฐ๋ค. |
@FunctionalInterface | ํจ์ํ ์ธํฐํ์ด์ค๋ผ๋ ๊ฒ์ ์๋ฆฐ๋ค. |
@SuppressWarning | ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ๋ฉ์ธ์ง๋ฅผ ๋ํ๋ด์ง ์๊ฒ ํ๋ค. |
๐ ๋ฉํ ์ ๋ํ ์ด์
- ์ ๋ํ ์ด์ ์ ๋ถ์ด๋ ์ ๋ํ ์ด์
- ์ ๋ํ ์ด์ ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
๋ฉํ ์ ๋ํ ์ด์ | ์ค๋ช |
@Target | ์ ๋ํ ์ด์ ์ ์ ์ํ ๋ ์ ์ฉ ๋์์ ์ง์ ํ๋๋ฐ ์ฌ์ฉํ๋ค. |
@Documented | ์ ๋ํ ์ด์ ์ ๋ณด๋ฅผ javadoc์ผ๋ก ์์ฑ๋ ๋ฌธ์์ ํฌํจ์ํจ๋ค. |
@Inherited | ์ ๋ํ ์ด์ ์ด ํ์ ํด๋์ค์ ์์๋๋๋ก ํ๋ค. |
@Retention | ์ ๋ํ ์ด์ ์ด ์ ์ง๋๋ ๊ธฐ๊ฐ์ ์ ํ๋๋ฐ ์ฌ์ฉํ๋ค. |
@Repeatable | ์ ๋ํ ์ด์ ์ ๋ฐ๋ณตํด์ ์ ์ฉํ ์ ์๊ฒ ํ๋ค. |
๐ ์ฌ์ฉ์ ์ ์ ์ ๋ํ ์ด์
์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ๋ ์ ๋ํ ์ด์
๐ ํ์ค ์ ๋ํ ์ด์
๐ @Override
์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๋ฉ์๋๋ผ๋ ๊ฒ์ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค์ค๋ค.
- ๋ฉ์๋๋ช ์คํ ๋ฐฉ์ง
๐ @Deprecated
์๋ก์ด ๊ฒ์ผ๋ก ๋์ฒด๋์์ผ๋ ๊ธฐ์กด์ ๊ฒ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๊ถ์ฅํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
- ์ปดํ์ผ ๊ฒฝ๊ณ
๐ @SuppressWarnings
์ปดํ์ผ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ๋ํ๋์ง ์๋๋ก ํ๋ค.
์ ๋ํ ์ด์ | ์ค๋ช |
@SuppressWarings(”all”) | ๋ชจ๋ ๊ฒฝ๊ณ ๋ฅผ ์ต์ |
@SuppressWarings(”deprecation”) | Deprecated ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋์ค๋ ๊ฒฝ๊ณ ์ต์ |
@SuppressWarings(”fallthrough”) | switch๋ฌธ์์ break ๊ตฌ๋ฌธ์ด ์์ ๋ ๊ฒฝ๊ณ ์ต์ |
@SuppressWarings(”finally”) | finally ๊ด๋ จ ๊ฒฝ๊ณ ์ต์ |
@SuppressWarings(”null”) | null ๊ด๋ จ ๊ฒฝ๊ณ ์ต์ |
@SuppressWarings(”unchecked”) | ๊ฒ์ฆ๋์ง ์์ ์ฐ์ฐ์ ๊ด๋ จ ๊ฒฝ๊ณ ์ต์ |
@SuppressWarings(”unused”) | ์ฌ์ฉํ์ง ์๋ ์ฝ๋ ๊ด๋ จ ๊ฒฝ๊ณ ์ต์ |
@SuppressWarnings({"deprecation", "unused", "null"})
- ์ฌ๋ฌ ๊ฐ๋ ๊ฐ๋ฅํ๋ค.
๐ @FuntionalInterface
ํจ์ํ ์ธํฐํ์ด์ค์ ์ ์ธ์ด ๋ฐ๋ฅด๊ฒ ์ ์ธ๋์๋์ง ํ์ธํ๋ค.
@FunctionalInterface
public interface Runnable {
public abstract void run (); // ํ๋์ ์ถ์ ๋ฉ์๋
}
- ํจ์ํ ์ธํฐํ์ด์ค๋ ๋จ ํ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
๐ ๋ฉํ ์ ๋ํ ์ด์
๐ @Target
์ ๋ํ ์ด์ ์ ์ ์ฉํ ๋์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
๋์ ํ์ | ์ ์ฉ๋ฒ์ |
ANNOTATION_TYPE | ์ ๋ํ ์ด์ |
CONSTRUCTOR | ์์ฑ์ |
FIELD | ํ๋(๋ฉค๋ฒ๋ณ์, ์ด๊ฑฐํ ์์) |
LOCAL_VARIABLE | ์ง์ญ๋ณ์ |
METHOD | ๋ฉ์๋ |
PACKAGE | ํจํค์ง |
PARAMETER | ๋งค๊ฐ๋ณ์ |
TYPE | ํ์ (ํด๋์ค, ์ธํฐํ์ด์ค, ์ด๊ฑฐํ) |
TYPE_PARAMETER | ํ์ ๋งค๊ฐ๋ณ์ |
TYPE_USE | ํ์ ์ด ์ฌ์ฉ๋๋ ๋ชจ๋ ๋์ |
import static java.lang.annotation.ElementType.*;
//import๋ฌธ์ ์ด์ฉํ์ฌ ElementType.TYPE ๋์ TYPE๊ณผ ๊ฐ์ด ๊ฐ๋จํ ์์ฑํ ์ ์๋ค.
@Target({FIELD, TYPE, TYPE_USE}) // ์ ์ฉ๋์์ด FIELD, TYPE, TYPE_USE
public @interface CustomAnnotation { } // CustomAnnotation์ ์ ์
@CustomAnnotation // ์ ์ฉ๋์์ด TYPE์ธ ๊ฒฝ์ฐ
class Main {
@CustomAnnotation // ์ ์ฉ๋์์ด FIELD์ธ ๊ฒฝ์ฐ
int i;
}
๐ @Documented
- ์ ๋ํ ์ด์ ์ ์ ๋ณด๋ฅผ javadoc์ผ๋ก ์์ฑํ ๋ฌธ์์ ํฌํจ๋๊ฒ ํ๋ค.
- ํ์ค ์ ๋ํ ์ด์ ๊ณผ ๋ฉํ ์ ๋ํ ์ด์ ์ค @Override์ @SuppressWarnings๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ @Documented๊ฐ ์ ์ฉ๋์ด์๋ค.
๐ @Inherited
ํ์ ํด๋์ค๊ฐ ์ ๋ํ
์ด์
์ ์์๋ฐ๊ฒ ํ๋ค.
๐ @Retention
์ ๋ํ ์ด์ ์ ์ง์ ์๊ฐ์ ์ง์ ํ๋ค.
์ ์ง ์ ์ฑ | ์ค๋ช |
SOURCE | ์์ค ํ์ผ์ ์กด์ฌ, ํด๋์ค ํ์ผ์๋ ์กด์ฌํ์ง ์์ |
CLASS | ํด๋์ค ํ์ผ์ ์กด์ฌ, ์คํ ์์ ์ฌ์ฉ๋ถ๊ฐ, ๊ธฐ๋ณธ๊ฐ |
RUNTIME | ํด๋์ค ํ์ผ์ ์กด์ฌ, ์คํ ์์ ์ฌ์ฉ๊ฐ๋ฅ |
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
//์ค๋ฒ๋ผ์ด๋ฉ์ด ์ ๋๋ก ๋์๋์ง ์ปดํ์ผ๋ฌ๊ฐ ํ์ธํ๋ ์ฉ๋
//ํด๋์ค ํ์ผ์ ๋จ๊ธธ ํ์ ์์ด ์ปดํ์ผ์์๋ง ํ์ธํ๊ณ ์ฌ๋ผ์ง
public @interface Override(){ }
๐ @Repeatable
์ ๋ํ ์ด์ ์ ์ฌ๋ฌ ๋ฒ ๋ถ์ผ ์ ์๋๋ก ํ์ฉํ๋ค.
@interface Works { // ์ฌ๋ฌ๊ฐ์ Work์ ๋ํ
์ด์
์ ๋ด์ ์ปจํ
์ด๋ ์ ๋ํ
์ด์
Works
Work[] value();
}
// Work ์ ๋ํ
์ด์
์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ์ธ ์ ์๊ฒ ํ๋ค.
@Repeatable(Works.class) // ์ปจํ
์ด๋ ์ ๋ํ
์ด์
์ง์
@interface Work {
String value();
}
@Work("์ฝ๋ ์
๋ฐ์ดํธ")
@Work("๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ")
class Main{
... ์๋ต ...
}
๐ ์ฌ์ฉ์ ์ ํฐ๋ค์ด์
์ฌ์ฉ์๊ฐ ์ง์ ์ ๋ํ ์ด์ ์ ์ ์ํด์ ์ฌ์ฉํ๋ ๊ฒ
@interface ์ ๋ํ
์ด์
๋ช
{ // ์ธํฐํ์ด์ค ์์ @๊ธฐํธ๋ง ๋ถ์ด๋ฉด ์ ๋ํ
์ด์
์ ์ ์ํ ์ ์๋ค.
ํ์
์์๋ช
(); // ์ ๋ํ
์ด์
์์๋ฅผ ์ ์ธ
}
- ์ ๋ํ ์ด์ ์ java.lang.annotation ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ ์๋ค.