프로그래밍/자바(java) 융합개발자 2차

[취성패] 자바 배우기 - 선수학습(내부 클래스)

aSpring 2020. 12. 13. 20:09
728x90
728x90

- 클래스에도 아웃소싱과 유사한 기법 적용 가능

-> 클래스 내부에 특정한 처리를 담당하는 클래스를 포함시킬 수 있음

- 내부 클래스 : 클래스 내에 정의된 또 다른 클래스

 

[내부 클래스 정의]

1. 내부 클래스 개요

- 클래스 내에 또 다른 클래스를 포함하는 기법

- 포함하는 클래스를 외부 클래스, 포함되는 클래스를 내부 클래스라 함

- 내부 클래스에서 외부 클래스의 접근은 제한 없이 가능

- 외부 클래스에서 내부 클래스의 멤버 변수나 메서드에 접근시 내부 클래스의 객체를 생성해야 함

class A {     -> 외부 클래스

   class B {   -> 내부 클래스

   }

}

 

- 컴파일 한 뒤에는 내부 클래스 파일이 별도로 생성됨

- 별도로 생성된 파일명 : 외부클래스명$내부클래스명.class

- GUI 프로그래밍에서 이벤트 처리에 활용

 

 

2. 내부 클래스 문법

class OuterExam { -> 외부 클래스

 public OuterExam() { -> 생성자

   System.out.println("외부 클래스의 생성자");

   InnerExam inner = new InnerExam(); -> 내부 클래스 객체 생성

   inner.printExam();

 }

 public void printOuter() {

   System.out.println("외부 클래스의 메서드");

 }

 class InnerExam {  -> 내부 클래스

  public void printExam() {

    System.out.prinln("내부 클래스 메서드");

    printOuter();                            -> 외부 클래스의 메서드를 호출(제한x이 호출 가능)

  }

 }

 public static void main(String args[]) {

   OuterExam outer = new OuterExam();

 }

}

 

[내부 익명 클래스]

1. 내부 익명 클래스 개요

- 일반적으로 클래스는 정의와 생성이 분리되어 있음

- 내부 익명 클래스는 정의와 생성이 통합된 형태이며 클래스의 명칭이 없음

- 클래스의 인스턴스를 메서드 호출 시 매개변수에 넣을 때 사용

- 인스턴스 생성 후 레퍼런스를 유지할 필요가 없을 때 사용

- 익명 클래스는 클래스를 상속하거나 인터페이스를 구현할 때 사용할 수 있음

- 문법

new 부모클래스명(매개변수) {

 클래스 정의;

}

 

2. 내부 익명 클래스 사용

class First {

 public void printMsg() {

  System.out.println("첫 번째 클래스");

 }

}

public class TestMain {

 public static void main(String args[]) {

  First first = new First();

  first.pringMsg();

  first second = new First() {  -> 별도의 클래스를 만들지 않고 즉석에서 클래서 정의, 생성

   public void printMsg() {

     System.out.println("오버라이딩한 첫 번째 클래스");

   } -> 내부 익명 클래스(정의+생성) : second라는 객체를 한번 쓰고 말 때 사용

  };

  second.printMsg();

 }

}

 

ex)

객체a.method(new B()); -> 매개변수로 B라는 객체를 직접 생성해서 넣을 수도 있음

 

+ 내부 익명 클래스 활용

public class HelloProgram {

  interface HelloLanguage {

   public void language();

  }

  public void helloLang() {

   HelloLanguage javalang = new HelloLanguage() {  -> javalang이라는 객체를 클래스를 따로 정의X고 즉석에서 생성

    public void language() {

      System.out.prinln("Java Language");

    }

   };

   javalang.lanuage();

  }

  public static void main(String args[]) {

   HelloProgram myhello = new HelloProgram();

   myhello.helloLang();

  }

}

 

[실습]

public class Exam16_1 {

   public Exam16_1() {

      Sysem.out.prinntln("외부 클래스의 생성자");

      InnerExam inner = new InnerExam();        -> 외부 클래스에서 내부 클래스에 접근하기 위해 객체 생성 반드시!

      inner.printExam();

   }

   public void printOuter() {

      System.out.println("외부 클래스의 메서드");

   }

   class InnerExam {

      public void printExam() {

         System.out.println("내부 클래스 메서드");

         printOuter();

      }

   }

   public static void main(String[] args) {

         Exam16_1 outer = new Exam16_1(); -> 생성함과 동시에 실행됨

   }

}

 

외부 클래스의 생성자

내부 클래스 메서드

외부 클래스의 메서드

728x90
728x90