생성자와 내부 클래스

Nak Jun Choi·2022년 11월 4일

생성자(Constructor)

생성자란?

  • 객체를 생성하는 역할을 하는 클래스의 구성 요소로서, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.

  • new 키워드를 이용해 객체를 생성할 때 호출된다.

  • 생성자의 조건

    • 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.
    • 생성자는 리턴 타입이 없다.
  • 오버로딩이 가능하므로 한 클래스내에 여러 개의 생성자가 존재할 수 있다.

기본 생성자(Default Constructor)

  • 모든 클래스에는 반드시 하나 이상의 생성자가 존재해야한다.(생성자를 따로 만들지 않을시 컴파일러가 자동으로 기본 생성자를 추가해줌.)

매개변수가 있는 생성자

  • 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화 하는데 사용된다.

this()

  • 생성자도 상호 호출이 가능하다. 이를 위해 사용하는 것이 바로 this() 메서드이다.
  • this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다.
  • this() 메서드를 사용하기 위해서는 크게 두 가지의 조건이 있다.
    • this() 메서드는 반드시 생성자의 내부에서만 사용할 수있다.
    • this() 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.

this

  • 인스턴스 변수와 매개변수를 구분해주기 위한 용도로 주로 사용되는 방법이 this 키워드이다.
  • this는 인스턴스 자신을 가르키며, 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this를 통해서 인스턴스 자신의 변수에 접근할 수 있다.

내부 클래스

내부 클래스란?

  • 클래스 내에 선언된 클래스이다.
  • 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다.
  • 내부 클래스를 사용하면 외부 클래스의 멤버들에 쉽게 접근할 수 있고, 코드의 복잡성을 줄일 수 있다.
  • 외부적으로 불필요한 데이터를 감출 수 있어 캡슐화를 달성하는 데 유용하다.
    class Outer { // 외부 클래스

        class Inner {
            // 인스턴스 내부 클래스	
        }

        static class StaticInner {
            // 정적 내부 클래스
        }

        void run() {
            class LocalInner {
            // 지역 내부 클래스
            }
        }
} 
  • 종류선언 위치사용 가능한 변수
    인스턴스 내부 클래스(instance inner class)외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스)외부 인스턴스 변수, 외부 전역 변수
    정적 내부 클래스(static inner class)외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스)외부 전역 변수
    지역 내부 클래스(local inner class)외부 클래스의 메서드나 초기화블럭 안에 선언외부 인스턴스 변수, 외부 전역 변수
    익명 내부 클래스(anonymous inner class)클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스외부 인스턴스 변수, 외부 전역 변수

멤버 내부 클래스

  • 인스턴스 내부 클래스

    • 객체 내부의 멤버의 형태로 존재한다.

    • 외부 클래스의 모든 접근 지정자의 멤버에 접근할 수 있다.

      class Outer { //외부 클래스
        private int num = 1; //외부 클래스 인스턴스 변수
        private static int sNum = 2; // 외부 클래스 정적 변수
      
        private InClass inClass; // 내부 클래스 자료형 변수 선언
      
        public Outer() {
            inClass = new InClass(); //외부 클래스 생성자
        }
      
        class InClass { //인스턴스 내부 클래스
            int inNum = 10; //내부 클래스의 인스턴스 변수
      
            void Test() {
                System.out.println("Outer num = " + num + "(외부 클래스의 인스턴스 변수)");
                System.out.println("Outer sNum = " + sNum + "(외부 클래스의 정적 변수)");
            }
        }
      
        public void testClass() {
            inClass.Test();
        }
      }
      
      public class Main {
          public static void main(String[] args) {
              Outer outer = new Outer();
              System.out.println("외부 클래스 사용하여 내부 클래스 기능 호출");
              outer.testClass(); // 내부 클래스 기능 호출
          }
      }
      
      // 출력값
      
      외부 클래스 사용하여 내부 클래스 기능 호출
      Outer num = 1(외부 클래스의 인스턴스 변수)
      Outer sNum = 2(외부 클래스의 정적 변수)
  • 정적 내부 클래스

    • 내부 클래스가 외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있게 할때 사용한다.

      class Outer { //외부 클래스
        private int num = 3; //내부 클래스의 인스턴스 변수
        private static int sNum = 4;
      
        void getPrint() {
            System.out.println("인스턴스 메서드");
        }
      
        static void getPrintStatic() {
            System.out.println("스태틱 메서드");
        }
      
        static class StaticInClass { // 정적 내부 클래스
            void test() {
                System.out.println("Outer num = " +sNum + "(외부 클래스의 정적 변수)");
                getPrintStatic();
                // num 과 getPrint() 는 정적 멤버가 아니라 사용 불가.
            }
        }
      }
      
      public class Main {
          public static void main(String[] args) {
              Outer.StaticInClass a = new Outer.StaticInClass(); //정적 이너 클래스의 객체 생성
              a.test();
          }
      }
      
      //출력값
      Outer num = 4(외부 클래스의 정적 변수)
      스태틱 메서드
  • 지역 내부 클래스

    • 메서드 내에서 정의되는 클래스이다.
    • 지역 변수와 비슷하게 메서드 내부에서만 사용 가능하다.
profile
HelloWorld

0개의 댓글