[TIL] Java 5일차 2

minami·2021년 2월 17일
0

Java

목록 보기
8/11

💡 중첩 클래스와 중첩 인터페이스

중첩 클래스: 클래스 내부에 선언된 클래스이지만 생성 시 다른 클래스들과 마찬가지로 바이트 코드(~.class) 가 만들어진다!
중첩 인터페이스: 클래스 내부에 선언된 인터페이스

1. 중첩 클래스의 분류

1-1. 멤버 클래스

1️⃣ 인스턴스 멤버 클래스

  • A 클래스 외부에서 B 클래스의 객체를 생성하려면 먼저 A 객체를 생성해야 B 객체를 생성하여 사용 가능
  • static키워드 없이 선언된 클래스로, 정적 필드와 정적 메소드는 선언 불가능
class A {
	class B {  // instance inner class
		B() {}  // 생성자
		int n;  // 인스턴스 필드
		void method() {}  // 인스턴스 메소드
		// static int sn; // static 필드 선언 불가능
		// static void smethod() {} // static 메소드 선언 불가능
	}
}
public class InnerClassTest {
	public static void main(String[] args) {
		A a = new A();  // B가 A 안에 있기 때문에 A부터 먼저 생성해줘야 한다
		A.B b = a.new B();
		b.method();
		b.n = 10;
	}
}

2️⃣ 정적 멤버 클래스

  • C 클래스 외부에서 C 객체를 생성하지 않아도 D 클래스의 객체를 바로 생성 가능
  • 모든 종류의 필드와 메소드 선언 가능
class C {
	// static inner class
	static class D {
		D() {}  // 생성자
		int n;  // 인스턴스 필드
		void method() {}  // 인스턴스 메소드
		static int sn;  // static 필드
		static void smethod() {}  // static 메소드
	}
}
public class InnerClassTest {
	public static void main(String[] args) {
		C.D d = new C.D();  // static은 C부터 먼저 생성하지 않아도 됨
		d.n = 10;
		C.D.sn = 20;
		C.D.smethod();
	}
}

1-2. 로컬 클래스

  • 메소드 내부에 선언된 클래스
  • 메소드가 실행할 때에만 사용할 수 있으므로 메소드 내부에서만 사용 가능
  • 메소드 내부에서만 사용되므로 접근 제한이 필요없기 때문에 접근 제한자와 static키워드 사용 불가능
public class InnerClassTest {
	// 로컬 클래스 - 밖에서는 쓸 수 없고 이 안에서만 쓸 수 있음
	public static void func() {
		class F {
			F() {}  // 생성자
			int n;  // 인스턴스 필드
			void method() {}  // 인스턴스 메소드
			// static int sn;  // static 필드 선언 불가능
			// static void smethod() {}  // static 메소드 선언 불가능
		}
		F f = new F();
		f.method();
	}
}

2. 중첩 클래스의 접근 제한

  • 멤버 클래스가 인스턴스인지 정적인지에 따라 바깥 클래스의 필드와 메소드에 사용 제한이 있다.

2-1. 바깥 필드와 메소드에서 사용 제한

  • 인스턴스 멤버 클래스는 바깥 인스턴스 필드와 인스턴스 메소드에서 객체 생성 가능하지만, 정적 필드의 초기값이나 정적 메소드에서는 객체 생성 불가능❌
  • 정적 멤버 클래스는 모든 필드의 초기값이나 모든 메소드에서 객체 생성 가능⭕

2-2. 로컬 클래스에서 사용 제한

  • 자바 7 이전: final선언을 하지 않으면 매개 변수와 로컬 변수를 로컬 클래스에 사용 시 컴파일 에러
  • 자바 8 이후: 로컬 클래스에서는 final 선언을 하지 않아도 매개 변수와 로컬 변수가 자동으로 final 특성을 가진다.

2-3. 중첩 클래스에서 바깥 클래스 참조 얻기

  • 중첩 클래스 내부에서 this는 중첩 클래스 내부의 객체 참조
  • 바깥 클래스의 객체 참조를 하려면 바깥클래스명.this를 사용해야 한다.

3. 중첩 인터페이스

  • 중첩 인터페이스는 클래스의 멤버로 선언된 인터페이스
    • 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위한 목적
    • 특히 UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용
interface DoubleClickable {
	void idclick();
}
class Button {  // 버튼 기능 구현
	Clickable c;
	DoubleClickable dc;
	public void click() {
		System.out.println("클릭");
		if (c!=null) {
			c.iclick();
		}
	}
	public void doubleclick() {
		if (dc!=null) {
			dc.idclick();
		}
	}
	public void addClickListener(Clickable c) {
		this.c=c;
	}
	public void addDClickListener(DoubleClickable dc) {
		this.dc=dc;
	}
	interface Clickable {  // static 속성을 가짐
		void iclick();
	}
}
public class InterfaceExample2 {
	public static void main(String[] args) {
		Button libtn = new Button();
		libtn.addClickListener(new Button.Clickable() {
			@Override
			public void iclick() {
				System.out.println("로그인");	
			};
		});
		libtn.click();
		Button joinbtn = new Button();
		joinbtn.addClickListener(new Button.Clickable() {
			@Override
			public void iclick() {
				System.out.println("회원가입");	
			}
		});
		joinbtn.click();  // 회원가입처리
	}
}

4. 익명 객체

  • 익명 객체는 이름이 없는 객체

  • 익명 객체의 특징

    • 단독 생성 불가능: 클래스를 상속하거나 인터페이스를 구현해야만 생성 가능
    • 사용 위치: 필드의 초기값, 로컬 변수의 초기값, 매개 변수의 매개값으로 주로 대입된다.
    • UI 이벤트 처리 객체 또는 스레드 객체를 간편학 생성할 목적으로 활용한다.
  • 보통 자식 클래스를 재사용하지 않아 일회성으로 사용할 객체를 생성할 때 주로 사용!

  • 중괄호({}) 내부에는

    • 익명 자식 객체 생성 시: 필드나 메소드 선언 또는 부모 클래스의 메소드를 오버라이딩 한다.

      ​ (⚠ 일반 클래스와 달리 생성자 선언 불가능!)

    • 익명 구현 객체 생성 시: 추상 메소드의 실체 메소드를 작성하거나 인터페이스의 메소드를 오버라이딩 한다.

interface IBase {
	void method();
}

abstract class CBase {
	abstract void cmethod();
}

public class AnonymousTest {
	public static void main(String[] args) {
		IBase b = new IBase() {  // 인터페이스를 상속받아서 새로운 클래스(익명 클래스)를 오버라이드하여 생성
			@Override
			public void method() {
				System.out.println("구현 메소드");
			}			
		};
		b.method();  // 호출
		
		CBase c = new CBase() {
			@Override
			void cmethod() {
				System.out.println("추상 메소드도 똒같은겨?");
			}
		};	
		c.cmethod();
	}
}

💡 예외 처리

1. 예외와 오류

  • 에러 👉 하드웨어의 잘못된 동작이나 고장으로 발생한 오류
  • 예외 👉 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 발생하는 프로그램 오류

📌 그래서 개발할 때 테스트를 하는 것이 중요! 예외 처리는 최대한 개발 당시에 해 둬야 한다.

  • 자바에서는 예외를 클래스로 관리한다.

예외의 종류

  • 일반 예외(Exception)
    • 컴파일러 체크 예외라고도 불린다.
    • 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사한다.
    • ClassNotFoundExceptionInterruptedException 등이 속한다.
  • 실행 예외(Runtime Execption)
    • 컴파일 과정에서 예외 처리 코드를 검사하지 않는 예외
    • NullPointerExceptionArrayIndexOutOfBoundsException 등이 속한다.
profile
함께 나아가는 개발자💪

0개의 댓글