본문 바로가기

Programming/자바

생활코딩 자바 - 상수2 - enum

복습

 

상수 : 변하지 않는 값

 

int x = 1;

 

1 = 2;

 

  • 주석 필요한 코드
public class ConstantDemo {
public static void main(String[] args) {
/*
* 1. 사과
* 2. 복숭아
* 3. 바나나
*/
int type = 1;    //이 코드는 왜 필요한 건지 이해가 잘 안된다... 점점 놓치는게 많아지는듯 ㅠ 얼른 2회독 하고 싶다
switch(type){
case 1:
System.out.println(57);
break;
case 2:
System.out.println(34);
break;
case 3:
System.out.println(93);
break;
}

 

  • 주석 불필요 (final 사용)
public class ConstantDemo {
private final static int APPLE = 1;   => 절대 변하지 않음
private final static int PEACH = 2;
private final static int BANANA = 3;
public static void main(String[] args) {
int type = APPLE;
switch(type){
case APPLE:
System.out.println(57+" kcal");
break;
case PEACH:
System.out.println(34+" kcal");
break;
case BANANA:
System.out.println(93+" kcal");
break;
}}}

 

 

enum의 배경

 

  •  

public class Enum {
    // fruit
    private final static int APPLE = 1;
    private final static int PEACH = 2;
    private final static int BANANA = 3;
     
    // company
    private final static int GOOGLE = 1;
    private final static int APPLE = 2;    //final 지정했는데 값 바꾸려고 시도하여 에러 발생
    private final static int ORACLE = 3;
     
    public static void main(String[] args) {
        int type = APPLE;
        switch(type){
            case APPLE:
                System.out.println(57+" kcal");
                break;
            case PEACH:
                System.out.println(34+" kcal");
                break;
            case BANANA:
                System.out.println(93+" kcal");
                break;
        }}}

 

  •  
public class ConstantDemo {

 

private final static int FRUIT_APPLE = 1;
private final static int FRUIT_PEACH = 2;
private final static int FRUIT_BANANA = 3;
 
private final static int COMPANY_GOOGLE = 1;
private final static int COMPANY_APPLE = 2;
private final static int COMPANY_ORACLE = 3;
 
public static void main(String[] args) {
int type = FRUIT_APPLE;
switch(type){
case FRUIT_APPLE:
System.out.println(57+" kcal");
break;
case FRUIT_PEACH:
System.out.println(34+" kcal");
break;
case FRUIT_BANANA:
System.out.println(93+" kcal");
break;
}
}
}

 

  • 인터페이스 사용해 단순화

interface FRUIT {
int APPLE =1, PEACH=2, BANANA=3;  //인터페이스에 필드 작성 = public final static이 암시됨
}

interface COMPANY {
int GOOGLE =1, APPLE=2, ORACLE=3;
}

public class Enum {
     
    public static void main(String[] args) {
        int type = FRUIT.APPLE;
        switch(type){
            case FRUIT.APPLE:
                System.out.println(57+" kcal");
                break;
            case FRUIT.PEACH:
                System.out.println(34+" kcal");
                break;
            case FRUIT.BANANA:
                System.out.println(93+" kcal");
                break;
        }}}

 

  •  

interface FRUIT {
int APPLE =1, PEACH=2, BANANA=3;  
}

interface COMPANY {
int GOOGLE =1, APPLE=2, ORACLE=3;
}

public class Enum {
     
    public static void main(String[] args) {
     if (FRUIT.APPLE == COMPANY.APPLE) {
     System.out.println("과일 애플과 기업 애플은 같습니다");   //다른 대상이지만 값이 같으면 일치하는 것으로 결과나올 수도 있음   => 비교조차 못하게 만들어야 함
     } 
    

 

  • 다른 데이터타입으로 비교 불가능하게 만듦

class Fruit {
public static final Fruit APPLE = new Fruit();
public static final Fruit  PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
}

class Company {
public static final Company GOOGLE = new Company();
public static final Company APPLE = new Company();
public static final Company ORACLE = new Company();
}

public class Enum {
     
    public static void main(String[] args) {
     if (Fruit.APPLE == Company.APPLE) {     => 데이터타입이 다르므로 컴파일러가 컴파일 거부함 (목적 달성)
     System.out.println("과일 애플과 기업 애플은 같습니다"); 
     } 
   
     int type = Fruit.APPLE;
        switch(type){
            case Fruit.APPLE:
                System.out.println(57+" kcal");
                break;
            case Fruit.PEACH:
                System.out.println(34+" kcal");
                break;
            case Fruit.BANANA:
                System.out.println(93+" kcal");
                break;
        }}}

 

  •  

class Fruit {
public static final Fruit APPLE = new Fruit();
public static final Fruit  PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
}

class Company {
public static final Company GOOGLE = new Company();
public static final Company APPLE = new Company();
public static final Company ORACLE = new Company();
}

public class Enum {
     
    public static void main(String[] args) {
      
     Fruit type = Fruit.APPLE;
        switch(type){    =>switch문의 조건값 데이터타입은 제한적이기 때문에 에러 발생
            case Fruit.APPLE:
                System.out.println(57+" kcal");
                break;
            case Fruit.PEACH:
                System.out.println(34+" kcal");
                break;
            case Fruit.BANANA:
                System.out.println(93+" kcal");
                break;
        }}}

 

*switch문 조건값 : byte, short, char, int, enum, String, Character, Byte, Short, Integer

 

 

enum의 문법

열거형(enumerated type) : 서로 연관된 상수들의 집합

 

  •  

* 오른쪽 마우스 - source - add block comment 로 주석 처리

 


/*class Fruit {
public static final Fruit APPLE = new Fruit();
public static final Fruit  PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
}*/

enum Fruit {
APPLE, PEACH, BANANA
}

  •  

enum Fruit {
APPLE, PEACH, BANANA
}

enum Company {
GOOGLE, APPLE, ORACLE
}

public class Enum {
     
    public static void main(String[] args) {
      
     Fruit type = Fruit.APPLE;
        switch(type){    => 오류 사라짐
            case APPLE:
                System.out.println(57+" kcal");
                break;
            case PEACH:
                System.out.println(34+" kcal");
                break;
            case BANANA:
                System.out.println(93+" kcal");
                break;
        }}}

 

//

57 kcal

 

  • enum 특징

코드 단순화

인스턴스 생성, 상속 방지

키워드 enum 통해 구현 의도가 열거임을 밝힘

 

 

enum과 생성자

enum은 사실상 클래스이기 때문에 생성자 가질수 있음

 

  •  

enum Fruit1 {
APPLE, PEACH, BANANA;
Fruit1() {
System.out.println("Call Constructor");     //생성자 정의 & 호출 => 상수 세개여서 Call Constructor 세번 호출
}
}

 

~

 

//

Call Constructor
Call Constructor
Call Constructor
57 kcal

 

  •  

enum Fruit1 {
APPLE, PEACH, BANANA;
Fruit1() {
System.out.println("Call Constructor "+this);
}}

~

 

//

Call Constructor APPLE
Call Constructor PEACH
Call Constructor BANANA
57 kcal

 

  • 필드값 넣기

enum Fruit1 {
APPLE("red"), PEACH("pink"), BANANA("yellow");
public String color;

Fruit1(String color) {
System.out.println("Call Constructor "+this);
this.color color
}}

 

enum Company2 {
GOOGLE, APPLE, ORACLE
}

public class Enum2 {
     
    public static void main(String[] args) {
      
     Fruit1 type = Fruit1.APPLE;
        switch(type){
            case APPLE:
                System.out.println(57+" kcal, color "+Fruit1.APPLE.color);
                break;
            case PEACH:
                System.out.println(34+" kcal, color "+Fruit1.PEACH.color);
                break;
            case BANANA:
                System.out.println(93+" kcal, color "+Fruit1.BANANA.color);
                break;
        }}}

 

//

Call Constructor APPLE
Call Constructor PEACH
Call Constructor BANANA
57 kcal, color red

 

  • 메소드 추가

enum Fruit1 {
APPLE("red"), PEACH("pink"), BANANA("yellow");
private String color;
public String getColor() {
return this.color;
}


Fruit1(String color) {
System.out.println("Call Constructor "+this);
this.color = color;
}}

enum Company2 {
GOOGLE, APPLE, ORACLE
}

public class Enum2 {
     
    public static void main(String[] args) {
      
     Fruit1 type = Fruit1.APPLE;
        switch(type){
            case APPLE:
                System.out.println(57+" kcal, color "+Fruit1.APPLE.getColor());
                break;
            case PEACH:
                System.out.println(34+" kcal, color "+Fruit1.PEACH.getColor());
                break;
            case BANANA:
                System.out.println(93+" kcal, color "+Fruit1.BANANA.getColor());
                break;
        }}}

 

  • values 메소드

열거형 속 데이터에 대해 몰라도 배열처럼 데이터 꺼내 처리 가능한 메소드

 

enum Fruit2 {
APPLE("red"), PEACH("pink"), BANANA("yellow");
private String color;
public String getColor() {
return this.color;
}
Fruit2(String color) {
this.color = color;
}
}

enum Company3 {
GOOGLE, APPLE, ORACLE
}

public class Enum3 {
     
    public static void main(String[] args) {
      
     for (Fruit2 f : Fruit2.values()) {
     System.out.println(f);
     }}}

 

//

APPLE
PEACH
BANANA

 

  • 열거형 특징

연관된 값(상수) 저장

값 변경되지 않도록 보장

열거형 자체가 클래스 => 내부에 생성자, 필드, 메소드 가질 수 있음

 

 

 

 

 

 

 

 

'Programming > 자바' 카테고리의 다른 글

생활코딩 자바 - 제네릭  (0) 2022.04.20
생활코딩 자바 - 참조 ?  (0) 2022.04.19
생활코딩 자바 - Object 클래스  (0) 2022.04.18
생활코딩 자바 - 예외  (0) 2022.04.12
생활코딩 자바 - 다형성  (0) 2022.04.08