ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 16일차 - Object 클래스, 인터페이스, 예외 처리
    AI 솔루션 개발자과정(Java, Python) 2022. 10. 31. 17:32

    Object 클래스와 final 선언  그리고 @Override

     

    모든 클래스는 Object 클래스를 상속한다.

    이는 디폴트 생성자에 의해 상속을 하지 않아도 자동으로 상속한다.

    class Myclass
        // 상속하는 클래스가 없다면
        // 컴파일러에 의해 다음과 같이 java.lang.Object 클래스를 상속하게 코드가 구성된다.
    class Myclass extends Object
        // 다른 클래스를 상속할 때는 Object 클래스를 직접 상속하지 못한다.
        // 그러나, 간접적으로 Object 클래스를 상속하는 클래스를 상속하는 형태로 Object 클래스를 상속한다.

     

    클래스와 메소드의 final 선언

    final을 붙인 클래스는 다른 클래스가 상속 할 수 없다.

    final을 붙은 메소드는 다른 클래스에서 오버라이딩 할 수 없다.

     

    @override

    상위 클래스의 메소드를 오버라이딩 하는 것이 목적이라는 선언!
    오버라이딩을 하는 형태가 아니면 컴파일러가 오류 메시지 전달.

     

     

    인터페이스의 기본과 그 의미

    인터페이스 : 규약 혹은 접점.

    user interface = UI

     

    클래스를 기반으로 상속할 때는  일단 부모 클래스가 완성되어 있어야 한다.

    인터페이스는 완성되지 않은, 몸체가 없는 추상적인 메소드를 포함한다. 

    인터페이스는 미완성 메소드를 포함하는 부모 클래스의 역할을 한다.

    따라서, 참조 변수를 만들 수 있다.

    하지만, 인스턴스를 생성할 수 없다.

     

    또한 자기 자신을 상속할 수 없다.

     

    구현하는 메소드와 추상 메소드 사이에도 오버라이딩 관계가 성립된다.

     

    클래스는 상속과 구현을 동시에 할 수 있다.

    상속은 하나만 할 수 있지만, 구현은 여러개 할 수 있다.

     

    완성된 인터페이스추상메소드가 추가될 경우, 구현한 클래스는 에러가 유발된다.

    이를 해결하기 위해 추상메소드를 포함하는 인터페이스를 새로운 인터페이스에 상속하여 문제 해결 가능하다. 이 경우, 나머지 클래스를 수정할 필요가 없다.

    하지만 새로운 인터페이스를 구현하는 작업을 진행해야한다.

     

    디폴트 메소드 : 이미 구현되고 있는 인터페이스에 오류 없이 기능을 추가하고 싶다면 추상 메소드 대신 디폴드 메소드를 사용한다.

    디폴트 메소드로 이 문제를 해결하면, 인터페이스의 수가 더이상 늘지 않는다.

     

     

    인터페이스에도 static 메소드를 정의할 수 있다.

    그리고 인터페이스의 static 메소드의 호출방법은 클래스와 같다.

     

    인터페이스를 대상으로 instanseof 키워드를 사용할 수 있다.

     

     

    인터페이스의 또다른 용도 : Marker 인터페이스

    클래스에 특정 표시를 해 두기 위한 목적으로 정의된 인터페이스를 Marker 인터페이스 라고 한다. 마커 인터페이스에는 구현해야 할 메소드가 없는 경우가 흔하다.

    실질적으로 없어도 되지만, 있으면 좀 더 클래스의 의미 또는 세부 기능이 명확해진다.

     

     

    추상 클래스

    하나 이상의 추상 메소드를 지니는 클래스를 가르켜 추상 클래스라고 한다.

    추상 클래스를 대상으로는 인스턴스 생성이 불가능하다. 참조 변수는 선언 가능하다.

    인터페이스의 대체품이다.

     

    추상 클래스의 규칙 :

    하나 이상의 추상 메소드를 포함시키기.

     

     

    자바의 예외 처리의 기본

     

    예외(Exception)

     ‘예외적인 상황’ 줄여서 예외’ 한다.

     단순한 문법 오류가 아닌 실행 중간에 발생하는 ‘정상적이지 않은 상황’ 뜻한다.

     

     

    예외처리

     예외 상황에 대한 처리를 의미한다.

     자바는 예외처리 메커니즘을 제공한다.

     

    자바의 기본 예외처리 메커니즘은

    문제가 발생한 지점에 대한 정보 출력과

    프로그램 종료이다!

     

    예외에 대한 처리 방법은 프로그래머가 결정할 수 있다.

     

    예외 상황을 알리기 위한 클래스

    java.lang.ArithmeticException

      → 수학 연산에서의 오류 상황을 의미하는 예외 클래스

    java.util.InputMismatchException

      → 클래스 Scanner를 통한 값의 입력에서의 오류 상황을 의미하는 예외 클래스

     

    예외를 처리하기 위한 try ~ catch 키워드

    예외의 처리를 위한 코드를 별도로 구분하기 위해 디자인된 예외처리 메커니즘이 try ~ catch 이다.

     

    try 구문 안에서 예외가 발생하면 바로 catch로 넘어가고, catch 구문 실행 후 예외처리 구문이 완전히 종료된다.

    try 구문 안에서 예외가 발생하지 않으면 try 구문 실행 후 예외처리 구문이 완전히 종료된다.

     

    catch를 2번 사용하여 둘 이상의 예외 처리를 할 수 있다.

    논리 연산자를 이용하여 조건을 설정할 수 있다.

     

    Throwable 클래스

    java.lang.Throwable 클래스

      모든 예외 클래스의 최상위 클래스: 물론 ThrowableObject를 상속한다.

     

    Throwable 클래스의 메소드 둘

      public String getMessage()  : 예외의 원인을 담고 있는 문자열을 반환

      public void printStackTrace() : 예외가 발생한 위치와 호출된 메소드의 정보를 출력

     

     

     

    ClassCastException

    클래스 간 명시적 형 변환은 참조하고 있는 인스턴스가 변할 수 있는 경우에만 가능하다.

     

    NullPointerException

     

    예외 클래스의 구분

    • Error 클래스를 상속하는 예외 클래스
    • Exception 클래스를 상속하는 예외 클래스
    • RuntimeException 클래스를 상속하는 예외 클래스

        → RuntimeException 클래스는 Exception 클래스를 상속한다.

     

    Error 클래스를 상속하는 예외 클래스들의 특성

    Error 클래스를 상속하는 예외 클래스의 예외 상황은 시스템 오류 수준의 예외 상황으로 프로그램 내에서 처리 할 수 있는 수준의 예외가 아니다.

      ex) VirtualMachineError   가상머신에 심각한 오류 발생
          IOError   입출력 관련해서 코드 수준 복구가 불가능한 오류 발생

     

    RuntimeException 클래스를 상속하는 예외 클래스들의 특성

    코드 오류로 발생하는 경우가 대부분이다.  따라서 이 유형의 예외 발생시 코드의 수정을 고려해야 한다.

      ex) ArithmeticException
          ClassCastException
          IndexOutOfBoundsException
          NegativeArraySizeException    배열 생성시 길이를 음수로 지정하는 예외의 발생
          NullPointerException
          ArrayStoreException        배열에 적절치 않은 인스턴스를 저장하는 예외의 발생

     

    Exception 클래스를 상속하는 예외 클래스들의 특성

    코드의 문법적 오류가 아닌, 프로그램 실행 과정에서 발생하는 예외적 상황을 표현하기 위한 클래스들이다.
    따라서 예외의 처리를 어떻게 할 것인지 반드시 명시해 주어야 한다.

       ex) java.io.IOException       입출력 관련 예외 상황을 표현하는 예외 클래스 

    메소드의 throws절 선언을 통해 예외의 처리를 넘길 수 있다.

    throw : 예외를 발생시킨다.

    throws : 예외를 전가한다.

     

     

    finally 구문

    실행의 흐름이 try 구문 안에 들어왔을 때 반드시 실행해야 하는 문장을 finally 구문에 둘 수 있다.

    그러나, finally 보다 멋진 대안이 등장했다.

     

    try-with-resources

     

     

    자바의 메모리 모델과 Object 클래스

    운영체제 입장에서 자바 가상머신은 그냥 프로그램의 하나일 뿐이다.

     

    운영체제가 일반 프로그램에게 4G의 메모리를 할당한다면, 자바 가상머신에게도 4G의 메모리를 할당한다.

    자바 프로그램이 두 개 실행되면, 가상머신도 두 개가 실행된다.

    이는 메모장을 두 번 띄우면 두 개의 메모장 프로그램이 실행되는 이치와 같다.

     

     

    자바 가상머신의 메모리 모델

    메소드 영역 : 메소드의 바이트 코드, static 변수
    스택 영역 : 지역 변수, 매개 변수
    힙 영역 : 인스턴스

    메모리 공간 활용의 효율성을 높이기 위해 메모리 공간을 이렇듯 세 개의 영역으로 구분하였다.

     

    메소드 영역에 저장된 내용은 프로그램 종료 시 소멸된다.

    스택 영역에 저장된 변수는 해당 변수가 선언된 메소드 종료 시 소멸된다.

    힙 영역에 아무 쓸모 없는 인스턴스가 발생하게 되면, 자바의 가비지 컬렉터가 이를 탐지하여 가비지 컬렉션에 모아둔다.

    그리고 나중에 이를 소멸시켜 버린다. 메모리 낭비를 최소화 시켜준다.

    먼저 입력된 것은 마지막에 소멸한다.  반대로 마지막에 입력된 것은 가장 먼저 소멸한다.

     

     

    자바 가상머신의 인스턴스 소멸 시기

    가비지 컬렉션에 들어갔다고 해서 즉각 소멸되지는 않는다.

    가비지 소멸 또한 프로그램에 부하를 주는 일이므로, 가비지 컬렉터는 자체적인 알고리즘에 의해 적절한 시기에 가비지 인스턴스를 소멸시킨다.  따라서 정확하게 그 타이밍을 언제라고 명시할 순 없다.

    가비지 컬렉션에 인스턴스가 남아있다고 해도, 프로그램이 소멸되면 해당 인스턴스들은 알아서 함께 소멸된다.

     

     

    Object 클래스

    Object 클래스의 finalize 메소드

    protected void finalize() throws Throwable

    Object 클래스에 정의되어 있는 이 메소드는 인스턴스 소멸 시 자동으로 호출이 된다.

    자식 클래스에서 오버라이딩 할 수 있음.

    프로그램에 부담을 주기 때문에 finalize 메소드를 사용하는 것은 추천하지 않는다.

     

     

    인스턴스의 비교: equals 메소드

    equals 메소드는 Object 클래스의 메소드이다.

    equals 메소드는 등가 비교를 하고 싶을 때, 값을 비교해 주는 것이 아니라 어떤 식으로 비교할지 정의하는 메소드이다.

    주어진 두 값을 비교하기 위해서 각각 참조 변수로 정의를 하고, Object 클래스의 equals메소드를 오버라이딩한다.

    비교 대상인 값을 명시적 참조형 변환 후 멤버에 접근하여 비교한다.

    두 대상이 같으면 true를 다르면 false를 반환한다.

     

    String 클래스는 내용을 비교 하는 형태로 equals 메소드를 오버라이딩 하고있다.

Designed by Tistory.