출처 |
https://www.youtube.com/watch?v=iVX4uGfGXck&list=PLHpaQi-LiUCx-vcbcnpU5Tzv2X99WCowN
public class Exception1 {
public static void main(String[] args) {
ExceptionObj1 exobj = new ExceptionObj1();
int value = exobj.divide(10,0);
System.out.println(value);
}
class ExceptionObj1{
public int divide(int i , int k)
{
int value = 0;
value = i / k;
return value;
}
}
}
public class Exception1 {
public static void main(String[] args) {
ExceptionObj1 exobj = new ExceptionObj1();
int value = exobj.divide(10,0);
System.out.println(value);
}
class ExceptionObj1{
public int divide(int i , int k)
{
int value = 0;
try{
value = i / k;
}catch(ArithmeticException ex){
System.out.println("0으로 나눌 수 없습니다.");
System.out.println(ex.toString());
}
return value;
}
}
}
public class Exception1 {
public static void main(String[] args) {
ExceptionObj1 exobj = new ExceptionObj1();
try{
int value = exobj.divide(10,0);
System.out.println(value);
}catch(ArithmeticException ex)
{
System.out.println("0으로 나눌 수 없습니다.");
}
}
class ExceptionObj1{
/**
*
* @param i
* @param k
* @return
* @throws ArithmeticException
*/
public int divide(int i , int k) throws ArithmeticException
{
int value = 0;
value = i / k;
return value;
}
}
}
RuntimeException을 상속 받고 있으면 모두 다 RuntimeException 이라고 한다. 그리고 컴파일시 Exception 하지 않아도 잘 작동된다.
ArithmeticException 도 RuntimeException이다.
IOException을 상속 받고 있는 것들이 Checked Exception이라고 본다.
RuntimeException vs CheckedException의 차이는?!
실행 시 오류가 발생되어 죽게된다. CheckedException은 컴파일시 오류가 나고, 꼭 처리를 해주어야한다.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Exception4 {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("Exception4.java");
}
// 반드시 Exception 처리를 꼭 해주어야 한다.
}
public final static int sunday = 0;
public final static int MONDAY = 0;
Sunday라는 변수는 jVM에서 해당 클래스를 읽고 인식하는 순간 static이 올라간다. 딱 한 번!
이런 형식을 상수
라고 한다.
package Enum;
public enum Day
{
SUNDAY,
MONDAY,
TUESDAY,
WEDNEWDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Day day = Day.SUNDAY; 와 같은 코드는 되지만
Day day = 5; 와 같은 코드는 사용할 수 없다.
package Enum;
public class EnumSwitch {
public static void main(String[] args) {
Day day = Day.SUNDAY;
switch(day)
{
case SUNDAY:
System.out.println("일요일입니다.");
break;
case MONDAY :
System.out.println("월요일입니다.");
break;
default: :
System.out.println("그 밖의 요일");
}
}
}
실행결과
일요일입니다.
day가 어떤 상수냐에 따라서 알맞은 case 부분이 실행된다.
이때 조심해야 할 것은 case 다음에는 Day가 가지고 있는 상수의 이름이 나와야 한다는 것이다.
case 다음에 Day.SUNDAY라고 사용하면 컴파일 오류가 발생한다.
Enum 생성자와 값 지정하기
Enum 생성자를 가질 수 있다. 단 생성자는 private해야한다.
Enum 생성자는 내부에서만 호출가능하다.
package Enum;
public enum Gender
{
MALE("XY"),
FEMALE("XX");
private String chr;
private Gender(String chr)
{
this.chr = chr;
}
}
package Enum;
public class GenderTest {
public static void main(String[] args) {
Gender gender = Gender.MALE;
System.out.println(gender);
}
}
Enum안에 선언된 메소드나 변수를 가질 수 있다.
또한 Object가 가지고 있는 메소드를 오버라이딩 할 수 있다.
Gender Enum을 생성할 때 chr 필드를 작성했다.
이번엔 Gender Enum에 Object가 가지고 있는 toString()메소드를 오버라이딩 한다.
package EnumType;
// enum 타입
public enum Gender {
MALE("XY");
FEMALE("XX");
private String chromosome; // 염색체
private Gender(String chromosome) {
this.chromosome = chromosome;
}
// toString() 메소드를 오버라이딩해서 enum타입을 출력할 수 있다.
@Override
public String toString() {
return "Gender{"+"chromosome='"+chromosome+''\'+'}';
}
public void print() {
system.println("염색체 정보 : "+chromsome);
}
}
package EnumType;
public class GenderTest {
public static void main(String[] args) {
Gender gender = Gender.MALE;
System.out.println(gender);
gender.print();
}
}
----- 실행 결과 -------
Gender{chromosome='XY'}
염색체 정보 : XY
Day day1 = Day.MONDAY;
Day day2 = Day.MONDAY;
if(day1 == day2) {
System.out.println("같은 요일입니다.");
}
EnumMap은 Enum타입을 키(key)로 사용할 수 있도록 도와주는 클래스이다
package EnumType;
// EnumMap은 키값을 Enum 타입만 가질 수 있음
import java.util.EnumMap;
public class EnumMapTest {
public static void main(String[] args) {
EnumMap emap = new EnumMap(Day.class);
emap.put(Day.SUNDAY, "일요일은 잠자는 것이 최고!");
emap.put(Day.FRIDAY, "불금!!");
emap.put(Day.MONDAY, "월요병.");
System.out.println(emap.get(Day.SUNDAY));
}
}
EnumMap emap = new EnumMap(Day.class);
emap.put(Day.SUNDAY, "일요일은 잠자는 것이 최고!");
emap.put(Day.FRIDAY, "불금!!");
emap.put(Day.MONDAY, "월요병.");
System.out.println(emap.get(Day.SUNDAY));
실행결과
일요일은 잠자는 것이 최고
package EnumType;
import java.util.EnumSet;
import java.util.Iterator;
public class EnumSetTest {
public static void main(String[] args) {
// Day가 가지고 있는 모든 상수는 Enumset에다가 넣어줌
EnumSet eset = EnumSet.allOf(Day.class);
Iterator<Day> dayIter = eset.iterator();
// hasNext는 꺼낼 값이 있으면 true를 반환함
while (dayIter.hasNext()) {
Day day = dayIter.next();
System.out.println(day);
}
System.out.println("------------------------------------------");
// 월요일부터 수요일까지
EnumSet eset2 = EnumSet.range(Day.MONDAY, Day.WEDNESDAY);
Iterator<Day> dayIter2 = eset2.iterator();
while (dayIter2.hasNext()) {
Day day = dayIter2.next();
System.out.println(day);
}
}
}
Enum은 인터페이스를 구현하고, 해당 인터페이스를 오버라이딩하여 구현할 수 있다.
package EnumType;
public interface Printer {
public void print();
}
package EnumType;
public enum Color implements Printer {
RED("FF0000");
GREEN("00FF00");
BLUE("0000FF");
private String rgb;
private Color(String rgb) {
this.rgb = rgb;
}
@Override
public void print() {
System.out.println("rgb : "+rgb);
}
}
package EnumType;
public class ColorTest {
public static void main(String[] args){
Color color = Color.RED;
color.print(); // rgb : FF0000
}
}
package EnumType;
public enum Country {
KOREA {
public void print() {
System.out.println("대한민국");
}
},
JAPAN {
public void print() {
System.out.println("일본");
}
},
USA {
public void print() {
System.out.println("미국");
}
};
public abstract void print();
}
package EnumType;
public class CountryTest {
public static void main(String[] args) {
Country country = Country.KOREA;
country.print();
}
}
country.print();
실행결과
대한민국
Enum은 그외에도 다음과 같은 특징을 가지고 있다.