enumeration class는 열거형 클래스로 연관된 상수들의 집합이다
class 의 일종으로 생성자를 가질수있지만 접근제어자는 private형만 가능하다 
enum class도 일반클래스와 마찬가지로 컴파일할때 자동으로 생성자를만들어주지만
private이기때문에 생성자를 통하여 객체를 생성할수는없다
enum class 의 values() method를 호출하면 
enum class내에 선언되있는 모든 상수를 리턴한다.

 

//public class

public static final int PLATINUM_MEMBER = 1;  
public static final int LOYAL_MEMBER = 2;
public static final int GOLD_MEMBER = 3;  
public static final int SILVER_MEMBER = 4; 

//finall로 상수화시켜 더쉽게 이해할수있게한다

//상수가 많아질경우 복잡해질수있다

//main

int grade = GOLD_MEMBER; 
switch(grade) { 

case PLATINUM_MEMBER: 
System.out.println(30+"% discount"); 
break; 
case LOYAL_MEMBER: 
System.out.println(20+"% discount"); 
break; 
case GOLD_MEMBER: 
System.out.println(10+"% discount"); 
break; 
case SILVER_MEMBER: 
System.out.println(5+"% discount"); 
break; 

//이와같이 개발자 입장에서 이해하기쉽다

----------

interface A{ 
int PLATINUM_MEMBER = 1,LOYAL_MEMBER = 2,GOLD_MEMBER = 3,SILVER_MEMBER = 4; 
//상수가 많을경우 interface를 만들어서 더 단순하게 쓸수있다

//불러올때 앞에 interface명을 붙여줘야한다. ex(A.GOLD_MEMBER;)  

//public class

//main
int grade = A.GOLD_MEMBER; 
switch(grade) { 

case A.PLATINUM_MEMBER: 
System.out.println(30+"% discount"); 
break; 
case A.LOYAL_MEMBER: 
System.out.println(20+"% discount"); 
break; 
case A.GOLD_MEMBER: 
System.out.println(10+"% discount"); 
break; 
case A.SILVER_MEMBER: 
System.out.println(5+"% discount"); 
break; 

-------------

interface A{ 
int PLATINUM_MEMBER = 1,LOYAL_MEMBER = 2,GOLD_MEMBER = 3,SILVER_MEMBER = 4; 
//상수가 많을경우 interface를 만들어서 더 단순하게 쓸수있다

interface B{ 
int PLATINUM_MEMBER = 1,LOYAL_MEMBER = 2,GOLD_MEMBER = 3,SILVER_MEMBER = 4; 
//불러올때 앞에 interface명을 붙여줘야한다. ex(B.GOLD_MEMBER;) 

//A, B 두회사가 있을시 등급은 4등급으로 같지만 할인율이 다를수있다

//public class

//main

if(A.PLATINUM_MEMBER == B.PLATINUM_MEMBER) { 
System.out.println(" A,B의 할인율은 같다") 
//기본형인 int형을 비교하기때문에 error가 발생하지않지만

//runtime중 error가 발생할수있기 때문에 좋은방법이 아니다.
-------------

//interface내의 각각의 상수를 class로 설정할수있다

class A{ 
public static final A PLATINUM_MEMBER = new A(); 
public static final A LOYAL_MEMBER = new A(); 
public static final A GOLD_MEMBER = new A(); 
public static final A SILVER_MEMBER = new A(); 
} 
class B{ 
public static final B PLATINUM_MEMBER = new B(); 
public static final B LOYAL_MEMBER = new B(); 
public static final B GOLD_MEMBER = new B(); 
public static final B SILVER_MEMBER = new B(); 
//각각의 상수를 Class로 설정할경우 코드가 복잡해지고 

//A, B를 비교할때 error를 찾을수있지만 stitch문에 적용할수없다 

//public class

//main

-----------------

//memR.GOLD_MEMBER형태로 불러온다 
//enum class를 사용할경우 관리하기가 간편해지고 switch문에도 적용이된다 

// class memR{ 
// public static final memR PLATINUM_MEMBER = new memR(); 
// public static final memR LOYAL_MEMBER = new memR(); 
// public static final memR GOLD_MEMBER = new memR(); 
// public static final memR SILVER_MEMBER = new memR(); 
// private memR() {} 
// } //enum class를 만들경우 이와같이 상수의 개수만큼

// 생성자가 호출이 되서 객체를 생성한다 

enum memR{ 
PLATINUM_MEMBER,LOYAL_MEMBER,GOLD_MEMBER,SILVER_MEMBER; 

//public class

//main

memR grade = memR.GOLD_MEMBER; 
switch(grade) { 
case PLATINUM_MEMBER: 
System.out.println(30+"% discount"); 
break; 
case LOYAL_MEMBER: 
System.out.println(20+"% discount"); 
break; 
case GOLD_MEMBER: 
System.out.println(10+"% discount"); 
break; 
case SILVER_MEMBER: 
System.out.println(5+"% discount"); 
break; 
} 
------------ 

//enum class안에 멤버나 method를 만들어 효율적으로 사용할수있다

//enum memR
PLATINUM_MEMBER(30),LOYAL_MEMBER(20),GOLD_MEMBER(10),SILVER_MEMBER(5);

//인자를 가진 생성자를 만들어줬기때문에 인자를 입력해주어야한다
int discount;
memR(int discount){
this.discount = discount;
}//생성자생성, 접근제어자로 private, default가 올수있다
public String getDiscount() {
return discount + "% discount";
}//method생성
//할인율이 변경될수 직접바꿔줘야한다는 단점이있지만 switch문보다 성능면에서 더좋다
//public class

//main
memR mm = memR.ROYAL_MEMBER;
System.out.println(mm); //royal member가 출력된다

 

String str = mm.getDiscount(); //값을 return받는 변수생성
System.out.println(str);
//loyal member 20% discount가 출력된다

for(memR marr : memR.values()) { //for each문으로 각각의상수들을 array에 저장한다
System.out.println(marr+marr.getDiscount());
//각각의 상수와 할인율을 출력할수있다

'java' 카테고리의 다른 글

Colletions framework(ArrayList, HashSet)  (0) 2019.08.04
Generic  (0) 2019.08.04
wrapper class  (0) 2019.08.03
Object class(toString(), Equals(), hashCode())  (0) 2019.08.03
예외처리(Exception)  (0) 2019.08.03

final 지정자는 클래스나 필드 method 등에 적용해 사용한다
class 에 사용될경우 상속을 할수 없게한다
method에 적용될경우 overriding을 할수없게한다
변수에 적용하면 상수형 변수를 만든다(변수값을 변경할수없다)

//final public class Super
final double PI = 3.14; //상수를 사용할땐 대문자사용
final public void method() {
System.out.println("super class")
}

-------
//class Super
public void method() {
System.out.pritnln("suepr class");
}

final public void method1() {
System.out.println("final test1");
}

//final class Sub extends Super 

//ifnal class는 다른 class를 상속받을수는있다
public void method() { //overriding을 할수있다
System.out.println("sub class");

public void method1() {
System.out.println("final test2")
//super class 에 있는 final method는 overriding 할수 없다.

//class Subsub Extends Sub
//final 지정자가 있기때문에

//Sub class 를 상속받을수 없다
-----------
//class FinalEx

final public static int AA = 10; 

//변수앞에 final쓸경우 주로 이런식으로쓰인다
int aa = 100;

//public class FinalEx2
//main
FinalEx fe = new FinalEx();
System.out.println(fe.aa); //100이 출력된다
System.out.println(FinalEx.AA);

//class 변수이기때문에 class명을붙여서 호출한다

fe.aa = -100; //값을 변경할수있다
FinalEx.AA = 200; //final 변수 상수값은 바꿀수없다

'java' 카테고리의 다른 글

다형성(Polymorphism) -first  (0) 2019.08.03
인터페이스(interface)  (0) 2019.08.03
추상클래스(abstract class), 추상메소드(abstract method)  (0) 2019.08.02
접근 제어자(Access modifier)  (0) 2019.08.02
inheritance(상속), overriding  (0) 2019.08.02

+ Recent posts