본문 바로가기

프로그램언어/자바

클래스3

Inner 클래스

내부 클래스란 클래스안에 다른 클래스가 정의 되는 것을 말한다.

내부 클래스는 멤버형태로 클래스를 포함할 수 있으며 중첩되는 클래스의 개수는 제한이 없다.

내부 클래스를 포함하는 바깥 클래스를 Outer클래스라고하며 내부에 포함된 클래스를 Inner클래스라한다.

 

Inner클래스의 특징 및 장점

Inner클래스는 Outer클래스의 멤버를 마치 지신의 멤버처럼 사용할 수 있다. Outer클래스 멤버의 접근 지정자가 private 일지라도 접근 할 수 있다.

Inner클래스 안에 static변수를 선언 할 수 없다. 단 static Inner클래스는 선언 기능하다.

Inner클래스의 접근은 반드시 Outer클래스를 통해서 접근 할 수 있다. 단 static Inner클래스는 바로 접근 가능하다.

소스파일을 컴파일을 하면 Inner클래스는 Outer$Inner.class 형식으로 클래스 파일이 생성된다.

정의된 위치에 따라서 다양한 형태의 Iner클래스가 제공된다.

 

Inner클래스의 종류

종류 설명
member Outer클래스의 멤버변수나 메소드처럼 클래스가 정의된 경우이다.
local Outer클래스의 특정 메소드안에서 클래스가 정의된 경우이다.
static static 키워드를 이용해서 클래스가 정의된 경우이다.
annoymous 익명 클래스를 이용해서 클래스가 정의된 경우이다.

 

사용형식

Outer 객체1 = new Outer(); (Outer 클래스 객체 생성 방법)

Outer.Inner 객체2 = 객체1.new Inner(); (Inner 클래스 객체 생성 방법)

 

 

 


Member Inner 클래스 사용하기 예제

외부 클래스의 멤버로 내부 클래가 정의된 클래스이다.

 

public class Outer {

    public int a = 10;

    private int b = 20;

    static int c = 30;

 

    class Inner{

        public void print() {

            System.out.println("전역 변수" + a);

            System.out.println("지역 변수 " + b);

            System.out.println("정적 변수 " + c);

        }

    }//end Inner

 

    public static void main(String[] args) {

        Outer outer = new Outer(); 

        //Inner 클래스를 사용하기 위해서는 반드시 Outer 클래스를 먼저 생성해야 한다.

        //또한 Outer 클래스를 통해서만 접근 할 수 있다.

 

        Outer.Inner inner = outer.new Inner();

        inner.print();

    }

}

 

실행결과]

전역 변수 10

지역 변수 20

정적 변수 30

 

 

 


Local Inner클래스 사용하기 예제

외부 클래스의 메소드 내에서 정의되는 클래스를 말한다.

메소드 안에서 정의되었기 때문에 로컬 변수처럼 인식된다. 따라서 메소드 호출될 때 생성되며 메소드가 종료될 때 삭제된다.

 

public class Outer {

    public int a = 10;

    private int b = 20;

    static int c = 30;

 

    public void outerMethod() {

        int d = 40;

        final int e = 50;

 

        class Inner{

            public void print() {

                System.out.println("전역변수" + a);

                System.out.println("지역변수" + b);

                System.out.println("정적변수" + c);

                //System.out.println("함수내 지역변수" + d);

                System.out.println("함수내 상수변수" + e);

            }

        }

 

        Inner local_test = new Inner();

        local_test.print();

    }

 

    public static void main(String[] args) {

        Outer outer = new Outer();

        outer.outerMethod();

    }

}

 

실행결과]

전역변수 10

지역변수 20

정적변수 30

함수내 상수변수 50

 

 

 


static Inner클래스 사용하기 예제

내부 클래스가 static으로 지정된 클래스를 말한다.

내부 클래스 멤버가 static으로 지정되었으면 내부 클래스도 반드시 static으로 지정해야 한다.

 

class Outer{

    private int a = 10;

    private static int b = 100;

 

    void method0() {

        System.out.println("Outer Class내의 메소드");

    }

 

    static void method1() {

        System.out.println("Outer Class내의 정적 메소드");

    }

    static class Inner {

        private int c=200;

        static int d = 300;

        public void print() {

            // System.out.println("a = " + a);

            System.out.println("b = " + b);

            System.out.println("c = " + c);

            System.out.println("d = " + d);

 

            // method0();

            method1();

        }

    }

}

public class Ex02 {

    public static void main(String[] args) {

        Outer.Inner test = new Outer.Inner();

        test.aaa();

    }

}

 

실행결과]

b = 100

c = 200

d = 300

Outer Class내의 정적 메소드

 

 

 


Anonymous Inner클래스 사용하기 예제

클래스를 값(arguments : 메소드 호출시 넣어주는 값)으로 사용하는 클래스를 말한다. 

 

ex1]

class Inner {

    int y = 200;

    public Inner() {

        this.disp();

    }

    public void disp() { }

}

public class Ex04 {

 

    public static void main(String[] args) {

        final int x = 100;

        new Inner() {

            public void disp() {

                System.out.println("Default 생성자");

                System.out.println("x = " + x);

                System.out.println("y = " + y);

            }

        };

    }

}

 

실행 결과]

Default 생성자
x = 100
y = 200

 

 

ex2]

interface Anony {

    public void print();

}

public class AnonyTest {

    public void printB(Anony a) {

        a.print();

    }

    public static void main(String[] args) {

        AnonyTest t = new AnonyTest();

        t.printB(new Anony() {

            public void print() {

                System.out.println("익명 클래스 사용 중입니다.");

            }

        });

    }

}

실행결과]

익명 클래스 사용 중입니다.

 

 


1. 중첩 클래스를 이용하여 프로그램을 작성하시오. 학생 이름을 입력하고 출력하는 클래스 안에 점수를 입력 받아 출력하는 클래스로 처리되도록 프로그램을 작성하시오.

입력 예] 출력 예]
이름 : 홍길동
국어 : 70
영어 : 60
수학 : 80
학생 이름 : 홍길동
국어 점수 : 70
영어 점수 : 60
수학 점수 : 80
총점 : 210
평균 : 70.0

 

2. 정적 중첩 클래스를 이용하여 프로그램을 작성하시오. 사람의 키와 몸무게를 입력받아 출력하고 두 눈의 시력을 입력받아 평균시력을 출력하는 프로그램을 작성하시오.

입력 예] 출력 예]
 : 165
몸무게 : 702
왼쪽 눈 : 1.0
오른쪽 눈 : 0.8
당신의 키는 165.0이고 몸무게는 702.0Kg 입니다.
왼쪽 눈과 오른쪽 눈 시력은 1.0, 0.8 이고 평균 시력은0.9입니다.

 

 

 

 

 

'프로그램언어 > 자바' 카테고리의 다른 글

학생 관리 프로그램  (0) 2021.08.24
람다식  (0) 2021.06.11
클래스2  (0) 2021.04.12
클래스1  (0) 2021.02.17
스윙 메뉴만들기  (0) 2021.01.29