Archives
Recent Posts
«   2025/02   »
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
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[7일차 Java] 중첩 클래스 본문

Computer/Java

[7일차 Java] 중첩 클래스

Wise-99 2023. 5. 6. 22:34

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 중첩 클래스란?

  • 클래스 안에 클래스를 만든 개념
  • 클래스 내부의 클래스는 외부 클래스의 객체를 통해서 생성할 수 있다.
  • 특정 클래스에 정의된 멤버를 자주 사용하는 경우 사용한다.
  • 장점 : 내부 클래스에서 외부 클래스의 멤버를 사용하는 것이 자유롭다.
  • 단점 : 내부 클래스의 객체를 생성하려면 반드시 외부 클래스의 객체를 생성해야 한다.

 

✔️ 일반 중첩 클래스 코드 및 해석

public class MainClass {
	public static void main(String[] args) {
		// 외부 클래스의 객체를 생성한다.
		OuterClass1 out1 = new OuterClass1();
        
		OuterClass1.InnerClass1 in1 = out1.new InnerClass1();
		System.out.printf("in1 : %s\n", in1);
	}
}

// 일반 중첩 클래스
class OuterClass1 {
	
	int outerMemberA = 100;
    
	public void outerMethodA() {
		System.out.println("outerMethod!");
        
		// 내부 클래스의 멤버를 사용한다.
		System.out.printf("innerMemberA : %d\n", innerMemberA); <<< 불가능
		innerMethodA();                                         <<< 불가능
	}
	
	class InnerClass1{
		
		int innerMemberA = 200;
		
		public void innerMethodA() {
			System.out.println("innerMethod!");
		}
		
		public void innerMethodB() {
			// 외부 클래스에 정의된 멤버를 사용한다.
			System.out.printf("outerMemberA : %d\n", outerMemberA);
			outerMethodA();
		}
	}
}
  • OuterClass1.InnerClass1 in1 = out1.new InnerClass1();
    • 위에서 생성된 외부 클래스(OuterClass1)의 객체(out1)을 통해 내부 클래스(InnerClass1)의 객체를 생성한다.
  • System.out.printf("innerMemberA : %d\n", innerMemberA);
    • 해당 코드가 있는 메서드는 외부 클래스(OuterClass1)의 메소드이다.
    • 외부 클래스에서는 내부 클래스의 메서드나 변수를 사용할 수 없다.
    • 오류가 발생한다.

 


 

📖 static 중첩 클래스

  • 장점
    • 모르겠다...
  • 단점
    • 내부 클래스가 외부 클래스의 멤버를 자유롭게 사용할 수 있다는 특징이 사라져버린다.
    • 오로지 외부 클래스에 정의된 static 변수나 메서드만 사용이 가능하다.

 

✔️ Static 중첩 클래스 코드 및 해석

public class MainClass {

	public static void main(String[] args) {
        
        OuterClass2.InnerClass2 in2 = new OuterClass2.InnerClass2();
        System.out.printf("in2 : %s\n", in2);
	}

}

// static 중첩 클래스
class OuterClass2 {
	
	static int outerMemberA = 200; 	// 외부 클래스에 정의된 static 변수
    int outerMemberB = 300; 		// 외부 클래스에 정의된 멤버 변수
	
	public void outerMethod1() {
		// 내부 클래스의 static 멤버 사용
		System.out.println(InnerClass2.innerMemberA); // 100
	}

	static class InnerClass2 {
		
		static int innerMemberA = 100; // 내부 클래스에 정의된 static 변수
		
		public void innerMethod1() {
			
			System.out.println(outerMemberA); // 외부 클래스에 정의된 static 변수
			
			// 외부 클래스에 정의된 멤버 변수
			System.out.println(outerMemberB); <<< 불가능
		}
	}
}
  • Main Class
    • OuterClass2.InnerClass2 in2 = new OuterClass2.InnerClass2();
      • static 중첩 클래스는 외부 클래스의 객체 없이 바로 생성이 가능하다.
  • OuterClass2
    • System.out.println(InnerClass2.innerMemberA);
      • innerMemberA는 내부 클래스(InnerClass2)의 멤버 변수이다.
      • innerMemberA는 static을 사용한 변수이다.
      • static을 사용하면 객체 생성 없이 바로 접근이 가능하다.
      • 따라서 100이 출력된다.
  • InnerClass2
    • System.out.println(outerMemberA);
      • outerMemberA는 외부 클래스(OuterClass2)의 멤버 변수이다.
      • outerMemberA는 static을 사용한 변수이다.
      • static을 사용하면 객체 생성 없이 바로 접근이 가능하다.
      • 또한 내부 클래스는 외부 클래스의 변수나 메서드에 접근이 가능하다.
      • 따라서 200이 출력된다.
    • System.out.println(outerMemberB);
      • outerMemberB는 외부 클래스(OuterClass2)의 멤버 변수이다.
      • outerMemberB는 static을 사용하지 않은 멤버 변수이다.
      • 내부 클래스(InnerClass2)는 static을 사용한 클래스이다.
      • 내부 클래스에 static을 사용하게 되면 외부 클래스의 객체가 생성된다는 보장을 받지 못한다.
      • 그러나 외부 클래스(OuterClass2)는 객체를 생성해야지만 접근할 수 있다.
      • 따라서 외부 클래스의 멤버 변수나 메서드를 사용할 수 없다.
      • 해당 코드는 오류가 발생한다.

 


 

📖 지역 중첩 클래스

  • 메서드 내부에 클래스를 작성하여 사용하는 클래스이다.
  • 메서드의 수행이 끝나면 클래스가 메모리에서 사라지기 때문에 메서드 외부에서는 클래스를 사용할 수 없다.
  • 내부 클래스는 class 파일 조차 생성되지 않는다.
  • 장점
    • 메서드에서 사용하는 클래스를 작성할 때 다른 곳에 작성하지 않고 바로 작성해 사용할 수 있다.
  • 단점
    • 메서드 내부에서만 사용이 가능하다.

 

✔️ 지역 중첩 클래스 코드 및 해석

class OuterClass3{
    
    // 지역 중첩클래스 타입의 멤버변수 선언
    InnerClass3 in30; <<< 불가능
    
    public void outerMethod3() {
        // 지역 중첩 클래스
        class InnerClass3{
            
        }
        // 지역 중첩 클래스 객체 생성
        InnerClass3 in3 = new InnerClass3();
        System.out.println(in3);
    }
    
    // 다른 메서드에서 사용(불가)
    public void outerMethod30(InnerClass3 in3) {
        InnerClass3 in33;
    }
}
  • InnerClass3 in30;
    • 내부 클래스(InnerClass3)는 메서드 내부에 작성되어 메서드가 종료되면 사라진다.
    • 따라서 외부 클래스(OuterClass3)에서 내부 클래스 타입(InnerClass3)의 변수는 생성하지 못한다.
  • public void outerMethod30(InnerClass3 in3) { ...
    • 내부 클래스는 outerMethod3()의 내부에 선언되어져 있다.
    • 따라서 outerMethod3()의 외부에서는 사용하지 못한다.

 


 

📖 익명 중첩 클래스

  • 클래스의 이름이 없다는 뜻이다.
  • 익명 중첩 클래스는 상속 관계의 클래스를 만드는 것이다.
  • 특정 클래스를 상속받은 클래스를 만듦과 동시에 객체를 생성할 때 사용한다.
  • 메서드를 overriding 하기 위해 주로 사용한다.
  • 특정 클래스를 상속받은 클래스의 객체를 단 하나만 만들어 사용할 때 사용한다.
  • 익명 클래스 파일은 이름이 없기 때문에 클래스 파일 이름이 1로 저장된다.

 

✔️ 익명 중첩 클래스 코드 및 해석

public class MainClass {
	public static void main(String[] args) {

        SuperClass100 s100 = new SuperClass100() {
        	public void superMethod100() {
        		System.out.println("overriding된 메서드");
        	}
        };
        
        s100.superMethod100(); // overriding된 메서드
    }
}

// 익명 중첩 클래스
class SuperClass100 {
	public void superMethod100() {
		System.out.println("superMethod100");
	}
}
  • SuperClass100 s100 = new SuperClass100() { ... }
    • SuperClass100을 상속받은 이름이 없는 클래스를 작성하고 필요한 메서드들을 overriding 한다.
    • SuperClass100의 객체를 만든게 아니다.
  • s100.superMethod100();
    • 위에서 익명 클래스를 통해 오버라이딩된 메서드가 실행된다.
    • 따라서 "overriding된 메서드"가 출력된다.

'Computer > Java' 카테고리의 다른 글

[7일차 Java] Interface(인터페이스)  (0) 2023.05.06
[7일차 Java] Abstract  (2) 2023.05.06
[7일차 Java] final  (0) 2023.05.06
[7일차 Java] Static  (0) 2023.05.06
[6일차 Java] 캡슐화  (0) 2023.05.05