Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

중첩 클래스 본문

프로그래밍 언어/Java

중첩 클래스

세레프 2023. 5. 2. 22:37

 클래스객체를 생성하기 위한 하나의 설계도로, 속성을 변수, 기능을 메서드, 초기값을 생성자를 통해 객체의 특징을 결정한다. 그리고 이러한 클래스는 다른 클래스와 관계를 맺고 상호작용을 하는 경우가 많다. 이러한 클래스들을 독립적인 형태로 선언해서 객체간의 관계를 표현할 수 있지만, 클래스 내에 클래스를 선언하여 관계를 표현하는 경우도 있다. 이를 중첩 클래스라고 한다.

 

중첩 클래스

 중첩 클래스란 클래스 내부에 클래스를 생성하는 클래스로, 두 클래스의 멤버들을 서로 쉽게 접근이 가능하게 하고 코드를 간략하 하기 위해 사용한다.

 중첩 클래스는 클래스 내부에 선언되는 위치에 따라 멤버 클래스, 로컬 클래스로 나뉘며, static키워드의 사용 유무의 따라 정적 클래스, 인스턴스 클래스로 나뉜다. 이때, 중첩 클래스에 접근 제어자를 사용할 수 있다.

  • 인스턴스 멤버 클래스
    1. static 키워드 없이 외부클래스의 멤버변수 위치에 선언한 멤버 클래스
    2. 클래스의 내부에서 인스턴스(객체)멤버처럼 다뤄지며, 인스턴스 멤버, static 멤버들과 상호작용 가능
    3. 클래스 외부에서 객체를 생성하기 위해서는 객체를 생성해야 사용 가능
    4. 클래스 내부에서는 일반 클래스처럼 생성 가능
구조 선언
class 클래스명{ //외부 클래스

    class 클래스명{ //내부 클래스

    }
}
외부 클래스 외부 변수명 = new 외부 클래스( ); //외부 클래스 선언

외부클래스.내부클래스 내부 변수명 =  외부 변수명.new 내부클래스(); //내부 클래스 선언
package pack0502;

class A{
	class InstanceClass{
		static int a = 10;
		int b = 100;
	}
    
	InstanceClass in1 = new InstanceClass();
	
	static void staticMethod() {
//		InstanceClass in1 = new InstanceClass(); //정적 메서드에서는 인스턴스 변수를 선언불가

		int a = 0;	
	}
	
	void instanceMethod() {
		InstanceClass in3 = new InstanceClass();
		in3.b = 300;
		System.out.println("in3.b : "+in3.b);
	}
}
package pack0502;

public class Code1 {
		A a = new A();
        
		a.in1.b = 200;
		System.out.println("a.in1.b : "+a.in1.b);
        	System.out.println("ina.b : "+ina.b);
		a.instanceMethod();
		
		A.InstanceClass ina = a.new InstanceClass();
		System.out.println("ina.b : "+ina.b);
		
	}
	
}

 

  • static 멤버 클래스
    1. 외부클래스의 멤버변수 위치에 static 키워드로 선언한 멤버 클래스
    2. 클래스 내부에서 static 멤버처럼 다루어지며, static 멤버들과 상호작용가능
    3. 클래스 외부에서 객체를 생성하지 않고, 클래스로 직접 접근해서 객체를 생성 가능
    4. 클래스 내부에서는 일반 클래스처럼 생성 가능
구조 선언
class 클래스명{ //외부 클래스

    static class 클래스명{ //내부 클래스

    }
}
외부 클래스.내부클래스 변수명 = new 외부클래스.내부클래스
package pack0502;

class B{
	static class StaticClass{
		static int a = 10;
		int b = 100;
	}	
	
	StaticClass st1 = new StaticClass();
	
	static void staticMethod() {
		StaticClass st2 = new StaticClass();
		System.out.println("st2.b : "+st2.b);
		
	}
	
	void instanceMethod() {
		StaticClass st3 = new StaticClass();
		st3.b = 300;
		System.out.println("st3.b : "+st3.b);
	}
}
package pack0502;

public class Code1 {

	public static void main(String[] args) {
		B b = new B();
		
		B.StaticClass st1 = new B.StaticClass();
		System.out.println("st1.b : "+st1.b);
		System.out.println("st1.a : "+st1.a);
		
		b.instanceMethod();
		b.staticMethod();
		
		st1.a = 20;
		System.out.println("st1.a : "+st1.a);
		
	}
	
}

 

  • 지역 클래스
    1. 외부클래스 안에 선언된 메서드의 내부에 선언하는 클래스
    2. 접근 제한자와 static 키워드를 사용 불가
    3. 스택영역에 존재하기에 메서드 호출~종료까지 메모리에 실행된다. 그래서 메서드 내부에서만 사용 가능
  class 클래스명{ //외부 클래스
    
    타입 메서드명{
        class 클래스명{ //내부 클래스

       }
    }
}
 
package pack0502;

class C{
	int a = 10;
	void localMethod() {
		class LocalClass{
			int a = 10;
			static int b = 100;
		}
		
		LocalClass l1 = new LocalClass();
		
		System.out.println("l1.a : "+l1.a);		
	}
}
package pack0502;

public class Code4 {
	public static void main(String[] args) {
		C c = new C();
		c.localMethod();
	}	
}

 

 

'프로그래밍 언어 > Java' 카테고리의 다른 글

예외 처리  (0) 2023.05.05
익명 객체  (0) 2023.05.03
인터페이스  (0) 2023.04.20
추상화  (0) 2023.04.19
다형성  (0) 2023.04.18
Comments