2013년 9월 12일 목요일

Java의 예외, 다향성,String 설명

예외 , 다형성, String

1. 예외 처리하기

⑴ 예외 유형
  • java.lang.Throwable 클래스가 모든 예외의 클래스의 부모 클래스임.
  • Error, Exception, RuntimeException 예외 클래스의 세가지 유형

  1. Error 클래스 : 예외 상황으로 부터 회복이 프로그램 내에서는 어렵거나 불가능한 예외상황을 나타내는 예외 클래스의 부모클래스
    ==> OutOfMemoryError, StackOverflowError, AWTError, LinkageError
    ==> 예외처리가 별도로 필요하지 않는다.
  2. Exception 클래스 : 대부분의 프로그램이 처리해야 할 예외 사항
    ==> ClassNotFoundException, IOException, InterruptedException,DataFormatException
    ==> RuntimeException의 자식 클래스들을 제외한 모든 예외 class들은
    반드시 명시적으로 예외 처리 해야 함.
  3. RuntimeException 클래스 : JVM이 정상적으로 실행 도중에 발생할 수 있는 예외들의 부모 클래스임.
    반드시 처리할 필요는 없다.
    ==> IllegalArgumentException, IndexOutOfBoundsException,NullPointerException, SecurityException
    ==> 위 경우 예외가 발생했을 때 예외 구문 처리가 없으면 기본 동작으로 표준 에러 스트림으로 예외 내용을 출력하면서 프로세서 실행을 중단시킨다.

⑵  예외 처리하기
  1. try. . .catch
    구문메소드들은 선언할 때 throws라는 예약어를 사용하여 예외가 발생 가능하므로 예외 처리해야 함을 알린다.
    getMessage();  ==>  Throwable클래스로 부터 상속받고 예외의 메시지를 문자열로 되돌려 준다.
  2. finally 구문
    파일 입출력이나  네트워크 통신의 경우 자주 사용하는 것.
    예외가 발생하든 발생하지 않든 반드시 수행해야 할 명령들을 위해 finally구문이 고안 되었다.
  3. 사용자 정의 예외 클래스
    예외 클래스를 상속 받아서 만들면 된다.
    고려할 사항
    : 일반 예외 클래스를 상속할 경우 모든 예외 처리를 해야하며, 런타임 예외 클래스를 상속할 경우에는
    반드시 예외 처리를 할 필요는 없다.

2. 다형성(Polymorphism)

⑴ 객체 유형의 다형성
동일한 변수가 같은 부모 클래스를 가진 서로 다른 유형의 객체를 표현할 수 있다. 이때 메소드는        자식의 것을 호출하게 된다.
==>내포 다형성(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
  1. final 필드 : final 지시자가 필드 앞에 올 경우에는 상수를 가르킨다.
    ex) public final static Color black ;
  2. final 메소드 : final 지시자가 메소드 앞에 오게 되면 class 상속 할때 자식 클래스에서 이 메소드는 override 할 수 없다.
  3. final 클래스 : final 로 선언된 class는 자식 클래스를 가질 수 없다. 즉 클래스 상속 계층 구조에서 끝을 나타나게 된다.

⑵ abstract

  1. abstract 메소드 : 몸체를 구현하지 않는다.--> abstract 메소드를 가지고 있으면 클래스도 미완이므로 abstract로 선언 되어야함.
    ex)public static void doSomething();
  2. abstract 클래스: abstract 클래스로 선언되면 미완의 클래스로 간주 되므로 인스턴스화 할 수 없고 반드시              상속 해서 사용 해야 한다.
    상속 받는 경우 반드시 abstract 메소드를 모두 구현 해야한다.(그렇치 않으면 abstract 클래스가된다.)

4. String 클래스 사용하기

⑴ String 클래스의 특권
  1. " "에 의한 즉석 인스턴스화예) String a = "abc";
    String b = new String("abc");
    char value[] = {'a','b','c'};
    String c = new String(value);
  2. String 연산자 '+'예) System.out.println(100+99+"Hello"); ==> 199Hello
    System.out.println("Hello"+100+99); ==> Hello10099
    • 이유 + 연산자는 왼쪽 두 항부터 차례로 일어 나므로
    • + 연산자 양쪽이 String 이 아닌 경우 ==> 컴파일 에러가 발생한다.
    • 한쪽은 String이고 다른 한쪽은 String 객체가 아닌 경우 toString()메소드가 실행되어 객체의 16진수값이 나타난다.
⑵  String , StringBuffer 클래스 메소드

  • String 객체는 변경 할 수 없기 때문이다.
  • StringBuffer 는 변경 가능한 클래스 이다.

댓글 없음: