[Java] 생성자와 내부 클래스

Nakjoo·2022년 12월 28일
0

[SEB_BE_43]

목록 보기
10/29

1. 생성자

생성자(constructor)란 객체 지향 프로그래밍에서 객체를 초기화하기 위해 사용하는 제어자이다.

1.1. 생성자의 특징

  • 반환값 : 생성자는 인스턴스를 생성해주는 역할을 하는 특수한 메소드이며 다른 메소드와는 다르게 반환값이 없다.
  • 이름 : 생성자의 이름은 클래스의 이름과 동일하게 사용하기로 약속되어 있다.
  • 호출 : 분명하게 호출되는 메소드와 다르게 암묵적으로 호출된다.
  • 기능 : 메소드는 객체의 동작을 보여주기 위해 사용하지만 생성자는 객체의 상태를 초기화 하는 데 사용한다.

1.2. 생성자의 종류

  • 초기 생성자 : 아무 파라미터가 없는 초기 생성자를 의미한다.

예를 들어 아래의 코드는 클래스 안에 초기 생성자를 정의한 것이고, 만약 클래스에 생성자가 없다면, 컴파일러가 자동적으로 초기 생성자를 만든다.

Class <Class 이름>()
{
	<Class 이름>()
    {
    	// 변수가 아닌 내용
    }
}
  • 매개 변수 생성자 : 매개 변수(필드)라는 파라미터를 가지는 생성자를 의미한다.

예를 들어 아래의 코드는 클래스 안에 매개변수 생성자를 정의한 것이고 만약 객체를 생성할 때 매개 변수가 파라미터로 초기화 되지 않는다면 객체는 생성되지 않는다. 다양한 자료형이 매개변수로 활용 가능하다.

Class <Class 이름>
{
	int <매개변수1>
    String <매개변수2>
	<Class 이름>(int i, String s)
    {
    	<매개변수1> = i
        <매개변수2> = s
    }
}

1.3. this vs this()

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

this() 메서드를 사용하기 위해서는 크게 두 가지의 문법요소를 충족시켜야 한다.

  • this() 메서드는 반드시 생성자의 내부에서만 사용 가능하다.
  • this() 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.

예시를 보면


Example 클래스는 두 개의 생성자를 가지고 있다. 하나는 기본 생성자고, 다른 하나는 매개변수가 필요한 생성자이다. 그리고 두 번째 생성자 내부 첫 줄을 보면 this() 메서드가 포함되어 있다.

이제 인스턴스를 생성하게 되면 첫 번째 생성자가 호출되고 그 결과로 첫 번째 생성자의 출력문이 잘 출력되게 된다. 그 다음 인스턴스를 생성해 두 번째 생성자를 호출하면 먼저 this() 메서드가 출력되어 다시 첫 번째 생성자가 호출되고, 그 다음으로 두 번째 생성자의 출력문이 출력하게 된다.


this 키워드는

위의 예시처럼 생성자의 매개변수의 이름과 클래스 안에 생성된 인스턴스 변수의 이름이 같을 때, this 키워드를 사용해 클래스 안에 생성된 자기 자신의 변수를 가리킬 때 사용된다.

만약 생성자 안에서 this 키워드를 사용하지 않는다면, 둘 다 지역변수로 간주하게 된다.

2. 내부 클래스

내부 클래스(Inner Class)는 클래스 내에 선언된 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다.

내부 클래스를 사용하면 외부 클래스의 멤버들에 쉽게 접근할 수 있고, 코드의 복잡성을 줄일 수 있다.

class Outer { // 외부 클래스
	
    class Inner {
    	// 인스턴스 내부 클래스
    }
    
    static class StaticInner {
    	// 정적 내부 클래스
    }
    
    void run() {
    	class LocalInner {
        	// 지역 내부 클래스
        }
    }
}

내부 클래스의 종류에는 익명 내부 클래스도 있지만, 우선 순위가 낮기 때문에 편의상 생략하기로 했다.

위의 예시처럼 내부 클래스에는 익명 내부 클래스를 제외하고, 각각 인스턴스 내부 클래스, 정적 내부 클래스, 지역 내부 클래스, 이렇게 세 가지 종류가 있다.

종류선언 위치사용 가능한 변수
인스턴스 내부 클래스외부 클래스의 멤버변수 선언위치에 선언외부 인스턴스 변수, 외부 전역 변수
정적 내부 클래스외부 클래스의 멤버변수 선언위치에 선언외부 전역 변수
지역 내부 클래스외부 클래스의 메서드나 초기화블럭 안에 선언외부 인스턴스 변수, 외부 전역 변수
익명 내부 클래스클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스외부 인스턴스 변수, 외부 전역 변수

3.1. 멤버 내부 클래스

인스턴스 내부 클래스와 정적 내부 클래스를 묶어서 멤버 내부 클래스라고 부를 수 있다.

3.1.1. 인스턴스 내부 클래스

인스턴스 내부 클래스는 객체 내부에 멤버의 형태로 존재하며, 외부 클래스의 모든 접근 지정자의 멤버에 접근할 수 있다.

위의 예시를 보면 인스턴스 내부 클래스는 외부 클래스의 내부에 위치해 있고 private 접근 제어자를 사용하고 있음에도 내부에서 외부 클래스의 변수와 정적 변수에 각각 접근하여 해당 값을 사용하고 있따.

한 가지 유의할 사항은 인스턴스 내부 클래스는 반드시 외부 클래스를 생성한 이후에 사용해야 한다. 따라서 클래스의 생성과 상관 없이 사용할 수 있는 정적 변수와 정적 메서드는 인스턴스 내부에서 사용할 수 없다.

3.1.2. 정적 내부 클래스

정적 내부 클래스는 내부 클래스와 동일하게 클래스의 멤버 변수의 위치에 정의하고, static 키워드를 사용해 사용할 수 있다.

3.2. 지역 내부 클래스

지역 내부 클래스는 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스다.

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

위의 예제를 보면 지역 내부 클래스 LocalInClass가 메서드 안에서 생성된 후에 정의된 메서드를 호출하여 외부 클래스의 변수들을 출력하고 있는 것을 확인할 수 있다.

0개의 댓글