(1) 열거 타입 : 한정된 값만을 갖는 데이터 타입 (요일, 계절, 로그인 성공? 실패?.....)
: 한정된 값은 열거 상수(요일 中 월, 화, 수, 목, 금, 토, 일)
** JDK5에서 추가 (이전에는 상수를 열거형 대신 사용)
Q. 열거 대신 상수를 사용했을 때의 문제점??
> String 으로 선언된 변수에 한정된 값만을 대입하고 싶은데, String 타입이기 때문에 아무 문자열이나 올 수 있게 된다.... 해결 방법으로 열거형이 나옴!!
선언) 파일 이름과 동일한 이름으로 할 것!!!
public enum 열거타입이름 {열거상수1,열거상수2....} // 열거 상수는 모두 대문자,' _ ' 사용!!
열거 타입 변수 선언)
Week today;
Week reservationDay;
열거 상수값 저장)
열거타입 변수 = 열거타입.열거상수;
Week today = Week.MONDAY;
* 열거 타입 변수는 참조 타입이므로 null값으로 초기화 가능~
- 열거 객체는 열거 상수의 문자열을 내부 데이터로 가지고 있다.
그렇기 때문에, 열거 상수값을 저장할 때 열거타입.열거상수로만 해야 됨!!
- 열거 타입은 컴파일시 java.lang.Enum 클래스를 자동 상속한다.
- values() 메소드 / 향상된 for문 이용
Week[] days = Week.values();
for(Week day : days) {
System.out.println(day);
}
> days[0] ~days[6] : MONDAY~SUNDAY 까지 출력됨.
(2) 싱글톤(Singleton) : 어떠한 클래스는 단 하나의 객체만 생성되야 하는 클래스가 존재한다.
만드는 방법)
1. 클래스 자신의 타입으로 정적 필드를 선언하고, 자신의 객체를 생성해 초기화한다.
2. private 접근 제한자를 생성자 앞에 붙인다. (외부에서 여러 개의 생성자 생성하는 것을 막는다.)
3. 외부에서 호출할 수 있는 정적 메소드인 getInstance()를 선언한다.
(정적 필드에서 참조하고 있는 자신의 단 하나의 객체만 리턴하도록!!!)
public class 클래스이름 {
//정적 필드
private static 클래스이름 singleton = new 클래스이름();
//생성자
private 클래스() {}
//정적 메소드
public static 클래스이름 getInstance() {
return singleton;
}
}
public class Singleton {
private static Singleton singleton = new Singleton(); //객체 생성
private Singleton(){ //생성자 생성
}
static Singleton getInstance(){
return singleton;
}
}
public class SingletonExample {
public static void main(String[] args) {
//Singleton obj = new Singleton(); private으로 생성자 생성을 막아놓았기 때문에 error
//유일한 singleton 메소드 호출 방법
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if (obj1 == obj2){
System.out.println("같은 Singleton 객체입니다.");
} else {
System.out.println("다른 Singleton 객체입니다.");
}
}
}
---------- run ----------
같은 Singleton 객체입니다.
package test06;
public class SingletonClass {
//static이니까 SINGLETON_CLASS_INSTANCE 데이터영역에 존재, SingletonClass()는 heap영역에 존재
private static SingletonClass SINGLETON_CLASS_INSTANCE = new SingletonClass();
public int i = 10;
//외부에서 생성자 생성 막기 위해서 private
private SingletonClass() {}
//객체를 못 만드니까 static으로 객체가 만들어지기 전부터 데이터 영역(클래스 영역)에서 사용 가능
//자신의 클래스에서 객체생성을 하고 있다.
public static SingletonClass getSingletonClass() {
if(SINGLETON_CLASS_INSTANCE==null) { //FirstClass
SINGLETON_CLASS_INSTANCE = new SingletonClass();
}
return SINGLETON_CLASS_INSTANCE; //SecondClass
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
package test06;
public class FirstClass {
public FirstClass() {
SingletonClass singletonClass = SingletonClass.getSingletonClass();
System.out.println("FirstClass 입니다.");
System.out.println("i=" + singletonClass.getI());
singletonClass.setI(200);
System.out.println("i=" + singletonClass.getI());
}
}
package test06;
public class SecondClass {
public SecondClass() {
SingletonClass singletonClass = SingletonClass.getSingletonClass();
System.out.println("SecondClass 입니다.");
System.out.println("i=" + singletonClass.getI());
}
}
package test06;
public class MainClass {
public static void main(String[] args) {
FirstClass firstClass = new FirstClass();
SecondClass secondClass = new SecondClass();
}
}
FirstClass 입니다.
i=10
i=200
SecondClass 입니다.
i=200
'Language > Java' 카테고리의 다른 글
19.11.04.(알고리즘 문제 / 숫자 야구 게임 소스) (0) | 2021.02.14 |
---|---|
19.11.03. (package/import문/cmd javac/Organize Imports) (0) | 2021.02.14 |
19.11.01.(수정자(Modifier)/final/static/상수/배열(Array)/for each문) (0) | 2021.02.14 |
19.10.31. (API문서(Calendar)/추상클래스 객체 생성 방법/인터페이스/Implements/인터페이스의 default method/추상클래스vs인터페이스) (0) | 2021.02.14 |
19.10.30.(추상 클래스(Abstract Class)/추상 메소드(Abstract Method)/클래스 형변환) (0) | 2021.02.14 |