플레이데이터 - 9일차 자바 공부

Kim Hyen Su·2023년 7월 11일

※복습

로컬 클래스

  • 메서드 안에 클래스 정의한 것
  • 메서드 내부 지역 변수 선언 시 상수로 처리되도록 final 예약어를 의무적으로 붙여줘야 했지만, JDK 1.8 이후부터 컴파일러에 의해서 final 예약어가 내부적으로 추가된다.

🎇익명 클래스(객체)

  • 일반적으로 일회성으로 사용할 객체를 사용할 때 사용함.
  • 이름 자체의 의미는 '이름 없는 객체'로서, 추상 메서드를 구현한 객체를 말한다.

익명 객체 생성 조건

  • 클래스 상속 또는 인터페이스의 추상 메서드를 구현해야 생성이 가능하다.
  • 메서드 내부(local) 또는 멤버 변수 위치에서 생성이 가능하다.

익명 객체 생성

  • 추상클래스타입 변수 = new 추상클래스() { 구현 코드 }
  • 인터페이스타입 변수 = new 인터페이스() { 구현 코드 }
  • 메서드의 매개변수가 추상 클래스(인터페이스) 타입으로 선언된 경우, 메서드 호출 시 추상 클래스(인터페이스) 내부에 선언된 추상 메서드를 구현해줘야 생성이 가능하다.
  • 메모리 관점에서 보면, 힙에 생성되었다가 참조가 끊기면 GC(Garbage Collector)에 의해 삭제된다.(재사용이 불가능하다.)

익명 객체 구현 방법

  • 인터페이스 타입의 필드 또는 변수를 선언하고 구현 객체를 초기값으로 대입한다.
Ex) 
public interface Person{
	void wake();
}

Person field = new Person() { // 멤버 변수에 구현 객체 초기값으로 대입.
		void work() {
			System.out.println("출근합니다.");
		}
		
        @Override
		void wake() {
			System.out.println("아침 6시에 일어납니다");
			work();
		}
	};
  • 메서드 내부에 지역변수로서 인터페이스 타입의 필드 또는 변수를 선언하고 구현 객체를 초기값으로 대입.
Ex)
void method1() {
		Person localVar = new Person() {
			void walk() {
				System.out.println("산책합니다.");
			}
			
			@Override
			void wake() {
				System.out.println("아침 7시에 일어납니다.");
				walk();
			}
		};
		
		localVar.wake();
	}
  • 메서드 매개변수로서 인터페이스 타입의 필드 또는 변수를 선언하고 메서드 호출 시 구현 객체를 매개값으로 대입.
Ex)
	public class Anonymous{
		void method2(Person person) {
			person.wake();
		}
    }
    
    Anonymous anony = new Anonymous();
    
    anony.method2(
				new Person() {
					void study() {
						System.out.println("공부합니다.");
					}
					
					@Override
					void wake() {
						System.out.println("8시에 일어납니다.");
						study();
					}
				}
			);

익명 객체 로컬 변수 사용

  • 메서드 내 변수값은 메서드 내 로컬 클래스 객체 안에서 사용될 경우 final로 선언된다.
  • 이는 멀티 스레드 사용 시 하나의 스레드 내 지역 변수를 다른 스레드에서 사용 시 final 변수를 복사하여 사용하도록 해주어 실제 final 변수 값에는 변화가 없도록 해주기 위해 final 변수로 선언해준다.

🎇예외 처리

  • 프로그램 실행 시 예외가 발생하지 않고 정상 실행되도록 처리하는 것.
  • 에러(Error) : 컴퓨터 하드웨어 오동작 또는 고장으로 인해 응용프로그램 실행에 오류가 발생하는 것.
  • 예외(Exception) : 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류.
  • 자바는 예외가 발생할 가능성이 높은 코드를 컴파일 시 예외 처리 유무를 확인한 뒤 컴파일 예외 처리가 되지 않은 경우 컴파일 되지 않도록 해준다.

예외 클래스

예외와 예외 클래스

  • 일반 예외 : RuntimeException이 아닌 Exception ( 컴파일 시 예외 발생 )

  • 실행 예외 : RuntimeException ( 실행 도중에 예외 발생 )

  • JVM은 프로그램 실행 도중 예외 발생 시 예외 클래스로 객체를 생성한 다음 예외 처리 코드에서 예외 객체를 사용할 수 있도록 해준다.

RuntimeException 종류

NullPointerException

  • 가장 빈번한 실행 예외로서, 객체 참조가 없는 상태에서 객체 사용 시 발생.

ArrayIndexOutOfBoundsException

  • 배열에 없는 인덱스의 값을 사용한 경우 발생.

NumberFormatException

  • 메서드의 매개변수 및 연산 시 연산되는 변수 타입을 잘못 사용한 경우 발생.

ClassCastException

  • 대입된 객체와 다른 클래스 타입으로 변환할 경우 발생.

예외 처리

예외 처리 코드

  • try-catch-finally
    - try{ 예외 발생 코드}
    - catch { 예외 처리 코드}
    - finally { 예외 발생 여부와 상관없이 실행되는 코드 }

예외 발생시 실행 순서

  • try → catch → finally

예외 발생하지 않을 때 실행 순서

  • try → finally

finally 사용 이유

  • 예외 처리와 무관하게 실행되야 하는 코드 작성 시 사용.
  • finally 구문은 생략이 가능함.

예외 종류에 따른 처리 코드

다중 catch

  • 발생되는 예외별로 다르게 처리하고 싶은 경우 사용.

catch 순서

  • 상위 예외 클래스가 하위 예외 클래스보다 아래에 위치해야 한다.
  • 만약, 상위 예외 클래스가 상단에 위치하면 하위 클래스는 catch 될 확률이 거의 없다.
  • 일반적으로 Exception(상위 예외 클래스)으로 예외 처리하기 보다는 예외마다 하위 예외클래스 단위로 처리해 주는 것이 좋다.

예외 떠넘기기 : throws

  • 메서드 선언부에서 발생한 예외를 메서드 호출하는 곳에서 처리하도록 예외를 전가하는 것.
profile
백엔드 서버 엔지니어

0개의 댓글