생성자 와 내부클래스

박대운·2022년 11월 4일
0

Java

목록 보기
1/9

먼저 시작하기 전에 내 이야기를 좀 해보려한다.
블로그를 시작한지 벌써 2주정도 됬는데 아직 매일 블로그를 쓰는 습관이 덜 된 것 같다.
매일 밀린 과제와 이해가 잘 가지않는 공부들을 하다보니 블로그를 쓰지않고 있었다.
사실 핑계이다... 쓸라면 쓸 것을 뭔가 다시 작성하려고 하니 금방 끝날 것 같지도 않고 해서...

생성자 와 내부클래스텍스트

<생성자>

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

2. 인스턴스 생성을 담당하는 것은 new 키워드.

3. 생성자는 인스턴스 변수들을 초기화하는데 사용하는 특수한 키워드.

4. 생성자는 클래스 이름과 같아야 한다.

5. 생성자는 리턴 타입이 없다.

6. 오버로딩이 가능하다.

public class ConstructorTest {
    public static void main(String[] args) {
        Constructor constructor1 = new Constructor();
        Constructor constructor2 = new Constructor(3);
        Constructor constructor3 = new Constructor("화이팅!");

    }
}

class Constructor {
    Constructor () {
        System.out.println("첫번째 생성자");
    }

    Constructor(int num) {
        System.out.println("두번째 생성자");
    }

    Constructor(String str) {
        System.out.println("세번째 생성자");
    }
}

오버로딩이 가능한 생성자를 만들어 봤다.

this() 와 this

this()

1. this() 메서드는 자신이 속한 클래스에 다른 생성자를 호출 하는데 사용.

2. ex) Food 클래스의 생성자를 호출하는 것은 Food()가 아니라 this() 이다.

3. 반드시 생성자의 내부에서만 사용되어야 한다.

4. 반드시 생성자의 첫줄에 위치되어야 한다.

public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        Example example2 = new Example(1);
    }
}

class Example  {
    public Example() {
        System.out.println("Example의 기본 생성자 호출!");
    };

    public Example(int num) {
        this();
        System.out.println("Example의 두 번째 생성자 호출!");
    }
}

//출력
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!

출력을 보면 첫번째 생성자는 그대로 호출되고, 두번째 생성자가 객체를 생성하기 전에 this() 를 먼저 호출 했기 때문에 첫번째 생성자가 다시 한번 호출되고 그 다음에 두번째 생성자가 호출된다.

this

1. this 는 this.매개변수 = 매개변수 하면 지역변수로 변환해준다.

2. this 는 참조변수이고, 주로 필드명과 지역변수를 구분하기 위해 사용된다.

class Calculator {
    static double PI = 3.14;
    int left, right;

    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }

    public void sum() {
        System.out.println(this.left + this.right);
    }

    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
}

public class CalculatorDemo1 {

    public static void main(String[] args) {

        Calculator c1 = new Calculator();
        System.out.println(c1.PI);

        Calculator c2 = new Calculator();
        System.out.println(c2.PI);

        System.out.println(Calculator.PI);

    }

}

생성자를 만들고 this.left = left (매개변수)로 해주면 this.left는 지역변수로 바뀌며 그것은 클래스 안에 다른 메서드에서도 사용될수도 있다.

<내부 클래스>

1. Inner Classs 는 클래스 내에 선언된 클래스로, 외부클래스와 내부 클래스가 서로 연관이 되어 있을 때 사용.

2. 내부클래스는 외부클래스 안에서만 사용된다.

(내부 클래스의 종류)

class Outer { // 외부 클래스
	
	class Inner {
		// 인스턴스 내부 클래스	
	}
	
	static class StaticInner {
		// 정적 내부 클래스
	}

	void run() {
		class LocalInner {
		// 지역 내부 클래스
		}
	}
} 

내부 클래스는 3가지로 구분할 수 있다.

인스턴스 내부 클래스, 정적 내부 클래스, 지역 내부 클래스

(내부 클래스의 scpoe 구분)

멤버 내부 클래스

인스턴스 내부 클래스와 정적 내부 클래스를 하나로 멤버 내부 클래스라 한다.

인스턴스 내부 클래스

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(외부 클래스의 정적 변수)

메인클래스의 메서드가 호출되고, 외부클래스를 사용하여 내부 클래스의 기능을 호출 할 수 있고, 내부 클래스는 외부 클래스의 변수를 사용할 수 있다.

정적 내부 클래스

정적 내부 클래스는 인스턴스 내부 클래스와 동일하게 클래스의 멤버 변수 위치에 정의하지만, static 키워드를 사용한다는 점에서 차이가 있다.

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(); //정적 이너 클래스의 객체 생성
        Outer getPrint1 = new Outer(); // 인스턴스 이너 클래스의 객체 생성
        getPrint1.getPrint(); // 인스턴스 메서드 호출.
        a.test(); // 정적 메서드 호출.
    }
}

    //출력값
    //인스턴스 메서드
    //Outer num = 4(외부 클래스의 정적 변수)
        //스태틱 메서드

요약해보면 정적 내부 클래스는 static을 붙이고 static 끼리만 사용 가능하다. 외부클래스에서 sNum이 static으로 정적 클래스 변수 이기 때문에 사용 할 수 있다. 또한, 메인 메서드에서 정적 내부 클래스의 객체를 생성하여 정적 내부 클래스의 메서드( a.test() )를 호출 할 수 있다.

지역 내부 클래스

지역 내부 클래스는 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스이다.
지역 내부 클래스도 지역 변수와 유사하게 메서드 내부에서만 사용가능하기 때문에 일반적으로 메서드 안에서 선언 후에 바로 객체를 생성해서 사용한다.

class Outer { //외부 클래스
    int num = 5;
    void test() {
        int num2 = 6;
        class LocalInClass { //지역 내부 클래스
            void getPrint() {
                System.out.println(num);
                System.out.println(num2);
            }
        }
        LocalInClass localInClass = new LocalInClass();
        localInClass.getPrint();
    }
}
public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.test();
    }
}

//출력값
//5
//6

지역 내부 클래스는 메서드 안에서만 사용할 수 있고, 그 메서드 안에서 생성자를 만들어 호출 한다. 외부 클래스에서는 생성자 및 호출을 할 수 없다.

생성자 와 내부 클래스 회고

솔직히 생성자와 내부클래스에 대해 완벽하게 이해하지는 못하였다.
어떻게 쓰는지는 감이 오는데 실제로 코드를 만들때 어떤 상황에서 사용하는지를 잘 모르겠다.
this() 이것에 대한 동작을 잘 이해못했다. 세션때 질문해서 정확하게 파악할 수 있어야겠다.
하루하루 배워가는것은 재밌는데 어렵다... 내가 할 수 있을까란 생각이 많이 든다... 하지만 포기하지는 않을 거다! 다시 리마인드해서 열심히 해보자!!!

profile
성장하는사람이 되자

0개의 댓글