복습
상수 : 변하지 않는 값
int x = 1;
1 = 2;
- 주석 필요한 코드
- 주석 불필요 (final 사용)
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;
}}}
- 인터페이스 사용해 단순화
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 |