KKG
Programming
KKG
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ์ „์ฒด ๊ธ€ ๋ณด๊ธฐ (84)
    • ํšŒ๊ณ  (9)
    • Bootcamp (19)
    • Error Handling (2)
    • Kotlin (1)
    • Java (19)
      • Java (14)
      • Spring (1)
      • JPA (2)
      • Link (2)
    • Python (5)
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (20)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (4)
      • ๋ฐฑ์ค€ (14)
      • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (1)
      • Link (1)
    • SQL (5)
      • SQL (1)
      • MySQL (4)
    • Web (2)
    • etc (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก
  • ๊นƒํ—ˆ๋ธŒ

์ธ๊ธฐ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
KKG

Programming

Bootcamp

Java - ์—ด๊ฑฐํ˜•, ์• ๋„ˆํ…Œ์ด์…˜

2022. 7. 18. 11:37

๐Ÿ“š ์—ด๊ฑฐํ˜• (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 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
    'Bootcamp' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • TCP/UDP, Port, URL, Domain
    • Java - ๋žŒ๋‹ค, ์ŠคํŠธ๋ฆผ, Optional
    • Java - ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
    • Java - ์ œ๋„ค๋ฆญ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”