생성자의 이름은 반드시 클래스의 이름과 같아야 한다. 만약 클래스 이름과 생성자의 이름이 다르다면 그 메서드는 더이상 생성자로서의 기능을 수행할 수 없다.
생성자는 리턴 타입이 없다. 하지만 메서드와 같이 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()
메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다.
예를 들면 만약 클래스명이 Car라는 Car 클래스의 생성자를 호출하는 것은 Car()가 아니라 this()이고, 그 효과는 Car() 생성자를 호출하는 것과 동일하다.
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) | 클래스의 선언과 객체의 생성을 동시에 하는 일회용 클래스 | 외부 인스턴스 변수, 외부 전역 변수 |
인스턴스 내부 클래스는 객체 내부에 멤버의 형태로 존재하며, 외부 클래스의 모든 접근 지정자의 멤버에 접근할 수 있다.
정적 내부 클래스는 인스턴스 내부 클래스와 동일하게 멤버 변수 위치에 존재하나, static
키워드를 사용하여 외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있게 한다.
지역 내부 클래스는 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스다. 지역 내부 클래스도 지역 변수와 유사하게 메서드 내부에서만 사용가능하기 때문에 일반적으로 메서드 안에서 선언 후에 바로 객체를 생성해서 사용한다.