1. 예외 처리하기
⑴ 예외 유형
- java.lang.Throwable 클래스가 모든 예외의 클래스의 부모 클래스임.
- Error, Exception, RuntimeException 예외 클래스의 세가지 유형
- Error 클래스 : 예외 상황으로 부터 회복이 프로그램 내에서는 어렵거나 불가능한 예외상황을 나타내는 예외 클래스의 부모클래스
==> OutOfMemoryError, StackOverflowError, AWTError, LinkageError
==> 예외처리가 별도로 필요하지 않는다. - Exception 클래스 : 대부분의 프로그램이 처리해야 할 예외 사항
==> ClassNotFoundException, IOException, InterruptedException,DataFormatException
==> RuntimeException의 자식 클래스들을 제외한 모든 예외 class들은
반드시 명시적으로 예외 처리 해야 함. - RuntimeException 클래스 : JVM이 정상적으로 실행 도중에 발생할 수 있는 예외들의 부모 클래스임.
반드시 처리할 필요는 없다.
==> IllegalArgumentException, IndexOutOfBoundsException,NullPointerException, SecurityException
==> 위 경우 예외가 발생했을 때 예외 구문 처리가 없으면 기본 동작으로 표준 에러 스트림으로 예외 내용을 출력하면서 프로세서 실행을 중단시킨다.
⑵ 예외 처리하기
- try. . .catch
구문메소드들은 선언할 때 throws라는 예약어를 사용하여 예외가 발생 가능하므로 예외 처리해야 함을 알린다.
getMessage(); ==> Throwable클래스로 부터 상속받고 예외의 메시지를 문자열로 되돌려 준다. - finally 구문
파일 입출력이나 네트워크 통신의 경우 자주 사용하는 것.
예외가 발생하든 발생하지 않든 반드시 수행해야 할 명령들을 위해 finally구문이 고안 되었다. - 사용자 정의 예외 클래스
예외 클래스를 상속 받아서 만들면 된다.
고려할 사항
: 일반 예외 클래스를 상속할 경우 모든 예외 처리를 해야하며, 런타임 예외 클래스를 상속할 경우에는
반드시 예외 처리를 할 필요는 없다.
2. 다형성(Polymorphism)
⑴ 객체 유형의 다형성
동일한 변수가 같은 부모 클래스를 가진 서로 다른 유형의 객체를 표현할 수 있다. 이때 메소드는 자식의 것을 호출하게 된다.
==>내포 다형성(inclusion polymorphism)instanceof 연산자.
<변수> instanceof <클래스 이름>
==>내포 다형성(inclusion polymorphism)instanceof 연산자.
<변수> instanceof <클래스 이름>
⑵ 메소드 오버로드(method overloading)
==> 연산 다형성(operation polymorphism)의 항 형태.
==> 생성자에도 적용된다.
- int work(), String work() ==> 컴파일 에러를 발생 시킨다.
메소드는 메소드 이름, 인자의 갯수, 각 위치별 인자의 유형으로 구분하기 때문에
반환 유형이 다른 메소드를 정의할 수 없다.
- Override 와 Hide
- method Override : 자식클래스가 부모로 부터 상속받은 메소드를 재정의 하는 것
- Hide : 자식 클래스에서 필드가 재정의되면 부모 클래스의 동일한 이름을 가진 필드를 숨기는 것.
- 자바언어가 원래 객체의 유형을 기억하고 있어서 형 변환되더라도 원래 객체 유형의 해당 메소드를 호출하는 가상 함수(Virtual function)방식을 사용하기 때문
- 필드의 경우 자식 클래스에서 재정의할 경우 항상 필드는 감춤이 되지만,
메소드의 경우에는 3가지 경우 가능성이 있다. - 인스턴스 메소드를 재정의하면 메소드 오버라이드가 되고
- static 메소드(static 메소드는 클래스 메소드라고도)인 경우에는 메소드 감춤이 된다.
- 부모 클래스의 메소드가 abstract였다면 자식 클래스에서 동일한 메소드를 재정한것은 인터페이스 메소드를 정의하는 경우처럼 구현(implement)이라고 부른다.
3. final 와 abstract
⑴ final
- final 필드 : final 지시자가 필드 앞에 올 경우에는 상수를 가르킨다.
ex) public final static Color black ; - final 메소드 : final 지시자가 메소드 앞에 오게 되면 class 상속 할때 자식 클래스에서 이 메소드는 override 할 수 없다.
- final 클래스 : final 로 선언된 class는 자식 클래스를 가질 수 없다. 즉 클래스 상속 계층 구조에서 끝을 나타나게 된다.
⑵ abstract
- abstract 메소드 : 몸체를 구현하지 않는다.--> abstract 메소드를 가지고 있으면 클래스도 미완이므로 abstract로 선언 되어야함.
ex)public static void doSomething(); - abstract 클래스: abstract 클래스로 선언되면 미완의 클래스로 간주 되므로 인스턴스화 할 수 없고 반드시 상속 해서 사용 해야 한다.
상속 받는 경우 반드시 abstract 메소드를 모두 구현 해야한다.(그렇치 않으면 abstract 클래스가된다.)
4. String 클래스 사용하기
⑴ String 클래스의 특권
- " "에 의한 즉석 인스턴스화예) String a = "abc";
String b = new String("abc");
char value[] = {'a','b','c'};
String c = new String(value); - String 연산자 '+'예) System.out.println(100+99+"Hello"); ==> 199Hello
System.out.println("Hello"+100+99); ==> Hello10099 - 이유 + 연산자는 왼쪽 두 항부터 차례로 일어 나므로
- + 연산자 양쪽이 String 이 아닌 경우 ==> 컴파일 에러가 발생한다.
- 한쪽은 String이고 다른 한쪽은 String 객체가 아닌 경우 toString()메소드가 실행되어 객체의 16진수값이 나타난다.
⑵ String , StringBuffer 클래스 메소드
- String 객체는 변경 할 수 없기 때문이다.
- StringBuffer 는 변경 가능한 클래스 이다.