μΈν°νμ΄μ€λ₯Ό μ΄μ©ν μμμ¬μ©μ΄ Enumμ μ μ μ΄λ€.
μμ μ μΈμ ν λλ λ³μλͺ μ λλ¬Έμλ‘ μ¬μ©νλ€.
μΈν°νμ΄μ€ ν΄λμ€μ μΈμ€ν΄μ€λ ꡬνν μ μλ€.
μΈν°νμ΄μ€ ν΄λμ€μ ν΄λμ€λ³μλ μ¬μ© κ°λ₯νλ€. μΈν°νμ΄μ€μ μ μΈλ λ³μλ public, staticμ΄ μλ΅λμ΄ μλ€.
μ¬λλ€μ μ«μλ³΄λ€ λ¬Έμλ₯Ό μ’μνλ€.
μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ«μλ₯Ό λ¬Έμνν μ μλ€.
β μ½λμ κ°λ
μ± ν₯μ
package ex0418;
interface Scale {
// νΉλ³ν λ©μλ μμ΄ μμλ€μ μ§ν©μ²λΌ λ§λ€μλ€.
int DO = 0; int RE = 1; int MI = 2; int FA =3;
int SO = 4; int RA = 5; int TI = 6;
}
public class InterfaceBaseConstTest {
public static void main(String[] args) {
int sc = Scale.DO;
switch(sc) {
case Scale.DO:
System.out.println("λ");
break;
case Scale.RE:
System.out.println("λ ");
break;
case Scale.MI:
System.out.println("λ―Έ");
break;
case Scale.FA:
System.out.println("ν");
break;
case Scale.SO:
System.out.println("μ");
break;
case Scale.RA:
System.out.println("λΌ");
break;
case Scale.TI:
System.out.println("μ");
break;
}
}
}
package ex0418;
interface Animal{
int DOG = 1;
int CAT = 2;
}
interface Person{
int MAN = 1;
int WOMAN = 2;
}
public class NonsafeConst {
public static void main(String[] args) {
who(Person.MAN);
who(Person.WOMAN);
}
public static void who(int man) {
switch(man) {
case Person.MAN: System.out.println("λ¨μ± μλμ
λλ€."); break;
case Person.WOMAN: System.out.println("μ¬μ± μλμ
λλ€."); break;
}
}
}
who(Animal.DOG); λ₯Ό ν΄λ λ¨μ± μλμ λλ€. λΌκ³ μΆλ ₯ β μνμ§ μλ λ°μ΄ν°&κ²°κ³Όκ°
package ex0418;
enum Scale1{
DO, RE, MI, FA, SO, RA, TI
}
public class SimpleEnumTest {
public static void main(String[] args) {
Scale1 sc = Scale1.DO;
System.out.println(sc);
switch(sc) {
case DO: System.out.println("λ"); break;
case RE: System.out.println("λ "); break;
case MI: System.out.println("λ―Έ"); break;
case FA: System.out.println("ν"); break;
case SO: System.out.println("μ"); break;
case RA: System.out.println("λΌ"); break;
case TI: System.out.println("μ"); break;
}
}
}
interfaceλ‘ μμ±ν κ²(μ¬μ©μμ1)κ³Όμ μ°¨μ΄μ
- Scale1{} λ΄μ μλ£ν μμ΄ λ³μλͺ λ§ μ μΈ
- scμ νμ μ΄ intκ° μλ enumλͺ
- case λ³μλͺ : ν΄λμ€λ₯Ό ν΅ν΄ μ κ·Όνμ§ μλλ€.
package ex0418;
enum Animal1{
DOG, CAT
}
enum Person1{
MAN, WOMAN
}
public class SafeEnumTest {
public static void main(String[] args) {
who(Person1.MAN);
}
public static void who(Person1 man) {
switch(man) {
case MAN: System.out.println("λ¨μ±μ
λλ€.");
case WOMAN: System.out.println("μ¬μ±μ
λλ€.");
}
}
}
interfaceλ‘ μμ±ν κ²(μ¬μ©μμ2)κ³Όμ μ°¨μ΄μ
Person1μ μλ£νμ²λΌ μ¬μ© κ°λ₯
κ·Έλμ Animalμ μ νλμ΄ who ν¨μμ λ€μ΄κ° μ μλ€.
ν΄λμ€μμ λΉκ΅
package ex0418;
enum Human3{
MAN, WOMAN;
private Human3() {
System.out.println("Human constructor called...");
}
}
public class EnumConstTest {
public static void main(String[] args) {
System.out.println(Human3.MAN);
System.out.println(Human3.WOMAN);
}
}
κ²°κ³Ό: κΈ°λ³Έμμ±μλ‘ λμ
Human constructor called...
Human constructor called...
MAN
WOMAN
μ μ½μ κ±Έ μλ μλ€.
package ex0418;
enum Person3{
MAN(29), WOMAN(32);
int age;
private Person3(int age) {
this.age = age;
}
@Override
public String toString() {
return "I am " + age + "years old";
}
}
public class EnumParamConstructorTest {
public static void main(String[] args) {
System.out.println(Person3.MAN);
System.out.println(Person3.WOMAN);
}
}
package ex0418;
enum Day{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class EnumTest1 {
public static void main(String[] args) {
Day today = Day.FRIDAY;
System.out.println(today);
for(Day d:Day.values()) {
System.out.println(d);
}
switch(today) {
case MONDAY:
System.out.println("λ νμ£Όκ° μμλμκ΅°");
break;
case TUESDAY:
System.out.println("μΈμ μ€λ μ£Όλ§..");
break;
case WEDNESDAY:
System.out.println("μ€λλ§ κ°λ©΄ 2μΌ λ¨μλ€.");
break;
case THURSDAY:
System.out.println("μ΄μ λ΄μΌλ§..");
break;
case FRIDAY:
System.out.println("μ΄μ μ€λλ§..");
break;
case SATURDAY:
break;
case SUNDAY:
break;
default:
}
}
}
μ΄λ κ²λ μ¬μ© κ°λ₯
package ex0418;
enum Day{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class EnumTest1 {
public static void main(String[] args) {
Day today = Day.FRIDAY;
System.out.println(today);
for(Day d:Day.values()) {
System.out.println(d);
}
switch(today) {
case MONDAY -> System.out.println("λ νμ£Όκ° μμλμκ΅°");
case TUESDAY -> System.out.println("μΈμ μ€λ μ£Όλ§..");
case WEDNESDAY -> System.out.println("μ€λλ§ κ°λ©΄ 2μΌ λ¨μλ€.");
case THURSDAY -> System.out.println("μ΄μ λ΄μΌλ§..");
case FRIDAY -> System.out.println("μ΄μ μ€λλ§..");
case SATURDAY -> System.out.println("νμ€μΌ");
case SUNDAY -> System.out.println("μ£Όλ§ λ");
default -> System.out.println("λμΌ");
}
}
}
package ex0418;
enum Day{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class EnumTest1 {
public static void main(String[] args) {
Day today = Day.FRIDAY;
System.out.println(today);
switch(today) {
case SATURDAY -> System.out.println("νμ€μΌ");
case SUNDAY -> System.out.println("μΌμμΌ");
default -> System.out.println("νμΌ");
}
}
}
μ±λ³μ enumμΌλ‘ male, female
Member.java
package ex0418;
import lombok.Data;
enum Gender{
MALE, FEMALE;
}
@Data
public class Member {
String name;
Gender gender;
Member(){}
Member(String name, Gender gender){
this.name=name;
this.gender=gender;
}
}
MemberTest.java
package ex0418;
public class MemberTest {
public static void main(String[] args) {
Member m1 = new Member();
m1.setName("νκΈΈλ");
m1.setGender(Gender.MALE);
System.out.println(m1);
Member m2 = new Member("μ¬μ²μ΄", Gender.FEMALE);
System.out.println(m2);
}
}
κ²°κ³Ό
Member(name=νκΈΈλ, gender=MALE)
Member(name=μ¬μ²μ΄, gender=FEMALE)
μ°Έκ³
System.out.println(m1.getGender()); // String νμ
μΈκ°νμ§λ§
Gender g = m1.getGender(); // λ°ννμ
μ Gender
System.out.println(g.toString()); // toStringμΌλ‘λ κ°λ₯, μλμ μΌλ‘ νμ
λ³ν
Enum Day2.java
package ex0418;
public enum Day2 {
// κ° μμμ νκΈ μ΄λ¦κ³Ό μμ΄ μ΄λ¦μ λΆμ¬
MONDAY("μμμΌ","Monday"),
TUESDAY("νμμΌ","Thesday"),
WEDNESDAY("μμμΌ","Wednesday"),
THURSDAY("λͺ©μμΌ","Thursday"),
FRIDAY("κΈμμΌ","Friday"),
SATURDAY("ν μμΌ","Saturday"),
SUNDAY("μΌμμΌ","Sunday");
private final String korName;
private final String engName;
Day2(String korName, String engName){
this.korName=korName;
this.engName=engName;
}
public String getKorName() {
return korName;
}
public String getEngName() {
return engName;
}
}
Main.java
package ex0418;
public class Day2Test {
public static void main(String[] args) {
for(Day2 d:Day2.values()) // values()λ Day2νμ
μ λ°°μ΄μ΄λ€.
System.out.println(d + ":" + d.getKorName() + "," + d.getEngName());
Day2 today = Day2.FRIDAY;
System.out.println("μ€λμ"+today.getKorName()+"μ
λλ€.");
System.out.println("Today is"+today.getEngName()+"μ
λλ€.");
}
}
ν΄λμ€λͺ : User
λ©€λ²λ³μ: νμλ²νΈ, μ΄λ¦, μ±λ³, νμλ±κΈ
μ±λ³: λ¨μ(MALE), μ¬μ(FEMALE)
νμλ±κΈ: 골λ(GOLD), μ€λ²(SILVER), λΈλ‘ μ¦(BRONZE)
νμλ±κΈμ΄ 골λμΈ νμμ ν μΈμ¨μ΄ 10% μ μ©λ©λλ€.
νμλ±κΈμ΄ μ€λ²μΈ νμμ ν μΈμ¨μ΄ 5% μ μ©λ©λλ€.
νμλ±κΈμ΄ λΈλ‘ μ¦μΈ νμμ ν μΈμ¨μ΄ 2% μ μ©λ©λλ€.
νμλ±κΈμ enumμΌλ‘ λ§λμμ€.
enumμ λ©€λ²μμλ korName(String), discountRate(double)λ‘ νλ€.
μ€νν΄λμ€λ₯Ό λ§λ€μ΄ 골λ, μ€λ², λΈλ‘ μ¦ νμμ ν μ€νΈ νμμ€.
μΆκ°
enumμ calculateDiscount()λ©μλλ₯Ό λ§λμμ€
λ±κΈλ³ ν μΈμ¨μ μ μ©νμ¬ ν μΈ κΈμ‘μ λ°ννλ λ©μλ
int calculateDiscount(int price)
User ν΄λμ€μ pay()λ©μλλ₯Ό λ§λμμ€
void pay(int price)
νμλ±κΈκ³Ό μ€μ μ§λΆν κΈμ‘μ μ½μμ μΆλ ₯νλ κΈ°λ₯
μ) 골λνμ Jamesλ 180000μμ μ§λΆνμ΅λλ€. price = 200000 - discount10%(20000) = 180000
UserTest.java(Main)
package ex0418;
public class UserTest {
public static void main(String[] args) {
User u1 = new User();
u1.setUNo(1);
u1.setName("James");
u1.setGender(Gender.MALE);
u1.setLevel(Level.GOLD);
System.out.println(u1.getUNo()+"λ² νμ μ΄λ¦: "+u1.getName()
+", μ±λ³: "+u1.getGender().getGender()
+", λ±κΈ: "+u1.getLevel()
+", ν μΈμ¨: "+u1.getLevel().getDiscountRate());
u1.pay(200000);
}
}
User.java
package ex0418;
import lombok.Data;
@Data
public class User {
private int uNo;
private String name;
private Gender gender;
private Level level;
/*
public void pay(int price) {
//int discount = level.calculateDiscount(price);
System.out.println(level.getKorName()+"νμ "+name+"λ "
+(price-level.calculateDiscount(price))+"λ₯Ό μ§λΆνμ΅λλ€."
+" | ν μΈλ°μ κΈμ‘: "+level.calculateDiscount(price));
}
*/
public void pay(int price) {
System.out.printf(level.getKorName()+"νμ "+name+"λ "
+"%,dμμ μ§λΆνμ΅λλ€."
+" | ν μΈ λ°μ κΈμ‘: %,dμ",price-level.calculateDiscount(price),level.calculateDiscount(price));
}
@Override
public String toString() {
return getUNo()+"λ² νμ μ΄λ¦: "+getName()
+", μ±λ³: "+getGender().getGender()
+", λ±κΈ: "+getLevel()
+", ν μΈμ¨: "+getLevel().getDiscountRate();
}
}
Gender.java
package ex0418;
public enum Gender {
MALE("λ¨μ"), FEMALE("μ¬μ");
private final String gender;
Gender(String gender){
this.gender=gender;
}
public String getGender() {
return gender;
}
}
Level.java
package ex0418;
public enum Level {
GOLD("골λ",10), SILVER("μ€λ²",5), BRONZE("λΈλ‘ μ¦",2);
private final String korName;
private final double discountRate;
Level(String korName, double discountRate){
this.korName=korName;
this.discountRate=discountRate;
}
public String getKorName() {
return korName;
}
public double getDiscountRate() {
return discountRate;
}
public int calculateDiscount(int price) {
return price * (int)discountRate/100;
}
}
κ²°κ³Ό
1λ² νμ μ΄λ¦: James, μ±λ³: λ¨μ, λ±κΈ: GOLD, ν μΈμ¨: 10.0
골λνμ Jamesλ 180000λ₯Ό μ§λΆνμ΅λλ€.| ν μΈλ°μ κΈμ‘: 20000
κΈμ‘μ μ½κΈ°κ° μ΄λ €μμ printf("%,d",price)νμμΌλ‘ λ³κ²½νλ€.
μ¬μ©μ μ 보λ₯Ό μΆλ ₯νλ toStringμ Overrideνλ€.
System.out.printf(level.getKorName()+"νμ "+name+"λ "
+"%,dμμ μ§λΆνμ΅λλ€."
+"| ν μΈ λ°μ κΈμ‘: %,dμ",price-level.calculateDiscount(price),level.calculateDiscount(price));
κ²°κ³Ό
골λνμ Jamesλ 180,000μμ μ§λΆνμ΅λλ€. | ν μΈ λ°μ κΈμ‘: 20,000μ
νλ‘μΈμ€
μ€ν μ€μΈ νλ‘κ·Έλ¨, νλμ νλ‘μΈμ€λ νλ μ΄μμ μ°λ λλ₯Ό κ°λλ€.
Multi Thread
λ³λ ¬μ²λΌ λκ»΄μ§μ§λ§ ν κ°μ CPUμ μ¬μ©μ μ§§μ μκ°μ λΉ λ₯΄κ² νμ ν¨μ ν΅ν΄ λμμ±μ ꡬνν¨
- Thread ν΄λμ€λ₯Ό μμλ°λλ€. λ°λμ ꡬνν΄μΌνλ λ©μλ: run()
1λ²μ μ μμ΄λ€. ν΄λμ€λ μμμ νλλ§ λ°μ μ μλλ°, λ€λ₯Έ ν΄λμ€λ₯Ό μμλ°μ μ μκΈ° λλ¬Έ.- Interfaceλ‘ κ΅¬ννκΈ°(Runnable)
λ κ° μ΄μμ Threadκ° κ³΅μ© μμμ μ‘°μνλ €κ³ ν λ, μ°μ° μμλ₯Ό μ μ΄ν νμκ° μλ€.
MyThread.java
package ex0418;
public class MyThread extends Thread{
@Override
public void run() {
for(int i=0; i<10; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i); // νμ¬ μ€νμ€μΈ Threadμ μ΄λ¦μ μ»κΈ°
try {
Thread.sleep(1000); // 1μ΄ κ° Threadλ₯Ό λ©μΆλ€. 1000=1μ΄
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
MyThreadTest.java(Main)
package ex0418;
public class MyThreadTest {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.setName("Thread-A");
t1.start(); // run()μ μ§μ νΈμΆνλ©΄ μλλ€.
System.out.println("----End of Main----");
}
}
κ²°κ³Ό: 1μ΄λ§λ€ κ³μ μμΈλ€.(10κ°)
----End of Main----
Thread-A: 0
Thread-A: 1
Thread-A: 2
Thread-A: 3
Thread-A: 4
Thread-A: 5
Thread-A: 6
Thread-A: 7
Thread-A: 8
Thread-A: 9
μ€ν μκ°μ΄ 10.444μ΄λ‘ νμΈλμλ€.
Threadλ₯Ό μ€ννκ³ , λ€μ printλ₯Ό μ€ννμΌλ printκ° λ¨Όμ λλκ³ Threadκ° λλ¬λ€.
Threadλ λ
μμ μ΄λΌ Mainμ΄ λλ¬λ€κ³ λλμ§ μλλ€.

t2λ₯Ό νλ λ λ§λ€μ΄μ λΉκ΅
package ex0418;
public class MyThreadTest {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.setName("Thread-A");
t2.setName("Thread-B");
t1.start(); // run()μ μ§μ νΈμΆνλ©΄ μλλ€.
t2.start();
System.out.println("----End of Main----");
}
}
κ²°κ³Ό: Aμ Bκ° κ°μ μμ μ λμνκ³ μμ.
----End of Main----
Thread-A: 0
Thread-B: 0
Thread-A: 1
Thread-B: 1
Thread-B: 2
Thread-A: 2
Thread-A: 3
Thread-B: 3
Thread-B: 4
Thread-A: 4
Thread-A: 5
Thread-B: 5
Thread-A: 6
Thread-B: 6
Thread-A: 7
Thread-B: 7
Thread-B: 8
Thread-A: 8
Thread-A: 9
Thread-B: 9
MyRunnable.java
package ex0418;
public class MyRunnable implements Runnable{
public void run() {
for(int i=0; i<10; i++) {
System.out.println(Thread.currentThread().getName()+": "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
MyRunnableTest.java(Main)
package ex0418;
public class MyRaunnableTest {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread t1 = new Thread(runnable, "Thread-A");
Thread t2 = new Thread(runnable, "Thread-B");
t1.start();
t2.start();
}
}
λ§μ½ start()κ° μλ run()μ μ€ννλ©΄ mainμ΄ λ κ°μ μ°λ λλ₯Ό μ€νμν¨ λͺ¨μ΅μ΄ λλ€.
main: 0
main: 1
main: 2
main: 3
main: 4
main: 5
main: 6
main: 7
main: 8
main: 9
main: 0
main: 1
main: 2
main: 3
main: 4
main: 5
main: 6
main: 7
main: 8
main: 9
package ex0418;
public class ProblemOfThread {
public static int money = 0;
public static void main(String[] args) throws InterruptedException {
Runnable task1 = () -> {
for(int i=0; i<10000; i++) {
money++;
}
}; // μ΄κ²λ§κ³ λ ꡬνν κ²μ΄ μμ΄μ λλ€μμΌλ‘ μμ±
Runnable task2 = () -> {
for(int i=0; i<10000; i++) {
money--;
}
};
Thread t1 = new Thread(task1);
Thread t2 = new Thread(task2);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(money);
}
}
join()νκΈ° μ κ²°κ³Ό: 0
join()ν λ€ κ²°κ³Ό: -6849 or 8792 λ± μ€νν λλ§λ€ λ€λ₯Έ κ°μ΄ λμ΄
β 곡μ μμμ λ κ° μ΄μμ Threadκ° μ κ·Όν κ²½μ° μκΈ°λ λ¬Έμ λ€.
λμμ±μ μ κ±° β μ€ μΈμ°κΈ° β λκΈ°ν : μμλλ‘ μ€νλλ κ²
*Threadλ λΉλκΈ°
package ex0418;
public class SyncMethodTest {
public static int money = 0;
public static void main(String[] args) throws InterruptedException {
Runnable task1 = () -> {
for(int i=0; i<10000; i++)
deposit();
};
Runnable task2 = () -> {
for(int i=0; i<10000; i++)
withdraw();
};
Thread t1 = new Thread(task1);
Thread t2 = new Thread(task2);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(money);
}
// λμμ± λλ¬Έμ μκΈ°λ λ¬Έμ μ΄λ―λ‘ λμμ±μ μμ€λ€.
// deposit()μ΄ moneyλ₯Ό λ§μ§ λλ withdraw()κ° κ±΄λ리면 μλλ€. β μ€μΈμ΄λ€. β λκΈ°ν
// β synchronized
public synchronized static void deposit() {
money++;
}
public synchronized static void withdraw() {
money--;
}
}