우리는 일반적으로 어떠한 상수를 정의하고 할때 public static final 이란 키워드를 사용하여 정의를 할 것입니다 . final이란 키워드로 정의를 하면 값을 수정 , 변경 할 수 없습니다.
fianl
fianl이란 키워드를 통한 상수를 정의를 하고 값을 넣을 것입니다.
public final static int book=0;
public final static int computer=1;
public final static int phone=2;
아니면 클래스 타입의 객체를 선언해서 사용하는 방법이 존재합니다.
Product.class
public class Product {
public final static Product book = new Product();
public final static Product computer = new Product();
public final static Product phone = new Product();
}
Main.class
swtich문을 사용하여 비교를 하면 book이 출력되는 것을 확인 할 수 있습니다.
public class Main {
public static final int book = 1;
public static final int computer = 2;
public static final int phone = 3;
public static void main(String[] args) {
int type = book;
switch (type){
case book:
System.out.println("book");
break;
case computer:
System.out.println("computer");
break;
case phone:
System.out.println("phone");
break;
}
}
}
객체를 사용하여 상수정의
Product
public class Product {
public static final Product book = new Product();
public static final Product computer = new Product();
public static final Product phone = new Product();
}
Main
swtich로 값을 비교하고자 할때 에러가 발생할 것입니다. switch문은 가독성을 높일 수 있는 방법이지만 인스턴스를 비교는 할수가 없다. 원시형 타입 이나 , enum등의 타입을 넣어야합니다. 때문에 컴파일에러가 발생한다. 비교하고자 할때는 if문을 사용해야합니다.
public class Main {
public static void main(String[] args) {
Product type = Product.book;
//컴파일 에러 발생
switch (type){
case Product.book:
System.out.println("book");
break;
case Product.computer:
System.out.println("computer");
break;
case Product.phone:
System.out.println("phone");
break;
}
}
}
또다른 방법은 interface를 사용하는 것입니다.
interface
ProductInterface
interface에 존재하는 필드는 public final static이 암시적으로 사용되어 바로 접근 가능합니다.
public interface ProductInterface {
int book=0;
int computer =1;
int phone =2;
}
Main
public class Main {
public static void main(String[] args) {
int type = ProductInterface.book;
switch (type){
case ProductInterface.book:
System.out.println("book");
break;
case ProductInterface.computer:
System.out.println("computer");
break;
case ProductInterface.phone:
System.out.println("phone");
break;
}
}
}
마지막 방법은 Enum을 사용하여 상수 정의를 하는 것입니다.
Enum
Enum은 기존에 상수를 정의 하는 public static final , interface 등을 통하여 작성하는 것 보다 코드가 간결하고 , 인스턴스 생성과 상속을 방지합니다..
ProductEnum
public enum ProductEnum {
BOOK , COMPUTER, PHONE
}
Enum 동작은 기존 아래의 방법과 동일하기 작동한다고 보면됩니다 그이유는 Enum 또한 클래스이며 생성자를 가질 수 있기 때문입니다. 열겨형으로 우리가 BOOK , COMPUTER, PHONE 을 하나하나 만들때마다 new ProductEnum 이라는 인서턴스화 하는 과정이 동작하고 new 인스턴스화하면 생성자가 호출이되는데 enum에 열거된 상수만큼 생성자를 호출하게 되는 것입니다.
Product
public class Product {
public static final Product book = new Product();
public static final Product computer = new Product();
public static final Product phone = new Product();
}
main
switch문의 case 의 타입을 보면 타입이 아닌 상수가 적혀있는 것을 확인 할 수 있습니다. 이유는 값을 swtich문에 던질때 이미 ProductEnum 이란것을 알 기 때문에 생략이 가능 한 것 입니다.
public class Main {
public static void main(String[] args) {
ProductEnum type = ProductEnum.BOOK;
switch (type){
case BOOK:
System.out.println("book");
break;
case COMPUTER:
System.out.println("computer");
break;
case PHONE:
System.out.println("phone");
break;
}
}
}
Enum 생성자 정의
ProductEnum
public enum ProductEnum {
BOOK, COMPUTER, PHONE;
ProductEnum(){
System.out.println("call me !! " + this);
}
}
main
public class Main {
public static void main(String[] args) {
ProductEnum type = ProductEnum.BOOK;
switch (type){
case BOOK:
System.out.println("book");
break;
case COMPUTER:
System.out.println("computer");
break;
case PHONE:
System.out.println("phone");
break;
}
}
}
console
위에 설명한 것 처럼 Enum은 클래스이기 때문에 생성자를 가질 수 있어 "call me !! {상수}" 가 3번 호출되는 것을 확인 할 수 있습니다. 또한 Enum의 상수에는 변수를 지정 하거나 메소드를 정의 할 수 있습니다.
Enum의 상수에 변수정의 와 메소드 정의
ProductEnum
public enum ProductEnum {
BOOK("책"), COMPUTER("컴퓨터"), PHONE("핸드폰");
private String name;
public String getName(){
return this.name;
}
ProductEnum(String name){
this.name = name;
}
}
main
public class Main {
public static void main(String[] args) {
String name = ProductEnum.BOOK.getName(); //ex) 책
}
}
'Java' 카테고리의 다른 글
Java 인스턴스 변수와 정척 초기화 블록 (0) | 2020.08.17 |
---|---|
Java 날짜 연산 LocalDateTime (0) | 2020.06.28 |
Java 출력스트림 (0) | 2020.06.21 |
Java 동적으로 객체 생성하기 (0) | 2020.06.21 |