JiwonDev

6-1 Enum๊ณผ @์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ผ.

by JiwonDev

# int ์ƒ์ˆ˜ ๋Œ€์‹  Enum์„ ์‚ฌ์šฉํ•˜๋ผ.

Enum์€ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ , ๋ณ€๊ฒฝ์— ์•ˆ์ „ํ•˜๊ณ , ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๊ธฐ๋Šฅ์ด ๊ฐ•๋ ฅํ•˜๋‹ค.

๋งŒ์•ฝ ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์ˆ˜์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋ฉด switch(int) ๋Œ€์‹ ์— ์ƒ์ˆ˜๋ณ„ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.

enum Dog {
    SCHNAUZER {
        @Override
        public void bark() { System.out.println("๋ฉ๋ฉ๋ฉ๋ฉ๋ฉ"); }
    },

    POODLE {
        @Override
        public void bark() { System.out.println("๋ฉ๋ฉ"); }
    };

    // ์‚ฌ์šฉํ•  ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์•„๋ž˜์— ์„ ์–ธํ•ด์ค€๋‹ค.
    abstract public void bark();
}

 

ํ˜น์€ ์ƒ์ˆ˜์— ํŠน์ • ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, enum์˜ ์ƒ์„ฑ์ž์™€ ํ•„๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

enum Cat {
    SCHNAUZER(20) {
        @Override
        public void bark() { System.out.println("๋ฉ๋ฉ๋ฉ๋ฉ๋ฉ"); }
    },

    HUSKY(10) { // ์ƒ์„ฑ์ž๋งŒ ๋ฐ”๊พธ๋ฉด ๋ญ๋“ ์ง€ ๊ฐ€๋Šฅ. HUSKY(10,"Hello",10.5L)
        @Override
        public void bark() { System.out.println("์™ˆ์™ˆ"); }
    };

    private final int number;

    Cat(int num) {
        // Cat.values()๋ฅผ ์ด์šฉํ•ด Enum ์— ํ• ๋‹น๋œ ๋ชจ๋“  ๊ฐ’ ์กฐํšŒ ๊ฐ€๋Šฅ.
        // Cat.values() == {10,20}        SCHNAUZER, HUSKY
        this.number = num;
    }

    abstract public void bark();

}

 

enum๊ณผ lambda๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Enum์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

public enum Operation {
    PLUS  ("+", (x, y) -> x + y), // ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ
    MINUS ("-", (x, y) -> x - y),
    TIMES ("*", (x, y) -> x * y),
    DIVIDE("/", (x, y) -> x / y);

    private final String symbol;
    private final DoubleBinaryOperator op;

    Operation(String symbol, DoubleBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }
	
    // toString()์„ ์ด์šฉํ•ด์„œ enum์˜ ๊ธฐ๋ณธ ์ถœ๋ ฅ๊ฐ’์„ ์ง€์ •.
    @Override public String toString() { return symbol; }
	
    // ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์œผ๋กœ ๋“ค๊ณ ์žˆ๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰.
    public double apply(double x, double y) {
        return op.applyAsDouble(x, y);
    }
	
    // enum์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋น„์Šทํ•˜๊ฒŒ static ๋ฉ”์„œ๋“œ๋Š” ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
    public static void main(String[] args) {
        double x = Double.parseDouble(args[0]);
        double y = Double.parseDouble(args[1]);
        
        for (Operation op : Operation.values())
            System.out.printf("%f %s %f = %f",
                               x, op, y, op.apply(x, y));
    }
}

 

 

# ๋น„ํŠธ ํ•„๋“œ ๋Œ€์‹  EnumSet์„ ์‚ฌ์šฉํ•˜๋ผ.

๋น„ํŠธ ํ•„๋“œ๋Š” ๊ธฐ์กด์˜ C์–ธ์–ด ๋“ฑ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ข…์ข… ์‚ฌ์šฉํ•˜๊ณ ๋Š” ํ•œ๋‹ค.

public class Text {
    public static final int A = 1 << 0;
    public static final int B = 1 << 1;
    public static final int C = 1 << 2;
    public static final int D = 1 << 3;
}

// ์ด๋Ÿฐ์‹์œผ๋กœ OR ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด์„œ ์—ด๊ฑฐํƒ€์ž…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
// [ABCD] = [0000], ๋งŒ์•ฝ A์™€ C๊ฐ€ True๋ผ๋ฉด [1010] ์œผ๋กœ ํŒ๋ณ„ํ•˜๋Š” ์…ˆ.
text.applyStyles(STYLE_BOLD | STYLE_ITALIC)

 

ํ•˜์ง€๋งŒ ์ž๋ฐ”์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ํ•  ์ด์œ ๊ฐ€ ์ „ํ˜€ ์—†๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Enum์„ Set์— ๋„ฃ์–ด ์‚ฌ์šฉํ•˜์ž. Enum์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

import java.util.Set;

public class Text{
    public enum Style{
        A, B, C, D;
    }
    
    // ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” enum ๊ฐ’์„ Set์— ๋„ฃ์–ด์„œ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์ž.
    // ๋ฌผ๋ก  ํ•„์š”ํ•˜๋‹ค๋ฉด Set์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.
    public void applyStyles(Set<Style> styles) {
        ...
    }
}

 

๋‹ค๋งŒ Java11 ๊ธฐ์ค€์œผ๋กœ final Enum Set ๊ฐ™์€๊ฑด ์—†๋‹ค. ํ•„์š”ํ•˜๋ฉด ๊ตฌ๊ธ€ Guava ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ธดํ•˜๋‹ค.

 

 

# Enum.ordinal( )์€ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๋งŒ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค.

ordinal()๋Š” Enum์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•  ์ผ๋„ ์—†๊ณ , ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด๋Š” EnumSet์ด๋‚˜ EnumMap์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

enum์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ. ordinal์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š”๊ฑฐ์ง€, ์“ฐ๋ผ๊ณ  ๋งŒ๋“ ๊ฒŒ ์•„๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ์œ„์—์„œ ๋ณธ ์˜ˆ์ œ์ฒ˜๋Ÿผ DOG(10), CAT(11); ์ด๋Ÿฐ ๋ฐฉ์‹์˜ EnumMap์„ ์‚ฌ์šฉํ•˜์ž.

Enum.ordinal์€ ์ƒ์ˆ˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ณ , ์• ์ดˆ์— ์‚ฌ์šฉํ•ด๋ผ๊ณ  ๋งŒ๋“ ๊ฒŒ ์•„๋‹ˆ๋‹ค.

 

 

# ์—ด๊ฑฐํƒ€์ž…์˜ ํ™•์žฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

enum์€ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์œ„์—์„œ ๋ณด์—ฌ์ค€ ์˜ˆ์‹œ์ฒ˜๋Ÿผ, enum ์•ˆ์—์„œ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๊ฑด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ธฐ์กด์˜ ์—ด๊ฑฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ณณ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค.

public interface Animal {
	void bark();
}
// enum(์—ด๊ฑฐํƒ€์ž…) ํ™•์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ
public enum Dog implements Animal {
	SCHNAUZER {
		@Override
		public void bark() {
			System.out.println("๋ฉ๋ฉ๋ฉ๋ฉ๋ฉ");
		}
	},
	HUSKY {
		@Override
		public void bark() {
			System.out.println("์™ˆ์™ˆ");
		}
	},
	POODLE {
		@Override
		public void bark() {
			System.out.println("๋ฉ๋ฉ");
		}
	};
}

 

 

# ๋ช…๋ช… ํŒจํ„ด๋ณด๋‹ค ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ผ.

๊ธฐ์กด์˜ ์ž๋ฐ”๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์ด๋‚˜ ํŠน๋ณ„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ ๋ช…๋ช…ํŒจํ„ด์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.

testMethod, testService, HelloMBean, MyClassMBean

  • ์ •ํ™•ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ tset๋กœ ์˜คํƒ€๊ฐ€๋‚˜์„œ ํด๋ž˜์Šค๊ฐ€ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋˜์–ด ๋ฌด์‹œ๋œ๋‹ค๋ฉด?
  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„๋งŒ์œผ๋กœ๋Š” ์ถ”๊ฐ€์ ์ธ ์„ค์ •๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค.
  • ๊ทธ๋ƒฅ ๋ณด๊ธฐ๋งŒํ•ด๋„ ๊ตฌ๋ฆฌ๋‹ค. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๊ฐ•์ œ๋˜๊ณ  ํŠน์ • ๋ฉ”์„œ๋“œ๋งŒ ์ œ์™ธ/์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

์ด์ œ ์ข€ ํž™- ํ•˜๊ฒŒ ์• ๋„ˆํ…Œ์ด์…˜์„ ํ™œ์šฉํ•ด์„œ ๋งŒ๋“ค๋„๋ก ํ•˜์ž. ์•„๋ฌด๋Ÿฐ ๊ธฐ๋Šฅ์„ ํ•˜์ง€์•Š๋”๋ผ๋„ ์• ๋„ˆํ…Œ์ด์…˜ (@Test ์ฒ˜๋Ÿผ) ์„ ์ด์šฉํ•ด ๋งˆํ‚นํ•ด๋†“๋Š”๋‹ค๋ฉด ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ํŽธํ•ด์ง„๋‹ค. ์ถ”๊ฐ€๋กœ ์• ๋„ˆํ…Œ์ด์…˜์—๋Š” ์ธ์ž๋ฅผ ์ค„ ์ˆ˜์žˆ์œผ๋‹ˆ ์„ค์ •๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋„ ์ข‹๊ณ .

@ParameterizedTest
@ValueSource(strings = {"1", "a", "1a234567890123456"})
@DisplayName("์š”์ฒญ Body์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ˜•์‹์ด ๋งž์ง€ ์•Š์€ ๊ฒฝ์šฐ 400 ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.")
void http_json_password_is_invalid(String args) throws Exception {
    // Arrange
    var request = new LoginAccountCommand();
    ...

 

+ [Item41. ์ •์˜ํ•˜๋ ค๋Š” ๊ฒƒ์ด ํƒ€์ž…์ด๋ผ๋ฉด ๋งˆ์ปค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ผ]

ํƒ€์ž…์„ ์ •์˜ํ•˜๋ ค๋ฉด ์• ๋…ธํ…Œ์ด์…˜๊ณผ ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค...๋งŒ ์ด๊ฑด API ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์œ ์šฉํ•œ ์ •๋ณด.

์˜ˆ๋ฅผ ๋“ค์–ด ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ํƒ€์ž… Serializable๋“ฑ์ด ์žˆ๊ฒ ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์€ ํŠน์ • ํƒ€์ž…์„ ๋Œ€์ƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์œผ๋‹ˆ๊นŒ.

 

 

# @Override๋Š” ๋ฉ‹์œผ๋กœ ๋‹ฌ์•„๋…ผ๊ฒŒ ์•„๋‹ˆ๋‹ค.

๋ถ€๋ชจ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ–ˆ์Œ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ค˜์„œ, ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ์— ์—†๋Š” ํ•จ์ˆ˜๋ผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋„์›Œ์ค€๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด equals ๋ฉ”์„œ๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์žฌ์ •์˜ํ•˜๋ฉด ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. ๋ฐ˜ํ™˜ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ˆ๊นŒ.

//@Override ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋œ๋‹ค.
public boolean equals(Hello other){ // ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์ด Object๊ฐ€ ์•„๋‹ˆ๋ผ์„œ ์˜ค๋ฒ„๋กœ๋”ฉ ๋˜์–ด๋ฒ„๋ฆผ.
	...
}

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ