본문 바로가기

java

자바강의 10일차

1. 내부클래스

  - 내부클래스는 클래스 내에 클래스가 선언된다는 점을 제외하고는 일반적인 클래스와 다르지 않다.

  - 내부클래스는 사용빈도가 높지 않으므로 내부 클래스의 기본 원리와 특징을 이해하는 정도만 알아보자.

  - 내부클래스는 클래슨 내에 선언된 클래스로써 두 클래스가 서로 긴밀한 관계에 있기 때문에 사용한다.

  - 내부클래스의 장점은 다음과 같다.

       ① 내부클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.

       ② 코드의 복잡성을 줄일 수 있다.

 

 

  1-1) 내부클래스의 종류와 특징

     - 내부클래스의 종류는 변수의 선언위치에 따른 종류와 같다.

     - 내부클래스는 마치 변수를 선언하는 것과 같은 위치에 선언할 수 있으며, 변수의 선언위치에 따라

       인스턴스변수, 클래스변수, 지역변수로 구분되는 것과 같이 내부클래스도 다음과 같이 구분되어 진다.

    

내부클래스 종류 특징
인스턴스 클래스
(instance class)
외부클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스처럼 다뤄진다. 주로 외부클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언된다.
스태틱 클래스
(static calss)
외부클래스의 멤버변수 선언위치에 선언하며, 외부클래스의 static멤버처럼 다루어진다. 주로 외부클래스의 static멤버, 특히 static 메소드에서 사용될 목적으로 선언된다.
지역 클래스
(local calss)
외부클래스의 메소드에 선언하며, 선언된 영역 내부에서만 사용될 수 있다.

 

 

  1-2) 내부클래스의 제어자와 접근성

      - 인스턴스크래스와 스태틱클래스는 외부 클래스의 멤버변수와 같은 위치에 선언되며, 또한 멤버변수와 같은 성질을 가진다.   

      - 즉, 내부클래스가 외부클래스의 멤버와 같이 간주되고 인스턴스 멤버와 static 멤버간의 규칙이 내부클래스에서도 똑같이 적용된다.

 

*** O/X 퀴즈 ***

    1.인스턴스 메소드에서 스태틱변수(클래스변수)를 사용할 수 있다? ==> O

    2. 스태틱메소드에서 인스턴스 변수를 사용할 수 있다? ==> X

 

    - 내부클래스 중에서 스태틱클래스만 static 멤버를 가질 수 있다.

    - 다만 final과 static이 동시에 붙은 변수는 상수이므로 모든 클래스에서 정의가 가능하다.

    - 인스턴스멤버는 같은 클래스에 있는 인스턴스멤버와 static멤버 모두 직접 호출이 가능하지만, static멤버는 인스턴스 멤버를 직접 호출할 수 없는 것처럼 인스턴스클래스는 외부클래스의 인스턴스멤버를 객체생성없이 바로 사용할 수 있지만 스태틱클래스는 외부클래스의 인스턴스멤버를 객체생성없이 사용할 수 없다.

    - 마찬가지로 인스턴스 클래스는 스태틱클래스의 멤버들을 객체생성없이 사용할 수 있지만, 스태틱클래스에서는 인스턴스클래스의멤버들을 객체생성없이 사용할 수 없다.

 

    

 

2. 익명클래스(anonymous class)

   - 익명클래스는 특이하게도 다른 내부클래스들과 달리 이름이 없다.

   - 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나의 객체만으로 사용할 수 있는 일회용 클래스이다.

   - 이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.

   - 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.

 

3. 예외처리(exception handling)

   3-1)프로그램 오류

       - 프로그램 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다.

       - 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다.

       - 이를 발생시점에 따라 '컴파일에러(compile error)'와 '런타임에러(runtime error)'로 나눌 수 있는데 컴파일에러는 컴파일할 때 발생하는 에러이고 프로그램 실행 중에 발생하는 에러를 런타임에러라고 한다.

컴파일에러 컴파일시에 발생하는 에러(주로 문법)
런타임에러 실행 시에 발생하는 에러(배열 범위 벗어남)
논리적에러 실행은 되지만 의도와 다르게 동작하는 것

       - 자바에서는 실행 시 (runtime)발생할 수 있는 프로그램 오류를 에러(error)와 예외(exception) 두 가지로 구분하였다.

       - 에러가 발생하면 프로그램의 비정상적인 종료를 막을 길이 없지만, 예외는 발생하더라도 프로그래머가 이를 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 있다.

     * 에러 (error)   : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

     * 예외 (exception)    : 프로그램 코드에 의해서 수습될 수 있는 미약한 오류

 

  3-2) 예외처리 try-catch문

      - 프로그램 실행 도중에 발생하는 에러는 어쩔 수 없지만, 예외는 프로그래머가 이에 대한 처리를 미리 해주어야 한다.

      - 예외처리란 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것이며 예외처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상 종료를 막고 정상적인 실행상태를 유지할 수 있도록 하는 것이다.

 

   ① try 블록 내에서 예외가 발생한 경우

      - 발생한 예외와 일치하는 catch 블록이 있는지 확인한다.

      - 일치하는 catch블록을 찾게되면 그 catch블록 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 수행한다. 

      - catch문을 찾지 못하면 예외는 처리되지  않는다.

참고자료

 

    ② try 블록 내에서 예외가 발생하지 않은 경우

       - catch블록을 거치지 않고 try-catch문을 빠져나가서 수행을 계속한다.

 

   3-3) 예외의 발생과 catch블록

      - catch 블록은 괄호{}와 블록{} 두 부분으로 나누어져 있는데 괄호내에는 처리하고자 하는 예외와 같은 타입의 참조변수를 선언해야 한다.

      - 예외가 발생하면 발생한 예외에 해당하는 클래스의 인스턴스가 만들어진다.

      - 또한 예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 발생한 예외의 대한 정보가 있으며 아래와 같다.

       * getMessage()   : 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

       * printStackTrace()   : 예외발생 당시에 호출스택에 있었던 메소드의 정보와 예외 메시지를 화면에 출력한다.

     

 

   3-4) 예외 발생시키기

       - 키워드 throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있으며 방법은 아래의 순서를 따르면 된다.

          ① 먼저 new를 이용해서 발생시키려는 예외 클래스의 객체(인스턴스)를 만든 다음

          ② throw를 이용해서 예외를 발생시킨다.

 

   3-5) 메소드에 예외 선언하기

       - 예외를 try-catch문을 사용하는 것 외에 예외를 메소드에 선언하는 방법이 있다.

       - 메소드에 예외를 선언하려면 메소드의 선언부에 throws를 사용해서 메소드 내에서 발생할 수 있는 예외를 적어주면 된다.

       - 만약, 예외가 여러개일 경우 쉼표로 구분해서 여러개를 적어준다.

   

3-6) finally 블록

       - finally 블록은 예외 발생여부에 상관없이 실행되어야 할 코드를 포함시킬 목적으로 사용된다.

       - try-catch-finally의 순서로 구성된다.

'java' 카테고리의 다른 글

자바강의 9일차  (0) 2024.01.19
자바강의 8일차  (0) 2024.01.15
자바강의 7일차  (0) 2024.01.14
자바강의 6일차  (1) 2024.01.13
자바강의 5일차  (0) 2024.01.10