본문 바로가기
Back-End/Java

[JAVA] 다양한 형태의 클래스 선언 방법과 중첩클래스(inner class)

by 찐코딩 2021. 9. 17.

 다양한 형태의 클래스 선언 방법

 1. 일반적인 선언 방법

    ==> 하나의 자바 파일에 class 키워드를 작성하여 클래스 선언.

// 1. 일반적인 선언 방법
		// Sub 객체 생성
		Sub sub = new Sub();
		System.out.println
			("sum() 메서드 호출 >>> " + sub.sum(200, 15));
		System.out.println
			("minus() 메서드 호출 >>> " + sub.minus(127, 15));
		System.out.println();

결과

sum() 메소드 호출 : 202
minus() 메소드 호출 : 198


  2. 무명 클래스(anonymous class) 선언

    ==> 이름이 없이 없는 클래스 선언. interface 객체 생성 시 많이 사용됨.

package inner;

interface Inter {
	
	int sum(int n1 , int n2);
	int minus(int n1, int n2);
	
}

class Sub implements Inter {
	@Override
	public int sum(int n1, int n2) {
		return n1 + n2;
	}
	
	@Override
	public int minus(int n1, int n2) {
		return n1 - n2;
	}
}

public class Ex01 {

	public static void main(String[] args) {
	// 2. 무명 클래스(annonymous class) 선언
		Inter inter = new Inter() {

			@Override
			public int sum(int n1, int n2) {
				return n1 + n2;
			}

			@Override
			public int minus(int n1, int n2) {
				return n1 - n2;
                }
		};
		
		System.out.println
		("sum() 메소드 호출 : " + sub.sum(200,2));
		System.out.println
		("minus() 메소드 호출 : " + sub.minus(200, 2));

	}
	
}

결과

sum() 메소드 호출 : 202
minus() 메소드 호출 : 198


  3. 중첩 클래스(inner class) 선언

     ==> 클래스 안에 또 다른 클래스 선언

 

* 중첩 클래스(inner class)

이너 클래스 혹은 중첩 클래스는 하나의 클래스로, 클래스나 인터페이스 내부에서 선언한다.
코드를 더 읽기 쉽고, 더 오래 유지 하기 위해, 논리적인 그룹과 인터페이스들에서 이너클래스를 사용한다.
추가로, 이너클래스는 개인적인 데이터 멤버와 메소드를 포함하는 외부 클래스의 모든 멤버들에 접근할 수 있다.

 

1. 클래스 내부에 또 다른 클래스 선언

     ==> 두 클래스가 서로 긴밀한 관계로 연결되어 있는 경우 사용.
         두 클래스 멤버 간에 서로 쉽게 접근할 수 있다는 장점이 있음.


  2. 내부 클래스를 하나의 멤버로 사용할 수 있음.


  3. 클래스 멤버 : 멤버 변수, 멤버 메소드, 외부 클래스, 내부 클래스


  4. 내부 클래스 객체 생성 방법
     형식) 

외부클래스명.내부클래스명 참조변수 = 외부클래스의 참조변수.new 내부클래스 생성자();

 

 내부 클래스의 특징

  - 내부 클래스는 외부 클래스의 멤버를 마치 자기 자신처럼 사용 가능함.
    외부 클래스 멤버의 접근 지정자가 private 접근 지정자일지라도 접근 가능.
  - 내부 클래스의 접근은 반드시 외부 클래스를 통하여 접근해야 함.

 

class Outer {       // 외부 클래스
	
	final int su1 = 50;
	private int su2 = 33;
	
	class Inner {   // 내부 클래스
		
		void output() {
			// su1 = 178;  => final로 선언하면 한번 초기화된 변수는 변경할 수 없는 상수값이 됨
			su2 = 100;	
			System.out.println("su1 >>> " + su1);
			System.out.println("su2 >>> " + su2);
            
		} // output() 메소드 end
	} // 내부 클래스 end
} // 외부 클래스 end

public class Ex02 {

	public static void main(String[] args) {
		
		// 중첩 클래스 객체 생성 방법
		// 1. 외부(Outer) 클래스 객체가 우선적으로 생성.
		Outer outer = new Outer();
		
		// 2. 내부(Inner) 클래스 객체 성성.
        // 형식 : 외부클래스명.내부클래스명 참조변수 = 외부클래스의 참조변수.new 내부클래스 생성자();
		Outer.Inner inner = outer.new Inner();
		
		inner.output();
	}
}

결과

su 1 : 50
su 2 : 100

외부클래스에서 선언한 변수를 내부 클래스에서 접근, 이용가능 한 것을 볼 수 있다.

(그게 private로 선언한 변수일지라도)

다만 final로 선언한 su1 변수는 final로 지정하여 변경이 불가능함. => 에러발생

 

 

댓글