본문 바로가기

JAVA

JAVA(2022.05.11)-내부 클래스

내부클래스

 

why?

-외부클래스에 쉽게 접근할 수 있다. 

-코드가 더욱 간단해진다.

-서로 관련 있는 클래스를 논리적으로 묶어서 코드의 캡슐화를 증가시킨다.

 

 

1.중첩클래스(인스턴스 클래스)

- 외부클래스의 멤버변수 선언위치에 선언한다.

- 외부클래스의 인스턴스 멤버들과 사용할 목적으로 선언

 

ex)

    public class InnerExam1{
        class Cal{
            int value = 0;
            public void plus(){
                value++;
             
            }
        }

        public static void main(String args[]){
            InnerExam1 t = new InnerExam1();
            InnerExam1.Cal cal = t.new Cal();
            cal.plus();
            //생성된내부클래스 객체에서 레퍼런스를 통해 내부클래스의 메소드를 사용할 수 있다.
            System.out.println(cal.value);

        }
    }

내부 클래스의 객체를 생성하기 위해서는 외부클래스의 객체를 먼저 생성한 뒤, 

 

외부클래스.내부클래스(레퍼런스) 생성할 객체이름 = 생성한 외부클래스.new 내부클래스();

방식으로 선언하여 내부클래스 객체를 사용할 수 있다. 

 

 

 

2.정적(static) 내부 클래스

- 외부클래스 멤버변수 선언위치에 선언한다.

- static멤버처럼 다루어진다.

 

ex)

    public class InnerExam2{
        static class Cal{
            int value = 0;
            public void plus(){
                value++;
            }
        }

        public static void main(String args[]){
            InnerExam2.Cal cal = new InnerExam2.Cal();
            cal.plus();
            System.out.println(cal.value);

        }
    }

static 내부 클래스는 외부클래스의 객체를 생성할 필요없이 

외부클래스.static내부 클래스 생성할 내부 클래스의 객체 이름 = new 외부클래스.static내부 클래스();

로 선언하면 된다.

 

 

3.지역 중첩 클래스

- 외부클래스의 메서드나 초기화 블럭안에 선언한다.

- 선언된 내부에서만 사용이 가능하다. 

- static 멤버를 가질 수 없다

 

ex)

    public class InnerExam3{
        public void exec(){
            class Cal{
                int value = 0;
                public void plus(){
                    value++;
                }
            }
            Cal cal = new Cal();
            cal.plus();
            System.out.println(cal.value);
        }


        public static void main(String args[]){
            InnerExam3 t = new InnerExam3();
            t.exec();
        }
    }

 

 

 

 

 

 

*본 게시물은 프로그래머스<자바입문>강의를 복습하며 작성한 글입니다.