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์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ๋๋ค.

๊ทธ๋ฌ๋ ์์์ ๋ณธ ์์ ์ฒ๋ผ 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