전체 글 (65) 썸네일형 리스트형 catch문의 e 자바에서 예외를 다루다 보면, catch 문에서 e가 계속 목격된다. catch 문의 변수 e는 인스턴스이다. 예외들의 인스턴스에는 예외가 발생한 원인, 어디서 발생했는지 등에 대한 정보들이 담겨 있다. 이것들을 이용하면 프로그램의 어디서 왜 예외가 발생했는지 손쉽게 알 수 있다. public class ExceptionApp2 { public static void main(String[] args) { System.out.println(1); try { System.out.println(2); System.out.println(2 / 0); System.out.println(3); } catch (ArithmeticException e) { System.out.println("잘못된 계산이네요." + .. 예외의 우선순위 자바의 예외도 클래스로 구현되어 있다. ArithmeticException도 Java API 문서를 참고하면, RuntimeException으로부터 상속받은 클래스라는 것을 알 수 있다. 또한 RuntimeException은 Exception 클래스로부터 상속받은 클래스이다. 그래서 여러 예외가 있더라도 Exception 클래스를 이용해서 포괄적으로 처리할 수 있다. public class ExceptionApp2 { public static void main(String[] args) { System.out.println(1); int[] scores = {10, 20, 30}; try { System.out.println(2); System.out.println(scores[3]); System.ou.. 예외 처리 (Exception Handling) 예외가 발생함에도 불구하고 그대로 프로그램을 완성시켰다면 사용자 입장에서는 잘못된 값만 넣어버리면 뻗어버리는, 언제 뻗을지 모르는 불안한 프로그램이라고 생각할 것이다. 예외는 발생할지라도 그 뒤의 작업을 실행하기 위해서는 예외 처리(Exception Handling)를 해야 한다. try catch 문을 이용해서 예외를 처리하면 어떤 값을 넣는 경우에도 끝까지 실행되는 튼튼한 프로그램이 된다. 가령, 이전에 알아봤던 2를 0으로 나누는 것의 경우, public class ExceptionApp { public static void main(String[] args) { System.out.println(1); try { System.out.println(2/0); } catch (ArithmeticExc.. 예외 (Exception) 자바에서는 Error와 Exception을 구분한다. 오류(Error)는 숙명과도 같은 것이다. 애초에 문법이 잘못되어서 컴파일부터 오류가 발생할 수도 있고, 우리가 만든 자바 애플리케이션이 동작하는 환경에서 무언가 문제가 생겨서 발생할 수도 있다. 예를 들어 메모리가 부족하다든지, 운영체제가 문제가 생겨 프로그램이 정지됐다든지 등의 경우가 있다. 예외(Exception)는 우리가 짠 코드가 우리가 의도한 것과는 다른 상황에 직면했을 때를 지칭하는 것이다. 가령, 파일을 읽으려 했는데 파일이 없다거나, 예상하지 못한 값을 사용자가 입력했을 때 등이 있다. 개발자는 어떤 기능을 하는 코드를 의도를 가지고 만들게 되는데, 모든 사람이 그 의도에 맞춰서 행동하는 것은 불가능하기 때문에 그 예외 케이스에 대해 .. 다형성 (Polymorphism) 클래스의 인스턴스를 변수로 선언할 때, 해당 클래스의 데이터 타입으로 선언하지 않고, 부모 클래스나 인터페이스를 데이터 타입으로 선언할 수도 있다. 이렇게 객체의 타입이 부모 클래스, 인터페이스, 자식 클래스 등 여러 형태인데도 인스턴스로 만든 객체(자식 클래스의 인스턴스)와 같이 행동하는 것을 다형성(polymorphism)이라고 한다. 하나의 클래스가 여러 가지의 얼굴을 가지게 하는 것이 다형성이다. interface Calculable { double PI = 3.14; int sum(int v1, int v2); } interface Printable { void print(); } class RealCal implements Calculable, Printable { public int sum(.. 인터페이스 (Interface) 인터페이스(Interface)를 이용하면 앞으로 만들 클래스의 규격을 선언할 수 있다. interface Calculable { int sum(int v1, int v2); } class RealCal implements Calculable { // 오류 발생 } public class InterfaceApp { public static void main(String[] args) { RealCal c = new RealCal(); System.out.println(c.sum(2, 1)); } } 위 코드를 보면, Calculable 인터페이스를 implements 하는 RealCal 클래스가, Calculable 인터페이스가 규제하고 있는 형태를 정확하게 엄수하고 있지 않기 때문에 컴파일조차 안 된다... 상속과 생성자 자식 클래스는 부모 클래스의 모든 것들을 상속 받는다. 생성자(Constructor)도 마찬가지이다. 부모 클래스에 생성자가 있는 경우에, 자식 클래스에 이미 해당하는 생성자가 만들어져 있다면 그것을 호출한다. 그렇지 않다면 암묵적으로 부모 클래스의 생성자(super())를 호출하게 된다. 하지만 상속관계에 있는 클래스의 생성자에 기본 생성자(인자가 전혀 없는 생성자)가 아닌 인자가 포함된 생성자를 사용하는 경우 주의해야 한다. class Calculator { int v1, v2; Calculator(int v1, int v2) { System.out.println("Calculator init!"); this.v1 = v1; this.v2 = v2; } } // Compile Error class C.. this, super this는 인스턴스를 가리키는 키워드이다. 이와 비슷하게 부모 클래스를 가리키는 super라는 키워드도 존재한다. 자식 클래스에서 super을 이용하여 접근 권한이 부여된 부모 클래스의 변수와 메소드에 접근할 수 있다. class Calculator { public int sum(int v1, int v2) { return v1 + v2; } // Overloading public int sum(int v1, int v2, int v3) { return this.sum(v1, v2) + v3;// this 키워드 사용하여 계승, 발전 } } class Calculator2 extends Calculator { public int minus(int v1, int v2) { return v1 - v2; } .. 이전 1 2 3 4 5 6 7 ··· 9 다음