enum 타입이란?

  • 변수가 미리 정의된 상수 세트가 될 수 있도록 하는 특수 데이터 유형(특수한 형태의 class)이다.
  • 열거형은 enum 키워드를 사용하여 정의한다.
  • new를 사용하여 객체를 생성할 수 없다.
package ex0727;

public class Ex06 {
	public static void main(String[] args) {
		// 열거형 상수의 기수(선언 위치) 출력
		for(Color c : Color.values()) {
			System.out.println(c+" -> " + c.ordinal());
		}
		// System.out.println(Color.RED == 0); // 컴파일 오류. C언어는 0임 (True)
		System.out.println();
		
		
		Test6 ob = new Test6();
		System.out.println(ob.getColor()); // RED 출력
		
		ob.setColor(Color.BLUE);
		Color color = ob.getColor();
		
		// case에서는 enum은 enum명 생략 가능(Color 생략 가능)
		switch(color) {
		case RED : System.out.println("red"); break;
		case GREEN : System.out.println("greed"); break;
		case BLUE : System.out.println("blue"); break;
		}
	}
}

enum Color {
	RED, GREEN, BLUE
}	

class Test6 {
	private Color color = Color.RED;
	
	public void setColor(Color color) {
		this.color = color;
	}
	
	public Color getColor() {
		return color;
	}
}

ordinal 이란 메소드는 열거형에 있는 값들을 순서대로 return해준다. 여기에서 RED가 0 이라고 반환했지만 0과 같지는 않다. 

package ex0727;

public class Ex07 {
	public static void main(String[] args) {
		System.out.println(City.SEOUL);
		// toString() 이 재정의 되어 있지 않으면 SEOUL 출력
		System.out.println("서울 : "+City.SEOUL.getCount());
		
		System.out.println("\n전체 리스트...");
		for(City c : City.values()){
			System.out.println(c.getName()+" : "+c.getCount());
		}
		
	}
}

// 열거형 상수에 값 할당 - 생성자를 만들어야 함
enum City {
	SEOUL("서울", 1000),
	BUSAN("부산", 350),
	INCHEON("인천", 330);
	
	private String name;
	private int count;
	
	// 생성자는 private만 가능. 생략해도 private
	private City(String name, int count) {
		this.name = name;
		this.count = count;
	}

	public String getName() {
		return name;
	}

	public int getCount() {
		return count;
	}
	
	@Override
	public String toString() {
		return this.name +"  인구 : "+this.count+"만명";
	}
}

package ex0727;

public class Ex08 {
	public static void main(String[] args) {
		double a;
		
		a = Operation.PLUS.eval(10, 5);
		System.out.println(a);
		
		double x = 10, y = 5;
		for(Operation op : Operation.values()) {
			System.out.printf("%.1f %s %.1f = %.1f\n", x, op, y, op.eval(x, y));
		}

	}
}

// 열거형 상수 - 메소드 정의. 추상 메소드가 선언되어야 함.
enum Operation {
	// 재정의 하는 꼴!
	PLUS { public double eval(double x, double y) {return x + y; } },
	MINUS { public double eval(double x, double y) {return x - y; } },
	TIMES { public double eval(double x, double y) {return x * y; } },
	DIVIDE { public double eval(double x, double y) {return x / y; } };
	
	public abstract double eval(double x, double y); // 이게 꼭 있어야 함!
}

 

'쌍용강북교육센터 > 7월' 카테고리의 다른 글

0728_Ex01~Ex03_exception : 예외처리  (0) 2021.07.29
0727_패키지  (0) 2021.07.27
0727_Ex05_중첩 인터페이스  (0) 2021.07.27
0727_Ex03_anonymous class : 익명클래스  (0) 2021.07.27
0727_Ex01~Ex02_중첩 클래스  (0) 2021.07.27
package ex0727;

public class Ex05 {
	public static void main(String[] args) {
		Button.OnClickListener listener = new Button.OnClickListener() {
			@Override
			public void onClick() {
				System.out.println("클릭 !!!");
			}
		};
		
		listener.onClick();
		
	}
}

// 중첩 인터페이스
class Button {
	public interface OnClickListener {
		public void onClick();
	}
}

객체 생성할때 뜨는거 컨트롤 스페이스 바에서 바로 밑에 선택하면 알아서 override가 나옴.

'쌍용강북교육센터 > 7월' 카테고리의 다른 글

0727_패키지  (0) 2021.07.27
0727_Ex06~Ex08_enum : 열거형  (0) 2021.07.27
0727_Ex03_anonymous class : 익명클래스  (0) 2021.07.27
0727_Ex01~Ex02_중첩 클래스  (0) 2021.07.27
0727_Ex111~116_throws : Checked, Unchecked ...  (0) 2021.07.27
package ex0727;

public class Ex03 {
	public static void main(String[] args) {
		User3 ob = new User3();
		ob.sub();
		ob.disp();
	}
}

interface Test3 {
	public void print();
}

class User3 {
	public void sub() {
		// anonymous class 익명클래스
		// Test3 t = new Test3(); // 컴오류. 인터페이스는 객체 생성 불가
		// 익명 클래스는 컴파일하면 User3$1.class 이름의 클래스 파일이 생성(뒤 번호는 순서)
		Test3 t = new Test3() {
			// 익명 클래스에서 인터페이스 메소드 재정의
			@Override
			public void print() {
				System.out.println("sub...");
				
			}
		};
		t.print();
		
	}
	public void disp() {
		Test3 t = new Test3() {
			@Override
			public void print() {
				System.out.println("disp...");
			}
		};
		t.print();
	}
}

package ex0727;

public class Ex04 {

	public static void main(String[] args) {
		Object ob1 = new Object();
		System.out.println(ob1); // 클래스명@해쉬코드
		
		Object ob2 = new Object() {
			@Override
			public String toString() {
				// TODO Auto-generated method stub
				return "익명 클래스로 재정의...";
			}
		};
		System.out.println(ob2);

	}

}

익명 클래스 ?

  • 클래스 또는 인터페이스에 대한 객체를 생성하면서 바로 클래스 또는 인터페이스를 정의하는 클래스 
  • 정의하는 부분과 생성하는 부분이 하나로 묶어져 new수식이 있는 곳에서 바로 클래스를 정의하거나 인터페이스를 구현

'쌍용강북교육센터 > 7월' 카테고리의 다른 글

0727_Ex06~Ex08_enum : 열거형  (0) 2021.07.27
0727_Ex05_중첩 인터페이스  (0) 2021.07.27
0727_Ex01~Ex02_중첩 클래스  (0) 2021.07.27
0727_Ex111~116_throws : Checked, Unchecked ...  (0) 2021.07.27
0727_Ex110_tryResource  (0) 2021.07.27

 

package ex0727;

public class Ex01 {
	public static void main(String[] args) {
		// 외부에서 중첩 클래스의 객체를 생성
		Test1.User1 u = new Test1.User1();
		u.write();
		
	}
}

class Test1 {
	int a = 10;
	static int b = 0;
	
	// static 중첩 클래스
	// 외부 클래스(Test1)의 객체 생성과 상관 없이 객체를 생성하여 사용할 수 있는 클래스
	// 컴파일하면 Test1$User1.class
	static class User1 {
		int x = 100;
		
		public void write() {
			// System.out.println(a); // 컴오류.
			System.out.println(b);
		}
		
		public void disp() {
			Test1 t = new Test1();
			System.out.println(t.a);
			t.print();
		}
	}
	
	public void print() {
		System.out.println(a + ", "+ b);
	}
	
	public static void sub() {
		// System.out.println(a); // 컴오류. 클래스 메소드는 인스턴스 변수 접근 불가
		System.out.println(b);
	}
}

package ex0727;

public class Ex02 {
	public static void main(String[] args) {
		// 내부 클래스는 외부에서 단독으로 객체 생성이 불가능
		// Test2.User2 ob = new Test2.User2(); // 컴오류
		
		// 내부 클래스는 외부 클래스의 객체를 생성후에 생성된 객체를 이용하여 생성
		// 내부 클래스는 외부 클래스 내(메소드)에서 사용할 목적으로 만듦(보안에 유리)
		Test2 ob = new Test2();
		Test2.User2 uu = ob.new User2();
		uu.write();
	}
}

class Test2 {
	int a = 10;
	static int b = 20;
	
	// 내부 클래스(member class)
	// 외부 클래스(Test2) 객체가 생성 되어야 객체를 생성할 수 있는 클래스
	class User2 {
		int x = 100;
		
		public void write() {
			// 외부 클래스의 인스턴스 변수나 인스턴스 메소드 접근 가능
			System.out.println(a+", " +b +", "+x);
		
			// print(); // 가능
		}
	}
	
	public void print() {
		System.out.println(a+", "+b);
	}
	
	public void sub() {
		// 메소드 내에서 내부 클래스의 객체 생성 및 활용 
		User2 u = new User2();
		u.write();
	}
	
}

package ex0727;

public class Ex111_throws {

	public static void main(String[] args) {
		User11 u = new User11();
		
		u.setValue(-5);
		int n = u.getValue();
		System.out.println(n);

	}

}

// 잘못 작성된 클래스
class User11 {
	private int value;

	public void setValue(int value) {
		if (value < 0)
			return;

		this.value = value;
	}
	
	public int getValue() {
		return value;
	}
}

package ex0727;

public class Ex112_throwsChecked {

	public static void main(String[] args) {
		User12 u = new User12();
		
		try {
			u.setValue(-5);
			int n = u.getValue();
			System.out.println(n);
		} catch (Exception e) {
			// e.printStackTrace();
			System.out.println(e.toString());
		}
		System.out.println("end...");

	}

}

class User12 {
	private int value;

	public void setValue(int value) throws Exception { // 메소드를 호출하는 곳에서 catch하도록 설정
		if (value < 0) {
			// 강제로 checked exception을 발생 시킴
			throw new Exception("0 이상만 가능합니다."); // 예외를 발생시키는 것
		}

		this.value = value;
	}
	
	public int getValue() {
		return value;
	}
}

package ex0727;

public class Ex113_throws {

	public static void main(String[] args) throws Exception { // throws : 메소드를 호출한 곳에서 예외를 처리하도록  
	
		User13 ob = new User13();
		
		// 이곳에서 try~catch로 예외를 catch하지 않고 main()을 호출하는 곳에서 예외 처리하도록 설정
		
		// 위처럼 main() 메소드에서 throws 할 경우 예외가 발생하면
		// 		프로그램은 비 정상 종료된다. main()에서는 하면 안된다!!
		ob.setValue(-5);
		
		int n = ob.getValue();
		System.out.println(n);
		
		System.out.println("end...");

	}

}

class User13 {
	private int value;

	public void setValue(int value) throws Exception { // 메소드를 호출하는 곳에서 catch하도록 설정
		if (value < 0) {
			// 강제로 checked exception을 발생 시킴
			throw new Exception("0 이상만 가능합니다."); 
		}

		this.value = value;
	}
	
	public int getValue() {
		return value;
	}
}

package ex0727;

public class Ex114_throws {

	public static void main(String[] args) { 
		User14 ob = new User14();
	
		ob.setValue(-5);
		
		int n = ob.getValue();
		System.out.println(n);
		
		System.out.println("end...");

	}

}

class User14 {
	private int value;

	public void setValue(int value) { 
		
		try {
			if (value < 0) {
				throw new Exception("0 이상만 가능합니다."); 
			}
			
			this.value = value;
			
		} catch (Exception e) {
			// 위에서 throw new Exception("") 한 예외를 이곳에서 catch함
			System.out.println(e.toString());
		}
	}
	
	public int getValue() {
		return value;
	}
}

package ex0727;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Ex115_throws {
	public static void main(String[] args) {
		User15 ob = new User15();
		
		ob.input();
		ob.input();

	}
}

class User15 {
	private Scanner sc = new Scanner(System.in);

	public void input() {
		String name, tel;
		int kor, eng;

		try {
			System.out.print("이름 ? ");
			name = sc.next();

			System.out.print("국어 ? ");
			kor = inputScore();

			System.out.print("영어 ? ");
			eng = inputScore();

			System.out.print("전화번호 ? ");
			tel = sc.next();

			System.out.println(name + "," + kor + ":" + eng + ":" + tel);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		System.out.println("------------------------------");
	}

	// 점수를 입력 받는 메소드
	private int inputScore() throws Exception { // 메소드를 호출하는 곳에서 예외처리하도록 설정
		int s = 0;

		try {
			s = sc.nextInt();
			if (s < 0 || s > 100) {
				// 강제로 checked exception을 발생 시킴
				throw new Exception("점수는 0~100 사이만 가능합니다.");
			}
		} catch (InputMismatchException e) {
			// System.out.println("숫자만 입력 가능 합니다.");
			
			// 문제가 있는 데이터를 읽어서 버림(없으면 이상한 현상이 발생 됨.)
			sc.nextLine();
			
			// 강제로 checked exception을 발생 시킴
			throw new Exception("점수는 숫자만 입력 가능합니다.");
		}

		return s;
	}
}

package ex0727;

public class Ex116_throwUnchecked {
	public static void main(String[] args) {
		User16 u = new User16();
/*		
		u.setValue(-5);
			// value가 0보다 적어 RuntimeException이 발생.
			// 예외를 처리하지 않아 프로그램은 이곳에서 비정상적인 종료
		int n = u.getValue();
		System.out.println(n);
		System.out.println("end...");
*/
		
		try {
			u.setValue(-5);
			int n= u.getValue();
			System.out.println(n);
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	
		System.out.println("end...");
		
	}
}

class User16 {
	private int value;

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		if (value < 0) {
			// 숫자가 음수인 경우 RuntimeException 예외를 발생 시킴
			// RuntimeException은 unchecked exception으로 반드시 catch할 필요가 없다.
			throw new RuntimeException("0이상만 가능합니다.");
		}
	}
	
}

package ex0727;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Ex110_tryResource {

	public static void main(String[] args) {
		int n;
		String s;

		// JDK 7.0 부터 가능
		// try~with~resource : 자동으로 resource가 close됨.
		try (Scanner sc = new Scanner(System.in)) { // DB에서 활용하면 편하다.
			System.out.println("나이 ? ");
			n = sc.nextInt();
			s = n >= 19 ? "성인" : "미성년자";
			System.out.println(s + " 입니다.");
			
		} catch (InputMismatchException e) {
			System.out.println("숫자만 입력 가능합니다.");
		}

		System.out.println("end...");

	}

}

try 에 스캐너를 넣어주면 마지막에 sc.close(); 를 안넣어도 느낌표가 뜨지 않으므로 사용시 편리하다. DB에서 사용하면 편하다고 하심. (아직 DB를 안배워서 잘 모르겠지만 그렇다고하심)..

package ex0727;

import java.util.Scanner;

public class Ex106_finally {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String[] ss = new String[3];
		int idx;
		String s;
		
		try {
			idx = 0;
			System.out.println("문자열 입력[종료:입력하지 않고 엔터]...");
			while( (s = sc.nextLine()).length() != 0 ) {
				ss[idx++] = s;
				System.out.print("문자열 입력 : "); // 예외 발생하면 실행 되지 않는다.
			}
		} catch (ArrayIndexOutOfBoundsException e) {
			// ArrayIndexOutOfBoundsException : unchecked exception
				// 배열의 첨자가 벗어난 경우 발생하는 예외
			System.out.println("입력을 초과 했습니다...");
		} finally {
			System.out.println("예외 발생 여부와 상관 없이 실행 합니다.");
			sc.close();
		}
		
		System.out.println("\n입력 문자열...");
		for(String str : ss) {
			System.out.println(str);
		}

	}
}

package ex0727;

import java.util.Scanner;

public class Ex107_finally {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a, b, c;

		try {
			System.out.print("두정수 ? ");
			a = sc.nextInt();
			b = sc.nextInt();

			c = a / b;
			System.out.println(a + "/" + b + "=" + c);
		} finally {
			System.out.println("예외발생 여부와 상관 없이 실행 됩니다.");
			sc.close();
		}

		// 예외가 발생하면 실행하지 않는다.
		System.out.println("end...");

	}
}

package ex0727;

public class Ex108_finally {
	public static void main(String[] args) {
		// divide(10, 5);
		// divide(10, 0);
		divide(10, -5);

	}

	public static void divide(int a, int b) {
		try {
			if (b < 0) {
				System.out.println("음수를 입력 했습니다.");
				return;
			}

			int c = a / b;
			System.out.println(a + "/" + b + "=" + c);

		} catch (ArithmeticException e) {
			System.out.println("0으로 나눌 수 없습니다.");
		} finally {
			// System.exit(0);// 프로그램 강제 종료를 만났을 때만 실행하지 않는다.
			System.out.println("finally 블럭은 return을 만나도 실행된다.");
		}

		System.out.println("end...");
	}
}

package ex0727;

import java.util.Scanner;

public class Ex101_exception {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a, b, c;
		
		System.out.print("두정수 ? ");
		a = sc.nextInt();
		b = sc.nextInt();
		
		c = a / b;
		System.out.println(a+"/"+b+"="+c);
		
		// b가 0인 경우 프로그램은 강제로 종료되어 아래 내용이 실행되지 않는다.
		System.out.println("end...");
		
		sc.close();
	}
}

package ex0727;

import java.util.Scanner;
/*
 - 예외가 발생하지 않는 경우
   1) 블럭 모두 실행
   3) 블럭 실행 - 종료
 
 - 예외가 발생한 경우(1번 블럭)
   1) 블럭 실행 중 예외 발생(비정상적인 상황) - 1)블럭 실행을 중지하고
   2) 블럭 실행(예외가 발생한 경우만 실행)
   3) 블럭 실행 - 종료
 */
public class Ex102_exception {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a, b, c;
		
		try {
			// 1) 예외가 발생할 가능성이 있는 코드를 기술
			System.out.print("두수 ? ");
			a = sc.nextInt();
			b = sc.nextInt();
			c = a / b;
			System.out.println(a + "/" + b + "=" + c);
			
		} catch (Exception e) {
			// Exception : 모든 예외를 catch 할 수 있지만 예외 상황별로 예외를 분리할 수 없다.
			// 2) 예외가 발생할 때 실행할 코드 작성
			System.out.println("에러가 발생했습니다.");
		}

		// 3)
		System.out.println("end...");
		sc.close();
	}

}

package ex0727;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ex103_exception {
	public static void main(String[] args) {
		// 버퍼를 이용하여 문자(열)을 입력 받음. 입력 속도 향상.
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s;
		int a, b, c;
		
		try {
			System.out.print("첫번째 수 ?");
			s = br.readLine();
				// readLine()은 checked exception(IOException)이 발생하므로 
				// 반드시 예외처리 해야함.
			
			a = Integer.parseInt(s); // 문자열을 숫자로 바꿈
				// NumberFormatException 이라는 unchecked exception 발생
			
			System.out.print("두번째 수 ? ");
			b = Integer.parseInt(br.readLine());
			
			c = a / b;
				// 0으로 나누면 ArithmeticException 이라는 unchecked exception 발생
			
			System.out.println(a + "/" + b + "=" + c);
			
		} catch (IOException e) {
			// IOException : 입출력에 문제가 발생할 때 발생하는 예외(checked exception)
			// checked exception은 메소드를 정의할 때 throws 한 예외
			// checked exception은 예외처리를 하지 않으면 컴파일 에러가 발생하는 예외
			e.printStackTrace(); // 에러 메시지를 표준 출력 장치에 출력
		}
		
		// 0으로 나누거나 문자열이 입력되면 에외가 발생되어 비정상 종료되며, 아래 메시지는 출력되지 않는다.
		System.out.println("end...");
	}
}

package ex0727;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ex104_exception {
	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int a, b, c;
		
		try {
			System.out.print("첫번째 수 ? ");
			a = Integer.parseInt(br.readLine());
			
			System.out.print("두번째 수 ? ");
			b = Integer.parseInt(br.readLine());
			
			c = a / b;
			
			System.out.println(a + "/" + b + "=" + c);
		
		// 예외 발생별로 예외를 catch
		} catch (IOException e) { // checked 예외 (반드시 catch해야함)
			e.printStackTrace();
		} catch (NumberFormatException e) {
			// unchecked exception
			// 문자열을 숫자로 변경하지 못하는 경우 등에 발생
			// 반드시 catch 할 필요는 없지만 catch하지 않는 경우 예외가 발생하면 프로그램은 비정상 종료
			
			// System.out.println("숫자만 입력 가능합니다...");
			// System.out.println(e.getMessage()); // 간단한 메시지 출력
			// System.out.println(e.toString()); // 예외 종료 및 간단한 메시지
			e.printStackTrace(); // 자세한 에러 메시지 및 에러 발생 줄 표시 ★ 개발자가 사용해야 할 메소드
			
		} catch (ArithmeticException e) {
			// unchecked exception
			// 숫자를 0으로 나누는 등 연산이 불가능하는 경우 발생
			System.out.println("0으로 나눌수는 없습니다.");
			
		} catch (Exception e) {
			// Exception : 모든 예외를 catch 할 수 있다.
			// 여러 예외를 catch하는 경우에는 다른 예외 클래스의 상위 클래스이므로
			// 		가장 마지막에 위치해야 한다.
			e.printStackTrace();
		}
		
		System.out.println("end...");

	}
}​

package ex0727;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Ex105_exception {
	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int a, b, c;
		
		try {
			System.out.print("첫번째 수 ? ");
			a = Integer.parseInt(br.readLine());
			
			System.out.print("두번째 수 ? ");
			b = Integer.parseInt(br.readLine());
			
			c = a / b;
			
			System.out.println(a + "/" + b + "=" + c);
		
		} catch (Exception e) {
			// Exception : 모든 예외를 catch 할 수 있다.
			// 예외별로 예외를 분리할 수 없다.
			// 정모르겠으면 이렇게라도 예외처리를 해라.
			e.printStackTrace();
		} 
		
		System.out.println("end...");

	}
}

예외처리

checked exception 과 uncheck exception로 나뉨.

checked exception은 오류를 잡지 않으면 컴파일 오류가 나타난다.

uncheck exception은 잡지 않아도 되지만 런타임 오류가 생길 수 있다. 생길 수 있는 오류들의 경우를 생각해서 catch로 잡고 (세세한 오류먼저) 마지막에 모든 오류를 잡는 exception을 넣어주는 것이 좋은 코드이다. 

package ex0727;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Ex109_exception {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a, b, c;

		try {
			System.out.print("두 수 ? ");
			a = sc.nextInt();
			b = sc.nextInt();
			c = a / b;
			System.out.println(a + "/" + b + "=" + c);
		} catch (InputMismatchException e) {
			// InputMismatchException : Scanner의 nextInt() 등에서 숫자가 아닌 문자열을 입력하면
				// 발생하는 unchecked exception
			System.out.println("숫자만 입력 가능합니다.");
		} catch (ArithmeticException e) {
			System.out.println("연산이 불가능 합니다.");
		} finally {
			// finally 블럭에서 일반적으로 사용한 resource를 close한다.
			sc.close();
		}

		System.out.println("end...");
	}
}

 

'쌍용강북교육센터 > 7월' 카테고리의 다른 글

0727_Ex110_tryResource  (0) 2021.07.27
0727_Ex106~Ex108_finally  (0) 2021.07.27
0726_Ex07_interface : 인터페이스  (0) 2021.07.26
0726_Ex06_interface : 인터페이스  (0) 2021.07.26
0726_Ex05_interface : 인터페이스  (0) 2021.07.26

+ Recent posts