์๋
ํ์ธ์! ์ค๋ ์ฐ๋ฆฌ๋ Java์ ํน๋ณํ ๋ฐ์ดํฐ ์ ํ
Enum
(์ด๊ฑฐ์ ์ฝ์ด)์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ๊ทธ๋ค์ ํน์ง์ ๋ฌด์์
๋๊น? ํ๋ก๊ทธ๋จ์์ ์์ ๊ตฌํํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์ธ ๊ฒ ๊ฐ๋์? ๊ฐ ๋ฌ์ ์ด๋ค ์์ฑ์ด ์๋์ง ํ์ธํ๋ฉด ๋ฉ๋๋ค. ์๋ง๋ ๋จผ์ ๋ฌ์ ์ด๋ฆ๊ณผ ๊ทธ ๋ฌ์ ์ผ์๊ฐ ํ์ํ ๊ฒ์
๋๋ค. ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์ ๋งค์ฐ ๊ฐ๋จํด ๋ณด์
๋๋ค.
public class Month {
private String name;
private int daysCount;
public Month(String name, int daysCount) {
this.name = name;
this.daysCount = daysCount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDaysCount() {
return daysCount;
}
public void setDaysCount(int daysCount) {
this.daysCount = daysCount;
}
@Override
public String toString() {
return "Month{" +
"name='" + name + '\'' +
", daysCount=" + daysCount +
'}';
}
}
ํ์ธํธ ๋ถํ๋๋ ค์! ์ฐ๋ฆฌ๋ ํด๋์ค Month
, ํ์ ํ๋, getters-setters๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค toString()
. equals()
์์ ํ ํ๋ณต์ ์ํด ์ถ๊ฐํ ํ์ ๊ฐ ์๋ค๋ฉด hashCode()
:) ๊ทธ๋ฌ๋ ๊ฐ๋
์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ธฐ์ตํ์๊ฒ ์ง๋ง OOP์ ์ฃผ์ ์ฅ์ ์ค ํ๋๋ ์ค์ ์ํฐํฐ๋ฅผ ์ฝ๊ฒ ๋ชจ๋ธ๋งํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์์, ์๋์ฐจ, ํ์ฑ - ์ผ์์ํ์์ ๋ฐ์ํ๋ ์ด๋ฌํ ๋ชจ๋ ๊ฐ๋
์ ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์์ ์ฝ๊ฒ ํํํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ ํ์ค ์ธ๊ณ์ ์ผ๋ถ ์ํฐํฐ๊ฐ ์๋ฏธ ๋ฒ์๊ฐ ์๊ฒฉํ ์ ํ๋์ด ์๋ค๋ ๊ฒ์
๋๋ค. 1๋
์๋ 4๊ณ์ ๋ฐ์ ์์ต๋๋ค. ์์
์๋ 7๊ฐ์ ์ํ๋ง ์์ต๋๋ค. ๋ฌ๋ ฅ์๋ 12๊ฐ์๋ง ์์ต๋๋ค. Ocean์๋ 11๋ช
์ ์น๊ตฌ๋ง ์์ต๋๋ค(๋
ผ์์ ์ฌ์ง๊ฐ ์์ง๋ง :)). ์ฆ, ์ผ๋ฐ Java ํด๋์ค๋ ์ด๋ฌํ ์ํฐํฐ๋ฅผ ๋ชจ๋ธ๋งํ๊ณ ์์ฐ์ค๋ฌ์ด ์ ์ฝ ์กฐ๊ฑด์ ์กด์คํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ ์์
์๋ Month
ํ์ํ ๋ชจ๋ ๋ถ์ผ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋๊ตฌ๋ ๊ทธ๊ฐ ์์ ํ ์ด์ํ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ง์ง ๋ชปํ ๊ฒ์
๋๋ค.
public class Main {
Month month1 = new Month("lolkek", 322);
Month month2 = new Month("yahoooooooooooo", 12345);
}
ํ๋ก๊ทธ๋จ์ ์ด๋ฐ ๋ด์ฉ์ด ๋์ค๋ฉด ๋ฒ์ธ ์ฐพ๊ธฐ๊ฐ ์ฝ์ง ์๊ฒ ์ฃ ! ํํธ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ ํ๋ก๊ทธ๋๋จธ๋ ํด๋์ค๊ฐ Month
"์ฐ๋์ ๋ฌ"์ ์๋ฏธํ๋ค๋ ๊ฒ์ ์ดํดํ๊ณ ๊ทธ๋ฐ ๋ง๋ ์๋๋ ๋ด์ฉ์ ์์ฑํ์ง ์์์ ์๋ ์์ต๋๋ค. ๋ฐ๋ฉด์ ๊ทธ๋ ํด๋์ค ๋์์ด๋๊ฐ ๊ทธ์๊ฒ ์ ๊ณตํ ๊ธฐํ๋ฅผ ํ์ฉํ๊ณ ์์์ต๋๋ค. ์ด๋ฆ๊ณผ ์ผ์๋ฅผ ์ง์ ํ ์ ์๋์? ๊ทธ๋ ๊ทธ๊ฒ์ ์๋ช
ํ์ต๋๋ค. ์ด๋ฐ ์ํฉ์์๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? Java 1.5 ์ธ์ด ๋ฒ์ ์ด ์ถ์๋๊ธฐ ์ ์ ํ๋ก๊ทธ๋๋จธ๋ ์์งํ ๋งํด์ ์ด ๋ฒ์ ์์ ๋ฒ์ด๋์ผ ํ์ต๋๋ค. ๋น์ ๊ทธ๋ค์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ ๋ง๋ค์์ต๋๋ค.
public class Month {
private String name;
private int daysCount;
private Month(String name, int daysCount) {
this.name = name;
this.daysCount = daysCount;
}
public static Month JANUARY = new Month("ะฏะฝะฒะฐัั", 31);
public static Month FEBRUARY = new Month("ะคะตะฒัะฐะปั", 28);
public static Month MARCH = new Month("ะะฐัั", 31);
@Override
public String toString() {
return "Month{" +
"name='" + name + '\'' +
", daysCount=" + daysCount +
'}';
}
}
์ฌ๊ธฐ์๋ ์์ ๋ฅผ ๋ ์งง๊ฒ ์ ์งํ๊ธฐ ์ํด ๊ฐ์ ์๋ฅผ 12๊ฐ์์ด ์๋ 3๊ฐ์๋ก ๋จ์ํํ์ต๋๋ค. ์ด๋ฌํ ์ค๊ณ๋ก ์ธํด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ์์ฑ๋ ๊ฐ์ฒด์ ๋ํ ์ต์
์ ๊ฐ์ธ ์์ฑ์์ ์ํด ์ ํ๋์์ต๋๋ค.
private Month(String name, int daysCount) {
this.name = name;
this.daysCount = daysCount;
}
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋จธ๋ ๋จ์ํ Month
. ๊ทธ๋ค์ ํด๋์ค ๊ฐ๋ฐ์๊ฐ ์ ๊ณตํ ์ต์ข
์ ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์์ต๋๋ค:
public class Main {
public static void main(String[] args) {
Month january = Month.JANUARY;
System.out.println(january);
}
}
๊ทธ๋ฌ๋ Java ๊ฐ๋ฐ์๋ ๊ธฐ์กด ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ฌผ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ์ธ์ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฃจ์
์ ์๊ฐํด ๋ผ ์ ์๋ค๋ ๊ฒ์ ํ๋ฅญํ์ง๋ง ๊ทธ๋ ๊ฒ ๊ฐ๋จํด ๋ณด์ด์ง๋ ์์ต๋๋ค! ์ด๋ณด์๋ ์ ๊ทผํ ์ ์๋ ํ์คํ ์๋ฃจ์
์ด ํ์ํ์ต๋๋ค. ์ด๊ฒ์ด Java์์ .๊ฐ ๋ํ๋๋ ๋ฐฉ์์
๋๋ค Enum
. ๊ธฐ๋ณธ์ ์ผ๋ก Enum
์ ํ๋ ๊ฐ ๊ฐ์ฒด ์งํฉ์ ์ ๊ณตํ๋ Java ํด๋์ค์
๋๋ค. ๊ทธ ๋ชจ์ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public enum Month {
JANUARY,
FEBRUARY,
MARCH
}
์ ์์์๋ Enum
์ด๊ฒ์ด Java ํด๋์ค๋ผ๊ณ ํ์ํ์ง๋ง ์ด๊ฒ์ด ์ค์ ๋ก ์ฌ์ค์
๋๊น? ์, ํ์ธํ ์๋ ์์ต๋๋ค. enum Month
์๋ฅผ ๋ค์ด ๋ค๋ฅธ ํด๋์ค์์ ์์ํด ๋ณด์ธ์ .
public abstract class AbstractMonth {
}
//ะพัะธะฑะบะฐ! No extends clause allowed to enum
public enum Month extends AbstractMonth {
JANUARY,
FEBRUARY,
MARCH
}
์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํฉ๋๊น? ํ๋ก๊ทธ๋จ์ ์ธ ๋:
public enum Month
์ปดํ์ผ๋ฌ๋ ์ด ๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ก ๋ณํํฉ๋๋ค.
public Class Month extends Enum
์ด๋ฏธ ์๊ณ ์๋ฏ์ด Java์์๋ ๋ค์ค ์์์ด ํ์ฉ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ AbstractMonth
์ฐ๋ฆฌ๋ ์์๋ฐ์ ์ ์์ต๋๋ค. ์ด ์๋ก์ด ๋์์ธ์ ์ด๋ป๊ฒ Enum
์ฌ์ฉ๋ ์ ์๋์? ๊ทธ๋ฆฌ๊ณ ํ๋๊ฐ ์๋ ๊ธฐ์กด ๋์์ธ๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์ static final
? ์๋ฅผ ๋ค์ด, ์ด์ ๋์์ธ์์๋ -expressions์ ์์ฒด ๊ฐ ์งํฉ์ ์ฌ์ฉํ ์ ์์์ต๋๋ค switch
. ์ด๋ฒ ๋ฌ์ ์ด๋ค ๊ณตํด์ผ์ ๊ธฐ๋
ํ๋์ง ์๊ธฐ์์ผ์ฃผ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
public class HolidayReminder {
public void printHolidays(Month month) {
switch (month) {
//error!
case JANUARY:
}
}
}
์ฌ๊ธฐ์ ๋ณผ ์ ์๋ฏ์ด ์ปดํ์ผ๋ฌ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ Java 1.5๊ฐ ๋ฑ์ฅํ ์ดํ์๋ enum
๋ชจ๋ ๊ฒ์ด ํจ์ฌ ๋จ์ํด์ก์ต๋๋ค.
public enum Month {
JANUARY,
FEBRUARY,
MARCH
}
public class HolidayReminder {
public void printHolidays(Month month) {
switch (month) {
case JANUARY:
System.out.println("7 ัะฝะฒะฐัั ะฑัะดะตั ะ ะพะถะดะตััะฒะพ!");
break;
case FEBRUARY:
System.out.println("ะ ัะตะฒัะฐะปะต ะฟัะฐะทะดะฝัะตััั ะะตะฝั ะะฐัะธัะฝะธะบะฐ ะัะตัะตััะฒะฐ - 23 ัะตะฒัะฐะปั!");
break;
case MARCH:
System.out.println("ะ ะผะฐััะต ะพัะผะตัะฐะตััั ะัะตะผะธัะฝัะน ะะตะฝัะบะธะน ะะตะฝั - 8 ะผะฐััะฐ!");
break;
}
}
}
public class Main {
public static void main(String[] args) {
HolidayReminder reminder = new HolidayReminder();
reminder.printHolidays(Month.JANUARY);
}
}
์ฝ์ ์ถ๋ ฅ:
7 ัะฝะฒะฐัั ะฑัะดะตั ะ ะพะถะดะตััะฒะพ!
์ฐธ๊ณ : ๊ฐ์ฒด์ ๋ํ ์ก์ธ์ค๋ Enum
Java 1.5 ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ ์ผ๋ก ์ ์ง๋ฉ๋๋ค. ์์ ์ก์ธ์คํ๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค Month
. Enum
์ด๊ฑฐํ์ผ๋ก ์์
ํ ๋ ์ด๊ฒ์ด ์์ ํ ํด๋์ค๋ผ๋ ์ ์ ์์ง ์๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค . ์ฆ, ํ์ํ ๊ฒฝ์ฐ ์์ฑ์์ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด์ ์ฝ๋ ๋ถ๋ถ์์๋ ๋จ์ํ JANUARY, FEBRUARY, MARCH ๊ฐ์ ์ง์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ enum Month
๋ค์๊ณผ ๊ฐ์ด ํ์ฅํ ์ ์์ต๋๋ค.
public enum Month {
JANUARY("ะฏะฝะฒะฐัั", 31),
FEBRUARY("ะคะตะฒัะฐะปั", 28),
MARCH("ะะฐัั", 31),
APRIL("ะะฟัะตะปั", 30),
MAY("ะะฐะน", 31),
JUNE("ะัะฝั", 30),
JULY("ะัะปั", 31),
AUGUST("ะะฒะณััั", 31),
SEPTEMBER("ะกะตะฝััะฑัั", 30),
OCTOBER("ะะบััะฑัั", 31),
NOVEMBER("ะะพัะฑัั", 30),
DECEMBER("ะะตะบะฐะฑัั", 31);
private String name;
private int daysCount;
Month(String name, int daysCount) {
this.name = name;
this.daysCount = daysCount;
}
public static Month[] getWinterMonths() {
return new Month[]{DECEMBER, JANUARY, FEBRUARY};
}
public static Month[] getSummerMonths() {
return new Month[]{JUNE, JULY, AUGUST};
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDaysCount() {
return daysCount;
}
public void setDaysCount(int daysCount) {
this.daysCount = daysCount;
}
@Override
public String toString() {
return "Month{" +
"name='" + name + '\'' +
", daysCount=" + daysCount +
'}';
}
}
enum
์ฌ๊ธฐ์๋ ์ ์ด๋ฆ๊ณผ ์ผ์, ์ด๋ฌํ ํ๋๋ฅผ ์ฌ์ฉํ๋ ์์ฑ์, getters-setters, ๋ฉ์๋ ๋ฐ toString()
2๊ฐ์ ์ ์ ๋ฉ์๋ ๋ฑ 2๊ฐ์ ํ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค . ๋ณด์๋ค์ํผ ์ฌ๊ธฐ์๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์์ ๋งํ๋ฏ enum
์ด ์ด๊ฒ์ ๋ณธ๊ฒฉ์ ์ธ ์์
์
๋๋ค.
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
System.out.println(Arrays.toString(Month.getSummerMonths()));
}
}
์ฝ์ ์ถ๋ ฅ:
[Month{name='ะัะฝั', daysCount=30}, Month{name='ะัะปั', daysCount=31}, Month{name='ะะฒะณััั', daysCount=31}]
๋ง์ง๋ง์ผ๋ก Joshua Bloch์ "Effective Java" ๋ผ๋ Java์ ๊ดํ ๋งค์ฐ ์ ์ฉํ ์ฑ
์ ์ถ์ฒํ๊ณ ์ถ์ต๋๋ค . ์ ์๋ Java ์ฐฝ์์ ์ค ํ ๋ช
์ด๋ฏ๋ก ์ธ์ด โโ๋๊ตฌ์ ์ฌ๋ฐ๋ฅด๊ณ ์ ๋ฅํ ์ฌ์ฉ์ ๋ํ ๊ทธ์ ์กฐ์ธ์ ํ์คํ ์ ๋ขฐํ ์ ์์ต๋๋ค. :) ์ฐ๋ฆฌ ๊ฐ์์ ๊ด๋ จํ์ฌ ์ฑ
์์ enum
. ์์ฐ์ ์ธ ๋
์๋ฅผ ์ฆ๊ฒจ๋ณด์ธ์! :)
GO TO FULL VERSION