반응형

 

enum 타입

 

: 열거형 자료 타입이다.

타입을 명확하게 하기 위해 사용한다.

 

package kr.or.ddit.study05.sec03;

public enum Day {
	// 개발자로서의 약속
	// 대문자를 사용하는 것이 원칙
	MON, TUE, WED, THU, FRI, SAT, SUN
}

 

package kr.or.ddit.study05.sec03;

import java.util.Scanner;

public class DayExample {
	public static void main(String[] args) {
//		Scanner sc = new Scanner(System.in);
//		int day = sc.nextInt();
		
		// enum 타입에서 꺼내와서 day에 넣음
		Day day = Day.MON;
		if(day == Day.MON) {
			System.out.println("월요일");
		} else if(day == Day.TUE) {
			System.out.println("화요일");
		} else if(day == Day.WED) {
			System.out.println("수요일");
		} else if(day == Day.THU) {
			System.out.println("목요일");
		} else if(day == Day.FRI) {
			System.out.println("금요일");
		} else if(day == Day.SAT) {
			System.out.println("토요일");
		} else if(day == Day.SUN) {
			System.out.println("일요일");
		}
	}
}

 

결과 화면1

 

 

package kr.or.ddit.study05.sec03;

public enum DeviceType {
	
	Mobile("안드로이드"), 
	WEB("스프링"),
	Server("리눅스");
	
	// 생성자
	DeviceType(String name) {
		this.name = name;
	}
	
	String name;
}

 

package kr.or.ddit.study05.sec03;

public class Developer {
	public static void main(String[] args) {
		DeviceType dt = DeviceType.Mobile;
		
		// enum 타입을 사용하면 특정 타입의 데이터만 꺼내올 수 있음
		System.out.println(dt.name);
	}
}

 

결과 화면2

 

 

package kr.or.ddit.study05.sec03;

public enum Month {
	/*
	 * 1 ~ 12월까지 타입 만들고 
	 * if문을 통해 무슨 월이 입력 되었는지 출력해보기.
	 */
	
	JAN("1월"), FEB("2월"), MAR("3월"), APR("4월"), MAY("5월"), JUNE("6월"), 
	JULY("7월"), AUG("8월"), SEP("9월"), OCT("10월"), NOV("11월"), DEC("12월");
	
	String m;
	// 생성자
	Month(String m) {
		this.m = m;
	}
}

 

package kr.or.ddit.study05.sec03;

public class MonthExample {
	public static void main(String[] args) {
		Month m = Month.DEC;
		
		// Month.values에는 Month에 있는 모든 값이 들어가 있음
		for(Month month : Month.values() ) {
			if(m == month) {
				System.out.println(m.m);
			}
		}
		
	}
}

 

결과 화면3

 

 

 

패키지 선언

 

패키지란 클래스 작성 시 해당 클래스가 어떤 곳에 속할 것인지 결정하는 것을 이야기한다.

 

패키지는 아래와 같은 규칙이 존재한다.

 - 숫자로 시작 불가

 - _ 및 $ 제외 특수문자 사용 불가

 - java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 불가

 - 모두 소문자로 작성

 

 

 

import

 

사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속된 경우 사용해야 한다.

해당 패키지 클래스 또는 인터페이스를 가져와 사용할 것임을 통지해야 한다.

 

 

 

 

접근 제한자

 

: 클래스와 인터페이스 및 이름을 가진 멤버의 접근을 제한한다.

 

- public 

: 외부 클래스에서도 자유롭게 사용 가능.

 

- protected

: 같은 패키지 또는 자식 클래스에서만 사용 가능.

 

- private

: 외부에서 사용 불가. => 나 자신만.

 

- default 

: 같은 패키지에 소속된 클래스에서만 사용 가능.

아무것도 선언하지 않았을 때가 default임

 

 

 

static 예시

 

static이란 클래스에 고정되어 있는 변수나 메소드를 이야기 한다.
메모리에 고정적으로 할당되며 객체 생성 없이 사용할 수 있다는 특징이 있다.

 

package kr.or.ddit.study06.sec05;

public class StaticTest {
	static int a = 0;
	int b = 0;
	
	// public 메소드의 경우 static 값도 접근할 수 있음 => 모든 값 접근 가능
	public void addA1() {
		a++;
	}
	
	// static 메소드의 경우 static 값만 접근할 수 있음
	public static void addA2() {
		a++;

	}
	public void addB1() {
		b++;
	}
	public static void addB2() {
//		b++;
		System.out.println("static 메소드에서는 인스턴스"+"멤버인 b 값을 부를 수 없다.");
	}
}

 

package kr.or.ddit.study06.sec05;

public class StaticMain {
	public static void main(String[] args) {
		StaticTest s1 =new StaticTest();
		s1.addA1(); // a = 1
		s1.addA2(); // a = 2
		s1.addB1(); // b = 1
		s1.addB2(); // syso
		
		StaticTest s2 =new StaticTest();
		s2.addA1(); // a = 3
		s2.addA2(); // a = 4
		s2.addB1(); // b = 1
		s2.addB2(); // syso
		s2.addB1(); // b = 2
		s2.addB2(); // syso
		
		StaticTest s3 =new StaticTest();
		s3.addA1(); // a = 5
		s3.addA2(); // a = 6
		
		System.out.println(StaticTest.a+", "+s1.b);
		System.out.println(StaticTest.a+", "+s2.b);
		System.out.println(StaticTest.a+", "+s3.b);
	}
}

 

결과 화면4

 

 

 

싱글톤 패턴

 

: 디자인 패턴 중 하나로, 객체의 인스턴스가 오직 1개만 생성되는 패턴을 이야기한다.

ex) 은행 서비스

 

 

사용 이유

메모리를 효율적으로 관리할 수 있음.

데이터 공유가 쉬움

 

ex) 

package kr.or.ddit.study06.sec05;

public class BigLoadSingleTone {
	static BigLoadSingleTone instance = null;
	
	public BigLoadSingleTone() {
		try {
			// 3초 동안 멈춤
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public static BigLoadSingleTone getInstance() {
		if(instance == null) {
			instance = new BigLoadSingleTone();
		}
		return instance;
	}
}

 

package kr.or.ddit.study06.sec05;

import java.util.Date;

public class BigLoadMain {
	public static void main(String[] args) {
		Date d1 = new Date();
//		System.out.println("1");
//		BigLoadSingleTone bst1 = new BigLoadSingleTone();
//		System.out.println("2");
//		BigLoadSingleTone bst2 = new BigLoadSingleTone();
//		System.out.println("3");
//		BigLoadSingleTone bst3 = new BigLoadSingleTone();
		
		System.out.println("1");
		BigLoadSingleTone bts1 = BigLoadSingleTone.getInstance();
		System.out.println("2");
		BigLoadSingleTone bts2 = BigLoadSingleTone.getInstance();
		System.out.println("3");
		BigLoadSingleTone bts3 = BigLoadSingleTone.getInstance();
		
		Date d2 = new Date();
		System.out.println(d2.getTime() - d1.getTime());
	}
}

 

결과 화면5 : 주석 처리한 것들을 풀고 비교하면 걸리는 시간이 다르다는 것을 알 수 있다.

 

 

package kr.or.ddit.study06.sec05;

public class SingleTemp {
	// private : 접근을 막음
	// static : 하나만 생성
	// SingleTemp : 디자인 패턴 중 하나.
	private static SingleTemp instance = null;

	private SingleTemp() {
	}

	public static SingleTemp getInstance() {
		
		if (instance == null) {
			instance = new SingleTemp();
		}
		return instance;
	}
}

 

 

package kr.or.ddit.study06.sec05;

public class SingleTon {
	private static SingleTon  instance = null;
	
	int a =1;
	
	
	private SingleTon() {  // private는 외부에서 접근 막음 (클래스내에서만 사용가능)
		System.out.println("객체가 생성됨.");
	}
	
	public int getA() {
		return ++a;
	}
	
	public static SingleTon getInstance() { // public 모든 곳에 열려있음  getInstance
		if(instance == null) {
			instance = new SingleTon();
		}
		return instance;
	}
}

 

package kr.or.ddit.study06.sec05;

public class CallSingleTon {
	public static void main(String[] args) {
		System.out.println("1번째호출");
		SingleTon singleTon1 = SingleTon.getInstance();
		System.out.println(singleTon1.getA());
		System.out.println("2번째호출");
		SingleTon singleTon2 = SingleTon.getInstance();
		System.out.println(singleTon2.getA());
		System.out.println("3번째호출");
		SingleTon singleTon3 = SingleTon.getInstance();
		System.out.println(singleTon3.getA());
		System.out.println("4번째호출");
		SingleTon singleTon4 = SingleTon.getInstance();
		System.out.println(singleTon4.getA());
	}
}

 

결과 화면6

 

 

package kr.or.ddit.study06.sec05;

public class Bank {
	private static Bank instance = null;
	
	// Bank를 private로 설정해야 SingleTon을 사용하기 적합하다. 
	public Bank() {
	}

	public static Bank getInstance() {
		if (instance == null) {
			instance = new Bank();
		}
		return instance;
	}
	
	private int money = 10000;
	
	public int getMoney(int m) {
		if(money < m) {
			System.out.println("잔고가 모자릅니다.");
			return 0;
		}
		money -= m;
		return m;
	}
}

 

package kr.or.ddit.study06.sec05;

public class BankMain {
	public static void main(String[] args) {
		// 싱글톤을 적용함
		Bank bank1 = Bank.getInstance();
		System.out.println(bank1.getMoney(3000));
		
		Bank bank2 = Bank.getInstance();
		System.out.println(bank2.getMoney(3000));
		
		Bank bank3 = Bank.getInstance();
		System.out.println(bank3.getMoney(3000));
		
		Bank bank4 = Bank.getInstance();
		System.out.println(bank4.getMoney(3000));
		
		
		// 객체가 새로 생성함 -> 잔고는 10,000인데 모두가 10,000원을 가져갈 수 있음.
//		Bank bank1 = new Bank();
//		System.out.println(bank1.getMoney(10000));
//		
//		Bank bank2 = new Bank();
//		System.out.println(bank2.getMoney(10000));
//		
//		Bank bank3 = new Bank();
//		System.out.println(bank3.getMoney(10000));
//		
//		Bank bank4 = new Bank();
//		System.out.println(bank4.getMoney(10000));
		
	}
}

 

결과 화면7

 

 

반응형