생성자, 내부 클래스

seongmin·2022년 9월 5일
0

Java

목록 보기
4/30
post-thumbnail

생성자 (Constructor)

  • 생성자는 인스턴스 생성 시 호출되는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드이다.

생성자와 메서드의 차이

  1. 생성자의 이름은 반드시 클래스의 이름과 같아야 한다. 만약 클래스 이름과 생성자의 이름이 다르다면 그 메서드는 더이상 생성자로서의 기능을 수행할 수 없다.

  2. 생성자는 리턴 타입이 없다. 하지만 메서드와 같이 void 키워드를 사용하지 않는데, 그 이유는 생성자에는 리턴 타입 자체가 존재하지 않기 때문이다.

메서드 오버로딩 - 생성자

  • 생성자도 오버로딩이 가능하기 때문에 한 클래스 내에 여러 개의 생성자가 존재할 수 있다.

  • 생성자의 종류
    1. 기본 생성자
    2. 매개변수가 없는 생성자
    3. 매개변수가 있는 생성자 `

public class ConstructorExample {
    public static void main(String[] args) {
        Constructor constructor1 = new Constructor();
        Constructor constructor2 = new Constructor("Hello World");
        Constructor constructor3 = new Constructor(5,10);
    }
}

class Constructor {
    Constructor() { // (1) 생성자 오버로딩
        System.out.println("1번 생성자");
    }

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

    Constructor(int a, int b) { // (3) 
        System.out.println("3번 생성자");
    }
}

기본 생성자와 매개변수가 있는 생성자의 차이

  • 생성자를 따로 만들지 않아도 정상적으로 인스턴스를 만들 수 있었던 이유는 생성자가 클래스 안에 포함되어 있지 않은 경우에 자바 컴파일러가 기본 생성자를 자동으로 추가해줬기 때문이다.
클래스명(){} // 기본 생성자
  • 매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화하는 데 사용된다.

  • 기본 생성자의 경우에는 매개변수가 없었기 때문에 원래 우리가 객체를 생성하던 방식으로 new 키워드와 생성자를 호출하면 되었지만, 매개변수가 있는 경우에는 그 개수와 타입에 알맞게 생성자를 호출해주어야 한다.

this 와 this () 의 차이

  • this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다.
    예를 들면 만약 클래스명이 Car라는 Car 클래스의 생성자를 호출하는 것은 Car()가 아니라 this()이고, 그 효과는 Car() 생성자를 호출하는 것과 동일하다.

  • this() 메서드를 사용하기 위해서 충족되어야하는 문법요소

    1. this() 메서드는 반드시 생성자의 내부에서만 사용할 수 있다.

    2. this() 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.

인스턴스 변수와 생성자의 매개변수가 동일하게 정의되어 있는 경우, 인스턴스 변수와 매개변수를 이름만으로는 구분하기가 어려워지는 문제가 발생하게 되는데, 이를 구분해주기 위한 용도로 주로 사용되는 방법이 바로 this 키워드 이다. this 는 인스턴스 자신을 가리키며, 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this 를 통해서 인스턴스 자신의 변수에 접근할 수 있는 것이다. this 키워드는 주로 인스턴스의 필드명과 지역변수를 구분하기 위한 용도로 사용한다.

내부 클래스

  • 내부 클래스(Inner Class)는 클래스 내에 선언된 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용하며, 내부 클래스를 사용하면 외부 클래스의 멤버들에 쉽게 접근 할 수 있고, 코드의 복잡성을 줄일 수 있다는 장점이 있다.
class Outer { // 외부 클래스
	
	class Inner {
		// 인스턴스 내부 클래스	
	}
	
	static class StaticInner {
		// 정적 내부 클래스
	}

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

내부 클래스의 종류 및 특징

  • 변수와 유사하게, 인스턴스 내부 클래스와 정적 내부클래스를 하나로 묶어 멤버 내부 클래스라 통칭한다.
종류선언 위치사용 가능한 변수
인스턴스 내부 클래스(instance inner class)외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스)외부 인스턴스 변수, 외부 전역 변수
정적 내부 클래스(static inner class)외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스)외부 전역 변수
지역 내부 클래스(local inner class)외부 클래스의 메서드나 초기화블럭 안에 선언외부 인스턴스 변수, 외부 전역 변수
익명 내부 클래스(anonymous inner class)클래스의 선언과 객체의 생성을 동시에 하는 일회용 클래스외부 인스턴스 변수, 외부 전역 변수

내부 클래스의 유효 범위와 접근성

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

  • 정적 내부 클래스는 인스턴스 내부 클래스와 동일하게 멤버 변수 위치에 존재하나, static 키워드를 사용하여 외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있게 한다.

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

0개의 댓글