즐거운 자바(4)

지환·2023년 8월 5일
0

JAVA

목록 보기
4/39

출처 |
https://www.youtube.com/watch?v=iVX4uGfGXck&list=PLHpaQi-LiUCx-vcbcnpU5Tzv2X99WCowN

주석문

javaDoc

예외 처리하기

1-Exam

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은 컴파일시 오류가 나고, 꼭 처리를 해주어야한다.

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 처리를 꼭 해주어야 한다.
}

Enum

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안에 상수를 나타내는 값을 적는다. 보통 모두 대문자로 표현을 하는데, 상수와 상수는 컴마로 구분한다.

Enum 타입의 특징

  • Enum은 타입에 대해 안전하다. 미리 정의된 Enum 변수안의 상수만을 대입할 수 있다.
Day day = Day.SUNDAY; 와 같은 코드는 되지만

Day day = 5; 와 같은 코드는 사용할 수 없다.
  • switch문에서 사용 가능하다.
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 생성자와 값 지정하기

  • Enum 생성자를 가질 수 있다. 단 생성자는 private해야한다.

  • Enum 생성자는 내부에서만 호출가능하다.

Gender 코드

package Enum;


public enum Gender
{
    MALE("XY"),
    FEMALE("XX");
    private String chr;

    private  Gender(String chr)
    {
        this.chr = chr;
    }
}

GenderMain 코드

package Enum;

public class GenderTest {
    public static void main(String[] args) {
        Gender gender = Gender.MALE;
        System.out.println(gender);
    }
}

Enum에 메소드와 변수 선언

  • 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

Enum값끼리 비교할 때는 == 를 사용한다.

Day day1 = Day.MONDAY;
Day day2 = Day.MONDAY;

if(day1 == day2) {
	System.out.println("같은 요일입니다.");
}

EnumMap

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);
  • EnumMap 객체를 생성하는데, Key로 사용할 Enum 타입 Day.class를 생성자 인자로 전달하였다.
emap.put(Day.SUNDAY, "일요일은 잠자는 것이 최고!");
emap.put(Day.FRIDAY, "불금!!");
emap.put(Day.MONDAY, "월요병.");
  • 키(key)값으로 Enum타입 Day에서 정의한 상수를 사용하였다.
System.out.println(emap.get(Day.SUNDAY));
  • Day.SUNDAY 를 키값으로 하는 값을 출력한다.

실행결과

일요일은 잠자는 것이 최고

EnumSet

  • EnumSet은 Enum 상수를 Set자료구조로 다루기 위한 유용한 메소드
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은 인터페이스를 구현하고, 해당 인터페이스를 오버라이딩하여 구현할 수 있다.

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
	}
}

Enum은 추상메소드를 가질 수 있다.

  • Enum은 추상메소드를 가질 수 있다. 추상 메소드를 가질 경우엔 상수를 정의할 때 추상메소드를 함께 구현해 줘야한다.
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();
  • country에 Country.KOREA 상수를 대입하기 때문에 KOREA 상수에서 구현된 print() 메소드가 사용된다.

실행결과

대한민국

그 밖의 특징들

Enum은 그외에도 다음과 같은 특징을 가지고 있다.

  • Enum 객체는 Enum 상수가 처음 호출되거나 참조될 때 생성된다.
  • Enum은 Serializable과 Comparable 인터페이스를 이미 구현하고 있다.
profile
아는만큼보인다.

0개의 댓글