내부 클래스 (inner class)

김지원·2022년 6월 21일
0

Java

목록 보기
38/38

내부 클래스가 생겨난 이유

클래스를 다른 클래스 밖에서 사용하면
해당 클래스를 객체화해서 소속을 알려줘야하는데 그게 불편해서
' 나는 다른 클래스 필요없이 그 클래스만 있으면 모든 걸 할 수 있어 ' 할 때 사용한다.
=> 내부 클래스의 필드 접근에 용의하게 한다.

예를 들어 내부클래스를 이해해보자

배달을 하려면 주문이 있어야 한다. 주문클래스와 배달클래스가 있다고 가정하자.
주문이 들어와야 배달이 사용이 되기 때문에 배달 클래스는 다른 곳에서 사용되지 않는다.
주문을 할 때 사용자의 주소, 번호, 품목 이 모든 전부는 주문클래스 안에 있다. 배달 클래스 또한 주문클래스 안에 있는 필드들을 객체화해서 사용해야한다. 그래서 배달을 주문안으로 넣자!
=> 내부클래스! 내것인 마냥 외부 필드를 사용할 수 있다. 마치 상속받은 것처럼. 그렇지만 상속과는 개념이 다르다.


내부 클래스(inner class)

  • 클래스 내부에 클래스를 선언하여 외부 클래스의 필드 접근에 용이하기 위함.
  • 내부 클래스의 필드를 사용하기 위해서는 외부 클래스에서 내부 클래스를 객체화 해야한다.
외부클래스명 객체명 = new 외부클래스생성자();
외부클래스명.내부클래스명 객체명 = 외부클래스객체명.new 내부클래스생성자();
  • 외부클래스를 객체화해주면 외부클래스 타입으로 메모리에 올라가있다.
    외부클래스명.내부클래스명 객체명 점이 찍혀있으니 마지막에 적힌
    내부클래스명 에 접근하기 위해서 앞에서 부터 달려온 것이다.
    외부클래스 안의 내부클래스명 타입이다. 이 타입의 객체를 선언 할 껀데 이미 메모리에 올라가있는 외부클래스 객체 안에 내부클래스 생성자가 있어서 new를 사용한다.
    => 클래스로 직접접근해서 사용한다. new를 두번해준다.

내부 클래스를 사용하는 이유

접근성 용의

  • 위에서 설명한 것 처럼 외부클래스의 필드들을 자유롭게 사용할 수 있다.

캡슐화 ( 가두어 두는 느낌 )

  • A클래스에서 b 라는 작업이 자주 쓰이고, 이 작업은 B 클래스를 만들어야 쉽게 관리할 수 있음. 하지만 다른 클래스에서 b 작업이 필요 없거나, B클래스를 외부에
    노출시키고 싶지 않을 때 사용한다.

내부 클래스의 사용.

  • 내부 클래스는 GUI(Graphic User Interface)개발시 많이 사용됨.
    예를 들어 a라는 버튼과 b라는 버튼이 있다고 하자. 두 버튼의 기능이 서로 다르다면
    클래스를 별도로 만드는 것 보다 내부 클래스로 만들어 사용하는 것이 적합하다.

캡술화 예시

package javastudy01;

public class OutClass {
	int outData;     
    
	public OutClass() {   
		System.out.println("외부 클래스 생성자 호출 됨.");
	}
    
	public void showOuter() {
		System.out.println("외부 클래스의 메서드 호출 됨.");
	}
    
	public class InnerClass {
		int inDate;
        
		public InnerClass() {
			System.out.println("내부 클래스의 생성자 호출 됨.");
		}
        
		public void showInner() {
			outData = 20; // 내부에서 값을 변경하였다. 
			System.out.println("내부 클래스의 메서드 호출 됨."); // 내부 클래스의 메서드 호출 됨.
			System.out.println("outDate : " + outData); // outDate : 20
			showOuter(); // 외부 메서드 활용. // 외부 클래스의 메서드 호출 됨.
		}
	}
	public static void main(String[] args) {
		OutClass out = new OutClass(); // 외부 클래스 생성자 호출 됨.
		OutClass.InnerClass in = out.new InnerClass(); //내부 클래스의 생성자 호출 됨.
		in.showInner(); 
	}
	
}

외부 클래스의 필드

int outData; : 전역변수
public OutClass() {} : 외부 클래스 생성자
public void showOuter() {} : 외부 클래스 메서드

내부 클래스의 필드

int inDate;
public InnerClass() {} : 내부 클래스 생성자
public void showInner() {} : 내부 클래스 메서드

  • showInner메서드, 내부에서 외부의 필드에 접근한다.
    얘도 하나의 필드로 쳐서 각 접근 권한 제어자를 붙일 수 있다. OutClass를 main으로 인식하게 된다.

출력 결과 ( 어디서 출력이 됬을까? )

외부 클래스 생성자 호출 됨.
: OutClass out = new OutClass();
내부 클래스의 생성자 호출 됨.
: OutClass.InnerClass in = out.new InnerClass();
내부 클래스의 메서드 호출 됨.
:System.out.println("내부 클래스의 메서드 호출 됨.");
outDate : 20
: System.out.println("outDate : " + outData);
외부 클래스의 메서드 호출 됨.
: showOuter();

0개의 댓글

관련 채용 정보