Java 상수와 enum

별의개발자커비·2023년 2월 14일
0

Java

목록 보기
37/66
post-thumbnail

enum

: 연관되어있는 상수의 집합

enum의 배경

class Fruit {
	public static final Fruit APPLE = new Fruit();
	public static final Fruit PEACH = new Fruit();
	public static final Fruit BANANA = new Fruit();
	// 같은 데이터타입Fruit이지만 값은 서로 다른 인스턴스를 갖고있다.(new에 의해)
	// interface에서 변수를 작성한다는 것 = public final static이 암시되어 있는 것
}

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


class Main {
    public static void main(String[] args) {
        int type = Fruit.APPLE;
        
// @근데 오류!: switch문에 type자리에 만든 데이터타입Fruit은 안된다
// if로 하는 것보다 switch문이 잘 보이는데... --> enum으로 해결할 수 있다!
        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;
        }
    }
}
  • 오류!: switch문에 type자리에 만든 데이터타입 Fruit 은 안된다
  • if로 하는 것보다 switch문이 잘 보이는데... --> enum으로 해결할 수 있다!

enum의 사용방법

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

// 위에 길던 게 enum으로 한 줄 됨!
// 값이 서로 다른 인스턴스(APPLE...)가 만들어지게 됨(new Fruit();에 의해)
enum Fruit{
    APPLE, PEACH, BANANA;
}
enum Company{
    GOOGLE, APPLE, ORACLE;
}

class Main {
    public static void main(String[] args) {
        Fruit type = Fruit.APPLE;
        switch(type){
            case APPLE: // enum-switch 약속: Fruit.APPLE아니라 Fruit.없이 APPLE만 쓰면 된다.
                System.out.println(57+" kcal");
                break;
            case PEACH:
                System.out.println(34+" kcal");
                break;
            case BANANA:
                System.out.println(93+" kcal");
                break;
        }
    }
}

enum을 사용하는 이유

  • 코드가 단순해진다.
  • 인스턴스 생성과 상속을 방지한다.
  • 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.

열거형의 활용

ver1.

/*
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; 
	// 1. 하나하나 APPLE... 만들 때마다 new Fruit() 인스턴스화 되는 과정이 실행
	// 2. 인스턴스가 생성될 때마다 생성자Fruit()가 호출되는데 
		Fruit(){ // 3. 걔가 바로 얘 "Call Constructor"
		System.out.println("Call Constructor" + this)  // this는 APPLE...
	}
}
 
enum Company{
    GOOGLE, APPLE, ORACLE;
}
 
public class Main {
     
    public static void main(String[] args) {
     
        /*
        if(Fruit.APPLE == Company.APPLE){
            System.out.println("과일 애플과 회사 애플이 같다.");
        }
        */
        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;
        }
    }
}

ver 2.

  • 이 생성자의 매개변수를 통해서 필드(APPLE..)의 인스턴스 변수 값을 부여 할 수 있을까? 있다.
/*
/*
class Fruit{ // @1. 클래스로 상수를 정의하게 되면 APPLE..을 배열처럼 열거할 수는 없음
// APPLE... 이 각각 어떤 상수를 가지고 있는지를 알아야 코드를 작성할 수 있는데
    public static final Fruit APPLE  = new Fruit();
    public static final Fruit PEACH  = new Fruit();
    public static final Fruit BANANA = new Fruit();
}
*/
enum Fruit{// @2. 열거형이 위 클래스 방식과 다른점은 
// 이건 각 APPLE.. 안에 어떤 데이터가 있는지는 몰라도 
// 배열처럼 안의 데이터를 하나씩 꺼내서 처리할 수 있다는 것
    APPLE("red"), PEACH("pink"), BANANA("yellow"); // 1. APPLE("red"): APPLE 생성자 호출-red라는 인자 전달한 것
	private String color;
	public String color; // 4. 여기에 들어감 -> Fruit 의 인스턴스의 인스턴스 변수인 color값이 "red"되는 것
	public String getColor(){
		return this.color ; 
	}
	Fruit(String color){ // 2. String color에 "red"
		System.out.println("Call Constructor" + this)  
			this.color = color ; // 3. "red"는 
	}
}
 
enum Company{
    GOOGLE, APPLE, ORACLE;
}
 
public class Main {
     
    public static void main(String[] args) {
    
			for ( Fruit f : Fruit.values()){ // @3. 그 때 사용하는 메소드가 values = 상수들의 배열을 가져오는 것
			// forin 구문 
			// = (어떤 데이터의 집합에 속해있는 것을 하나하나 꺼내서 f라는 변수에 담아주는 것 : 어떤 데이터의 집합)
			// values가 호출되면서 Fruit가 갖고 있는 데이터들 APPLE...을 
			// 하나씩 Fruit f 에 담는 것, 그리고 아래에서 출력
				System.out.println(f);
			}

        Fruit type = Fruit.APPLE;
        switch(type){
            case APPLE:
                System.out.println(57+" kcal, color " + Fruit.APPLE.color); 
				// 5. enum이 단순히 상수로서의 기능만 하는 것이 아니라 
				// 그 상수가 어떤 값을 갖게 하는 등의 일을 더 적은 코드로할 수 있음 
                break;
            case PEACH:
                System.out.println(34+" kcal color " + Fruit.PEACH.getColor);
				// 6. 물론 enum 멤버로 메소드를 사용할 수도 있음
                break;
            case BANANA:
                System.out.println(93+" kcal color " + Fruit.BANANA.color);
                break;
        }
    }
}

열거형의 특성

  • 열거형은 연관된 값들을 저장한다.
  • 또 그 값들이 변경되지 않도록 보장한다.
  • 열거형 자체가 클래스이기 때문에 열거형 내부에 생성자, 필드, 메소드를 가질 수 있어서 단순히 상수가 아니라 더 많은 역할을 할 수 있다

학원 설명

  • 모두가 보고 쓰는
  • 바뀌지 않는 변수?
package lesson8;

class Gender{
	// 여, 남
	public static final String MALE = "male" ; // 상수는 대문자로 표시, 바꾸지 않는 상수여야하니까 final 
	public static final String FEMALE = "female" ; // 어차피 모두가 다같이 보고 써야하니까 static 

}

// 요즘 방식: 위와 똑같은 기능
enum GenderE{ M, F }


public class Enum1 {

	public static void main(String[] args) {
		System.out.println(Gender.MALE);
		System.out.println(Gender.FEMALE);
		System.out.println(GenderE.F);
		
		GenderE a = GenderE.F;
		
		switch (a) {
		case F:
			break;
		case M :
			break;
		}
			System.out.println(GenderE.F);
		}
	
	}

단축키

enum에 값 넣기

https://hilucky.tistory.com/304

0개의 댓글