ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210818_내부클래스
    JAVA 2021. 8. 18. 10:27

    내부클래스

    특정 클래스 내에 또 다른 클래스가 정의되는 것을 의미. 이런 내부 클래스가 필요한 이유는 지금까지 작업해왔던 클래스들과는 다르게 독립적이기는 않지만 하나의 멤버처럼 사용할 수 있다.

    내부 클래스는 외부 클래스의 모든 멤버들을 마치 자신의 멤버처러 사용 가능. static 내부 클래스는 제외하고는 다른 내부 클래스는 항상 외부 클래스를 통해야 생성 가능.

     

     

    (예제)

    class OuterObj{

     

    //내부클래스: 아웃클래스 안에서만 사용가능

    //특정클래스에서만 사용하는 클래스가 필요한 경우 

    //멤버내부클래스: 하나의 객체로 인식

    class InnerObj{

    public void write() {

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

    }

    }

     

    //외부

    public void disp() {

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

     

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

    InnerObj inObj=new InnerObj();  //외부클래스에서 내부클래스 객체 생성

    inObj.write();

    }

    }

     

     

    public class InnerClassEx03 {

     

    public static void main(String[] args) {

     

    //외부클래스 생성

    OuterObj outerObj=new OuterObj();

    outerObj.disp();

     

    //메인에서 내부클래스의 메서드 선언은 외부를 통해서만 가능

    OuterObj.InnerObj obj=new OuterObj().new InnerObj();  //OuterObj.InnerObj obj=outerObj.new InnerObj();  이것도 가능

    obj.write();

    }

    }

     

    //결과

    외부클래스의 메서드

    외부에서 내부클래스의 메서드 호출

    내부클래스의 메서드

     

    내부클래스의 메서드

     

     

    ~~~~~~~~~~~~~~~~~~~~

     

     

    (예제)

    class Outer{

     

    String name="홍길동";

    int age=22;

    String addr="Seoul";

    int grade=3;

     

    //내부클래스

    class Inner1{

    //내부클래스에선 외부클래스 멤버 변수 사용 가능

    public void disp1() {

    System.out.println("***Inner1***");

    System.out.println("이름: "+name+", 나이: "+age);

    }

    }

     

    //내부클래스2

    class Inner2{

    public void disp2() {

    System.out.println("***Inner2***");

    System.out.println("지역: "+addr+", 학년: "+grade);

    }

    }

     

     

    //외부클래스의 메서드

    public void disp() {

    //외부클래스에서 내부클래스 선언

    Inner1 in1=new Inner1();

    in1.disp1();

     

    Inner2 in2=new Inner2();

    in2.disp2();

    }

    }

     

    public class InnerClassEx04 {

     

    public static void main(String[] args) {

     

    Outer out=new Outer();

    out.disp();

     

    System.out.println("---------------");

     

    System.out.println("다른 클래스 외부 안 통하고 직접 내부 호출");

    Outer.Inner1 in1=new Outer().new Inner1();

    in1.disp1();

     

    Outer.Inner2 in2=new Outer().new Inner2();

    in2.disp2();

    }

    }

     

    //결과

    ***Inner1***

    이름: 홍길동, 나이: 22

    ***Inner2***

    지역: Seoul, 학년: 3

    ---------------

    다른 클래스 외부 안 통하고 직접 내부 호출

    ***Inner1***

    이름: 홍길동, 나이: 22

    ***Inner2***

    지역: Seoul, 학년: 3

     

     

    ~~~~~~~~~~~~~~~~~~~~

     

     

    (예제)

    class Outer1{

    int a=10;

    static int b=20;

     

    class Inner1{

    int c=30;

    //static int d=40;  내부클래스에서는 static 변수 선언 불가능

     

    public void write() {  //내부클래스 메서드

    System.out.println("외부인스턴스 변수 a= "+a);

    System.out.println("외부정적변수 b= "+b);

    System.out.println("외부변수 c= "+c);

    }

    }

    }

     

    public class InnerMemberEx07 {

     

    public static void main(String[] args) {

    //내부메서드 바로 접근.. 외부클래스 통해서만 생성가능

    Outer1.Inner1 in1=new Outer1().new Inner1();

    in1.write();

    }

    }

     

    //결과

    외부인스턴스 변수 a= 10

    외부정적변수 b= 20

    외부변수 c= 30

     

     

    ~~~~~~~~~~~~~~~~~~~~

     

     

    (예제)

    class Server2{

    //외부클래스

    int a=10;

    static int b=20;

     

    static class Client2{

    //내부클래스

    int c=30;

    static int d=40;  //내부클래스에 static 변수를 넣고 싶으면 클래스 앞에 static 붙이기

     

    public void write() {

    //System.out.println("외부일반변수 a="+a);

    //정적변수클래스 내에서는 일반변수 불가능

    System.out.println("외부static변수 b="+b);

    System.out.println("내부일반변수 c="+c);

    System.out.println("내부static변수 d="+d);

    }

    }

    }

     

     

    public class InnerMemberEx08 {

     

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Server2.Client2 client=new Server2.Client2();

    client.write();

    }

    }

     

    //결과

    외부static변수 b=20

    내부일반변수 c=30

    내부static변수 d=40

    'JAVA' 카테고리의 다른 글

    210818_익명내부클래스+상속  (0) 2021.08.18
    210818_익명내부클래스  (0) 2021.08.18
    210817_스캐너+다향성+switch  (0) 2021.08.17
    210817_Abstract+배열  (0) 2021.08.17
    210817_인터페이스+다형성  (0) 2021.08.17

    댓글

Designed by Tistory.