본문 바로가기
💾 Backend/자바

💖자바 내부 클래스💖

by 정람지 2023. 6. 2.

❣️내부 클래스❣️

클래스 내부에 선언한 클래스

class 외부클래스{
	class 내부클래스 {
    }
}

💌 인스턴스 내부 클래스

인스턴스 변수를 선언할 떄와 같은 위치에 선언

외부 클래스 내부에서만 생성하여 사용하는 객체를 선언할 때 사용 (다른 외부 클래스에서 사용할 일이 없을 때)

인스턴스 외부 클래스 생성 후 인스턴스 내부 클래스 생성됨 (외부 클래스 생성 전 사용 불가)

class 외부클래스{
	private 내부클래스 내클;
    public 외부클래스(){
    	내클 = new 내부클래스();
    }
    
    class 내부클래스 {
    }
    
    public void 내부클래스사용(){
    	내부클래스.안에든거사용;
    }
}

외부 클래스의 private 멤버 내부 클래스에서도 사용 가능

내부 클래스 내부에 정적 변수/메서드 사용 불가

 

문법적으로는 내부 클래스를 private로 설정하지 않았을 시 타 클래스에서도 사용이 가능하긴 함


💌 정적 내부 클래스

내부 클래스가 외부 클래스 생성과 무관하게 사용할 수 있고 / 정적 변수를 사용할 수 있어야 할 때 사용

class 외부클래스{

    int 외부클래스의_인스턴스변수 =0;
    static int 외부클래스의_정적변수 =0;
    
    static class 정적내부클래스 {
    	int 정적내부클래스의_인스턴스변수 =0;
        static int 정적내부클래스의_정적변수 =0;
        
        void 정적내부클래스의_일반메서드(){
            // 외부클래스의_인스턴스변수 사용불가X
            // 외부클래스의_정적변수 사용가능O
            // 정적내부클래스의_인스턴스변수 사용가능O
            // 정적내부클래스의_정적변수 사용가능O
        }
        
        static void 정적내부클래스의_정적메서드(){
            // 외부클래스의_인스턴스변수 사용불가X
            // 외부클래스의_정적변수 사용가능O
            // 정적내부클래스의_인스턴스변수 사용불가X
            // 정적내부클래스의_정적변수 사용가능O
        }
        
    }
}

 

다른 클래스에서 외부 클래스의 생성 없이 정적 내부 클래스 생성 가능

외부클래스.정적내부클래스 정내클 = new 외부클래스.정적내부클래스();

다른 클래스에서 외부 클래스의 생성 없이 정적 내부 클래스의 멤버 이용 가능

외부클래스.정적내부클래스.정적내부클래스의_일반메서드();

 

정적 내부 클래스의 일반 메서드와 정적 메서드가 다른 점이 무엇인가?

정적 내부 클래스의 인스턴스 변수 사용가능여부만 다른 것인가? 무슨 의미가 있지?

둘 다 외부 클래스의 생성과 무관하게 바로 쓸 수 있는 것 아닌가?

 


💌 지역 내부 클래스

메서드 내에 정의한 클래스

메서드 내에서만 사용 가능

class 외부클래스{
    
    외부클래스의_메소드(매개변수 매개){
    	int 외부클래스의_메소드의_지역변수 =0;
        
    	class 지역내부클래스{
        	// 외부클래스의_메소드의_지역변수, 매개 사용 -> 상수체인지
        }
        
        return new 지역내부클래스();
    }
}
외부클래스 외클 = new 외부클래스();
지역내부클래스 지내클 = 외클.메서드();
지내클.지내클의멤버; //사용

외부클래스를 생성하고 지역내부클래스가 있는 메소드의 리턴을 받는 형식으로 사용

메서드의 호출이 끝나면 메서드의 지역변수는 사라지지만, 호출 이후로도 지역내부클래스에서 쓰였던 지역변수는 계속 쓰일 수 있으므로

지역내부클래스에서 쓰인 지역변수는 상수 처리됨 ( 값 변경 불가 )(컴파일시 자동변경)


💌 익명 내부 클래스

클래스 이름을 사용하지 않는 클래스 

단 한 번만 인터페이스를 상속한 클래스를 생성하여 사용할 때

class 외부클래스{
    
    외부클래스의_메소드(){
    
    	// 1. 클래스 이름을 빼고 클래스를 바로 생성하는 방법
    	return new 인터페이스(){
        	// 인터페이스 구현
        };
        
        // 2. 인터페이스나 추상 클래스형 변수를 선언하고 클래스를 생성해 대입하는 방법
    	인터페이스 인터 = new 인터페이스(){
        	// 인터페이스 구현
        };
    }
}

 

- 안드로이드 프로그래밍에서 위젯의 이벤트를 구현하는 핸들러를 구현할 때 사용 , 등

으악


정적 메서드에서는 인스턴스 변수 사용 불가! 지만

정적 내부 클래스는 인스턴스 변수를 가질 수 있음.

 

+

지역 변수는 메서드가 호출될 때 스택 메모리에 생성되고 메서드의 수행이 끝나면 메모리에서 사라짐

 

'💾 Backend > 자바' 카테고리의 다른 글

💞Static 정적 멤버💞  (0) 2023.06.10
💞모듈/패키지💞  (0) 2023.06.09
💖자바 스트림💖  (1) 2023.06.02
💕자바 탐구 - 배틀게임 제작💕  (2) 2023.05.28
💗자바 ArrayList 클래스💗  (1) 2023.05.26