- 익명 클래스 (anonymous inner class)

이름이 없는 클래스 (일회용 클래스)

단 하나의 익명 구현 객체를 위한 클래스

 


익명 클래스 사용하기!

public abstract class Animal {
	String name;
	String gender;
	int age;
		
	public Animal(String name, String gender, int age) {
		this.name = name;
		this.gender = gender;
		this.age = age;
	}

	abstract void makeSomeNoise(); 
}

먼저 추상 클래스로 Animal이라는 클래스를 만들어 준다. 여기서 메소드인 makeSomeNoise() 또한 추상 메소드로 만든다.

 

public class Ground {
	public static void main(String[] args) {
		Animal dog  = new Animal("초코", "수컷", 3) {
			
			String food = "뼈다귀";
			
			@Override
			void makeSomeNoise() {
				System.out.println("멍멍");
			}
		}; // 여기까지가 자동완성으로 만들어지는 부분
		dog.makeSomeNoise();
//        System.out.println(dog.food); 실행되지 않음
	}
}

추상 클래스의 변수들과 메소드를 사용하기 위해서 Ground 클래스를 만들고, 

여기서 Animal 객체를 생성하려면 상속을 받고 재정의를 해야하지만, 익명 클래스를 이용하면 상속할 필요 없이

객체를 생성할 수 있다.

new Animal을 하고 자동완성을 하면 익명 클래스가 자동으로 쓰이고, 익명 클래스를 사용해 객체를 만든 것이다.

 

여기서 String food는 dog.food로 해도 출력이 되지 않는다.

이유는 익명 클래스는 상속받지 않았지만 Animal의 자식 클래스이며, 객체를 생성하면서 업캐스팅이 이루어진다.

따라서 자식에게서 추가된 food는 사용할 수가 없다.

 

여기서 빨간색으로 표시된 부분을 객체로 보면된다.
파란색으로 밑줄 친 부분에서 원래의 클래스라면 여기에 클래스 이름이 들어가지만 
익명 클래스이기 때문에 이름이 따로 없는 것을 볼수 있다.
 

- 예외 처리

컴파일 에러 : 소스코드와 구문 오류로 인하여 컴파일이 불가능한 상태를 의미한다.

→ 이것은 상대적으로 고치기 쉬우며, 이클립스에서는 구문에 빨간 줄이 그어지는 것을 의미한다.

런타임 에러 : 구문상의 에러는 없지만, 프로그램이 실행되는 과정에서 다양한 경우의 수에 대응하지 못하여 발생하는 예외 상황을 의미하고, 런타임 에러가 발생하면 프로그램이 강제 종료된다.

 

따라서 이러한 에러가 발생하기 전에 예외 처리를 통해서 프로그램 종료가 아닌 다른 처리를 해준다.

 

 

-try ~ catch ~ finally 문

try {

예외가 발생할 수 있는 문장 1

예외가 발생할 수 있는 문장 2,

.....

} catch (예외 클래스명 객체명) {

해당 예외 발생 시 수행할 문장

.....

}

.. catch 문은 여러 개 사용 가능

finally {

예외 발생 유무와 상관없이 무조건 실행할 문장

}

  Exception 클래스 : 모든 예외 클래스들의 부모 클래스

 


try ~ catch문 사용해보기!

public class ExceptionTest2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while (true) {
			sc = new Scanner(System.in);
// 여기서 sc를 다시 할당해주는 이유는 필드가 비워지지 않아서 입력을 할려고 해도 무한반복으로 나온다.
// 따라서 재할당을 통해 필드를 비워주면 입력이 가능하다.
			try {
// Alt + Shifht + Z > ↓ > enter : try ~ catch 블럭 생성
				System.out.println("첫 번째 정수 : ");
				int num1 = sc.nextInt();
				System.out.println("두 번째 정수 : ");
				int num2 = sc.nextInt();
				System.out.println("결과 : " + num1 / num2);
				
			} catch (ArithmeticException ae) {
				System.out.println("0으로는 나눌 수 없습니다.");

			} catch (InputMismatchException ime) {
				System.out.println("정수만 입력하세요 제발");
			} catch (Exception e) {
				System.out.println("알 수 없는 오류 발생 / 개발자에게 알려주세요.");
			}
//				System.out.println(e);
		}

 

 
위 코드의 결과

- 오브젝트 클래스 (Object Class)

모든 클래스들의 최상위 클래스

== 두 주소값이 같은지 확인하는 연산자
equals() 두 주소값이 같은지 확인하는 메소드
hashCode() 해시값 (주소값과 관련된 어떤 int값) 리턴
toString() 객체 출력시 나올 문자열 정리

따라서 우리가 만드는 클래스에서는 주소값이 아닌 다른값으로 활용할 수 있도록 재정의 해야한다.

 

복사했습니다!