생성자는 말 그대로 객체를 생성하는 역할을 하는 클래스의 구성 요소로서, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드라 정리할 수 있습니다.
인스턴스 생성을 담당하는 것은 new 키워드이며, 생성자는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드라 한다.
클래스명(매개변수) { // 생성자 기본 구조
...생략...
}
지금까지 생성자의 존재를 모르고 new 키워드를 사용하여 생성자를 호출하여 객체를 만들었지만, 사실 모든 클래스에는 반드시 하나 이상의 생성자가 존재해야한다.
기본 생성자는 매개변수가 없는 생성자를 의미한다.
클래스명(){} //기본 생성자
DefaultConst(){} // 예시) DefaultConst 클래스의 기본 생성자
public class ConstructorExample {
public static void main(String[] args) {
Car c = new Car("Model X", "빨간색", 250);
System.out.println("제 차는 " + c.getModelName() + "이고, 컬러는 " + c.getColor() + "입니다.");
}
}
class Car {
private String modelName;
private String color;
private int maxSpeed;
public Car(String modelName, String color, int maxSpeed) {
this.modelName = modelName;
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getModelName() {
return modelName;
}
public String getColor() {
return color;
}
}
//Output
제 차는 Model X이고, 컬러는 빨간색입니다.
위 코드를 보면 class car 안에 public Car(String modelName, String color, int maxSpeed) 가 있고 클래스 오버라이딩이 발생하여 생성자가 선언됨을 알 수 있다. 이때 생성자는 매개변수를 가지게 된다. 따라서 생성자를 호출할 때에도 Car(value1,value2)의 형태로 호출이 되었다.
클래스 안에 메서들끼리도 서로 호출이 가능해진다. 이때 호출을 위해 사용하는 메서드는 this()이다 .
this 메서드를 사용하기 위해 두 가지의 문법요소를 충족해야 한다.
이 두가지를 유념해 코드를 보면
public class Test {
public static void main(String[] args) {
Example example = new Example();
Example example2 = new Example(5);
}
}
class Example {
public Example() {
System.out.println("Example의 기본 생성자 호출!");
};
public Example(int x) {
this();
System.out.println("Example의 두 번째 생성자 호출!");
}
}
//Output
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!
으로 나타나며 Example(int x) 부분에 this()가 선언되었고, 이때 this()는 Example() 생성자를 호출하게 된다.
public class ConstructorExample {
public static void main(String[] args) {
Car car = new Car("Model X", "빨간색", 250);
System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " + car.getColor() + "입니다.");
}
}
class Car {
private String modelName;
private String color;
private int maxSpeed;
public Car(String modelName, String color, int maxSpeed) {
this.modelName = modelName;
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getModelName() {
return modelName;
}
public String getColor() {
return color;
}
}
//Output
제 차는 Model X이고, 컬러는 빨간색입니다.
인스턴스 변수로 modelName ,color , maxSpeed가 선언되어 있는데 동시에 생성자의 매개변수로 선언되어있다. 인스턴스 변수와 매개변수를 이름만으로는 구분하기가 어려워지는 문제가 발생하게 되는데, 이를 구분해주기 위한 용도로 주로 사용되는 방법이 바로 this 키워드라 할 수 있다.
만약, 위 코드에서 this.modelName = modelName 대신 modelName = modeName 라고 작성하면 둘 다 지역변수로 간주되게 된다.
this는 인스턴스 자신을 가리키며, 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것 처럼 this를 통해서 인스턴스 자신의 변수에 접근할 수 있다.
내부 클래스는 클래스 내에 선언된 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다.
외부적으로 불필요한 데이터를 감출 수 있어,객체지향의 중요한 핵심 원칙인 캡슐화를 달성하는데 유용하다
class Outer { // 외부 클래스
class Inner {
// 인스턴스 내부 클래스
}
static class StaticInner {
// 정적 내부 클래스
}
void run() {
class LocalInner {
// 지역 내부 클래스
}
}
}
위 코드를 통해 세가지 내부 클래스의 종류를 알 수 있다.