본문 바로가기

아옳옳의 코딩공부/아옳옳 자바코딩공부

2021-02-26 자바공부 (interface, Inner클래스[내부클래스])

반응형

빈 인터페이스 (구분자)

 

디폴트메소드와 static 메소드 

package default_method;

public class DefaultMethod_Ex {

	public static void main(String[] args) {
		//인터페이스에서도 디폴트 메소드를 통해서 간접접근하여 사용할수 있다 
		MyInterface m1 = new  ClassA();
		//클래스A에서 정의한 메소드
		m1.method1();
		//메소드2는 인터페이스에서 만들어 놓은 디폴트 메소드 
		m1.method2();
		
		//인터페이스에서도 디폴트 메소드를 통해서 간접접근하여 사용할수 있다 
		MyInterface m2 = new  ClassB();
		//클래스B에서 정의한 메소드
		m2.method1();
		//클래스B의 메소드2는 오버라이딩
		m2.method2();
		//인터페이스에서 직접 접근 static 메소드 
		MyInterface.method3();
	}

}


//인터페이스
package default_method;

public interface MyInterface {

	public void method1();
	//디폴트메소드
	public default void method2() {
		System.out.println("내 인터페이스 메소드2 실행중이얌");
	}
	//스테이틱
	static void method3() {
		System.out.println("내 인터페이스 메소드3 실행중이얌");
	}
}



//클래스 A
package default_method;

public class ClassA implements MyInterface {
	//디폴트 메소드는 상속과 같은 개념으로 여기에 안적었지만 실제로 있다
	@Override
	public void method1() {
		System.out.println("클래스A의 메소드1 실행중이얌");
	}
	
	

}



//클래스 B
package default_method;

public class ClassB implements MyInterface{
	
	@Override
	public void method1() {
		System.out.println("클래스B의 메소드1 실행중이얌");
	}

	@Override
	public void method2() {
		System.out.println("클래스B의 메소드2 실행중이얌");
	}
	
}







내부클래스 (inner ) 

클래스 내부에 클래스를 정의하는 것

 

인스턴스 내부 클래스 : 가장 일반적인 형태로 클래스 내부에 클래스를 선언한 것 

내부클래스의 객체를 생성하기 위해서는 반드시 외부클래스 객체 필요 

인스턴스 내부클래스 예시

이렇게 생성하게 되면 A클래스 속에 B클래스가 생성이 되고 B클래스는 A클래스 로밖에 접근이 안된다 

 

 

정적 내부 클래스 : static 키워드를 사용한 내부클래스 

정적 내부 클래스는 static 키워드가 선언부에 같이 사용 되므로 인스턴스화 없이 사용이 가능하다

정적내부 클래스 사용방법
정적 내부 클래스 예시

 

 

지역 내부 클래스 : 메소드 내부에 클래스를 선언한 것으로 메소드 내부에서만 유효하다 

 

 

익명 내부 클래스 : 선언과 동시에 만들어짐  일회용이다 

코드 예시 

package innerClass;

public class A { // Outter 클래스

	A() {
		System.out.println("A객체가 생성됨");
	}

	int num = 0;
	static int sum = 0;

	public class B { // 인스턴스 내부 클래스
		B() {
			System.out.println("B객체가 생성됨");
		}

		int field1;

		// static int field2; // 이너클래스에서는 아직 객체가 생성되지 않아서 안의 멤버필드가 static일 수 없다.
		void method1() {
		}
		// static void method2() {} // 이너클래스에서는 아직 객체가 생성되지 않아서 안의 멤버메소드가 static일 수 없다.

		int tot = num; // 외부 클래스의 멤버 접근 가능
		// num = 3; // 외부 클래스의 멤버의 값 수정은 불가능(오류남)

	}

	static class C { // 정적 내부 클래스
		C() {
			System.out.println("C객체가 생성됨");
		}

		int field1;
		static int field2;

		void method1() {
		}

		static void method2() {
		}

		// int tot = num; // 외부 클래스가 인스턴스화 되지 않았기 때문에 오류(내부 클래스만 인스턴스화 되었기 때문)

	}

	void method() { // 지역 클래스

		int tot = 0;

		class D {
			D() {
				System.out.println("D객체가 생성됨");
			}

			int field1;

			// static int field2; 내부 클래스까지 static 확인하지 않아서 오류
			int method_D() {
				return field1;
			}

		}

		tot++;
		D d = new D();
		d.field1 = 3;
		System.out.println(d.method_D());

	}

}

출력상황

 

오후에 정신없이 나와서 위 코드는 받아서 이해 하다보니까 초금 어렵네~? ㅋㅋ 

화요일날 가서 복습할때 확실하게 이해 하고 넘어가도록 하자~~ 

반응형