본문 바로가기

JAVA/복습

내부 클래스 - instance 클래스/ static 클래스

내부 클래스

: 클래스 안에 선언된 클래스

 

어느 위치에 선언하느냐에 따라서 4가지 형태가 있을 수 있다.


첫번째.

클래스 안에 인스턴스 변수, 즉 필드를 선언하는 위치에 선언되는 경우, 이런 경우를 보통 중첩클래스 혹은 인스턴스 클래스라고 한다.

 

package Java02;

public class InnerExam {
    // 내부클래스
    // 필드를 선언하는 위치에 클래스를 선언하는 것이다.

    // 1. Cal이라는 클래스 선언
    class Cal{
        // 클래스를 선언하는 거니깐 똑같이 필드를 선언할 수도 있고
        // 메소드를 정의해 놓을 수도 있다.
        int value = 0;
        public void plus(){
            value++;
        }
    }
}

 

이렇게 내부에 존재하고 있는 Cal이라는 객체를 사용하기위해서는 어떻게해야할까?

 

 이럴땐 반드시 외부에있는 InnerClass -> InnerExam이라는 클래스가 먼저 만들어져야한다.
(혼자 독자적으로 생성될 수  없다.)

InnerExam1.Cal cal = t.new Cal();

 

그리고 InnerExam이라는 클래스를 이용해서 new Cal(); 해야지만 해당 Cal이라는 객체를 만들어 낼 수 있다.

t.new Cal();


이 Cal 이라는 객체를 사용하기위해서는 또 변수가 선언되어야한다.
타입이 선언되는 방법은 바깥쪽클래스타입.내부의타입으로 사용해야한다.
변수를 선언하는 방법은 같다.

InnerExam.Cal cal = t.new Cal();

 

public static void main(String[] args) {

        
        InnerExam t = new InnerExam();
        
        InnerExam.Cal cal = t.new Cal();

        // 이제 사용하는 방법은 같다
        cal.plus();
        System.out.println(cal.value);

    }

 

-- 전체코드

package Java02;

public class InnerExam {
    // 내부클래스
    // 필드를 선언하는 위치에 클래스를 선언하는 것이다.

    // 1. Cal이라는 클래스 선언
    class Cal {
        // 클래스를 선언하는 거니깐 똑같이 필드를 선언할 수도 있고
        // 메소드를 정의해 놓을 수도 있다.
        int value = 0;

        public void plus() {
            value++;
        }
    }


    public static void main(String[] args) {

        // 이렇게 내부에 존재하고 있는 Cal이라는 객체를 사용하기위해서는 어떻게해야할까?
        // 이럴땐 반드시 외부에있는 InnerClass -> InnerExam이라는 클래스가 먼저 만들어져야한다.
        // 혼자 독자적으로 생성될 수  없다.
        InnerExam t = new InnerExam();
        // 그리고 InnerExam이라는 클래스를 이용해서 new Cal()해야지만 해당 Cal()이라는 객체를 만들어 낼 수 있다.
        // t.new Cal();

        // 이 Cal()이라는 객체를 사용하기위해서는 또 변수가 선언되어야한다.
        // 타입이 선언되는 방법은 바깥쪽클래스타입.내부의타입으로 사용해야한다.
        // 변수를 선언하는 방법은 같다.
        InnerExam.Cal cal = t.new Cal();

        // 이제 사용하는 방법은 같다
        cal.plus();
        System.out.println(cal.value);

    }
}

 

-- 실행결과

 


 

두번째.

내부 클래스가 static으로 정의된 경우, 정적 중첩 클래스 또는 static 클래스라고 한다.

이 내부클래스는 위에 선언한 인스턴스변수로 선언한 클래스와 비슷한데, 이 때 필드가 정적인 필드로 선언되는 경우를 말한다. 

 

package Java02;

public class InnerExam1 {
    // 내부클래스를 static 하게 선언
    static class Cal {
       
        int value = 0;

        public void plus() {
            value++;
        }
    }
}

 

이때 이 Cal 은 정적인 필드와 같기 때문에 위와 다르게 사용해야한다.
위에서는 Cal이라는 내부 클래스에 접근하기 위해서 외부에 있는 InnerExam을 반드시 먼저 생성한 다음에 접근했어야 했지만
static클래스는  정적인 필드이기 때문에 생성할 필요가 없다.

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

 

-- 전체코드

package Java02;

public class InnerExam1 {
    // 내부클래스를 static 하게 선언
    static class Cal {

        int value = 0;

        public void plus() {
            value++;
        }
    }

    public static void main(String[] args) {
       
        InnerExam1.Cal cal = new InnerExam1.Cal();

        cal.plus();
        System.out.println(cal.value);
    }
}

-- 실행 결과

'JAVA > 복습' 카테고리의 다른 글

Exception - 예외  (0) 2021.10.13
내부클래스 - local 클래스 / 익명클래스  (0) 2021.10.13
인터페이스(interface)의 default method  (0) 2021.10.12
인터페이스(interface) 사용  (0) 2021.10.12
인터페이스(interface) 정의  (0) 2021.10.12