![article thumbnail image](https://blog.kakaocdn.net/dn/BUn5F/btrr7qLetzp/VpjEoFtgeUoG4Pkil1SYp1/img.png)
상수와 enum이란?
1. 상수란?
public static final int AMELICANO_WATER = 180;
static final의 옵션을 사용하여 값을 변경하지 못하게 하는 것
간단한 예제
public class Recipe {
/*
* 아메리카노
* */
public static final int AMELICANO_WATER = 180;
public static final int AMELICANO_ESPRESSO = 30;
/*
* 라떼
* */
public static final int LATTE_MILK = 180;
public static final int LATTE_ESPRESSO = 30;
public static void main(String[] args) {
int type = AMELICANO_WATER;
switch (type) {
case AMELICANO_WATER :
System.out.println(180+"g");
break;
case AMELICANO_ESPRESSO :
System.out.println(30+"g");
break;
}
}
}
콘솔 창
상수를 변경하려 한다면 아래와 같이 에러가 발생한다
2. enum이란?
enum Americano{
WATER(180), ESPRESSO(30);
}
상수와 같은역활을 하며 코드의 가독성을 높혀주고 코드의 양을 줄일 수 있다.
위 코드는 enum 이며 아래 코드는 static final로 선언한 것이다.
class Americano{
public static final int WATER = 180;
public static final int ESPRESSO = 30;
}
3. 상수 vs enum
코딩을 할 때 쓰는 시간비율이 코드를 짜는 시간 50% 디버그를하는 시간 50% 라고 생각하고 컴파일 시 에러가 발생하는 코드를 작성할 경우 코드를 짜는시간비율이 증가 , 반대로 코드를 빨리 작성시 자신이 만든 서비스에서 에러가 발생하여 디버그하여 에러를 잡는다면 디버그를 하는 시간이 증가할 것이다. 나는 코드를 늦게 작성이 되더라도 컴파일 시 에러가 발생하는 경우를 더욱 선호한다 사실 그래도 서비스시 버그가 있는 경우가 많긴하다... ㅎㅎ 이렇게 컴파일 시 미리 에러를 알 수 있는 방법중 하나인 상수를 쓰거나 enum을 쓰는 것 좋은 방법인거같다.
하지만 상수를 사용할 경우에는 if문 보다는 switch문이 가독성이 높은편인데 아래 예제를 보자
public class Recipe {
/*
* 아메리카노
* */
public static final int AMELICANO_WATER = 180;
public static final int AMELICANO_ESPRESSO = 30;
/*
* 라떼
* */
public static final int LATTE_MILK = 180;
public static final int LATTE_ESPRESSO = 30;
public static void main(String[] args) {
if(AMELICANO_WATER == LATTE_MILK) {
System.out.println("물과 우유는 같다");
}
int water = AMELICANO_WATER;
switch (water) {
case AMELICANO_WATER :
System.out.println(180+"g");
break;
case AMELICANO_ESPRESSO :
System.out.println(30+"g");
break;
}
}
}
위 코드에서 if문에 물과 우유는 같지 않지만 같다고 나온다 이런것은 컴파일시 에러가 나지않지만
서비스시 버그로 발생하게된다.
if(AMELICANO_WATER == LATTE_MILK) {
System.out.println("물과 우유는 같다");
}
방법은?
아래의 코드와 같이 데이터 타입을 자신의 클래스로 변환해주면된다.
class Americano{
public static final Americano WATER = new Americano();
public static final Americano ESPRESSO = new Americano();
}
class Latte {
public static final Latte MILK = new Latte();
public static final Latte ESPRESSO = new Latte();
}
아래처럼 서로를 비교할 수 없다고 뜬다.
하지만 상수는 말했다시피 switch문이 가독성을 높혀주는데 위처럼 자신의 클래스를 데이터 타입으로 갖는다면...
switch문을 사용할 수 없다.
enum 사용 예제
enum Americano{
/*
* 상수 생성
* */
WATER("아리수"), ESPRESSO("콜롬비아");
/*
* 변수 선언
* */
String country;
/*
* 생성자 생성
* */
Americano(String country) {
this.country = country;
}
/*
* 메소드 생성
* */
String getCountry(){
return this.country;
}
}
enum Latte{
MILK("서울우유"), ESPRESSO("브라질");
String country;
Latte(String country) {
this.country = country;
}
}
public class Recipe3 {
public static void main(String[] args) {
Americano type = Americano.ESPRESSO;
switch (type) {
case WATER:
System.out.println("용량"+ 180 + "g 원산지 : "+ Americano.WATER.country);
break;
case ESPRESSO:
System.out.println("용량"+ 30 + "g 원산지 : "+ Americano.ESPRESSO.getCountry());
break;
}
}
}
간단한 설명
위 코드처럼 상수를 적은 코드양으로 작성 할 수 있으며 변수 및 생성자는 물론 메소드까지 생성이 가능하다.
그리고 아래 사진처럼 바로 에러을 잡을 수 있다.
위 예제를 돌리면 아래 사진처럼 콘솔에 찍힌다.
참고로 아래 코드는 같은 것이 찍힌다.
Americano.WATER.country
Americano.WATER.getCountry()
마지막으로.... 저도 공부하는중입니다. 만약 틀린 부분이 있으면 말씀해주세요 저도 공부한 내용을 제가 제 시야에서
이해한 정도로 적고있습니다. ㅎㅎ
'몰아 넣기' 카테고리의 다른 글
[자바/Java] .toUpperCase() (0) | 2022.03.07 |
---|---|
[자바/JAVA] 자바8 steam anyMatch() (0) | 2022.02.26 |
[SpringBoot]IntelliJ(인텔리제이)로 스프링 부트 시작하기 (0) | 2022.01.22 |
[Spring/스프링]ajax로 list<DTO>로 받기 (0) | 2022.01.18 |
[spring/java] HTTP 요청 데이터 - API 메시지 바디 (포스트맨활용) (0) | 2021.12.16 |