class Car {
public String model;
public String color;
public Car(){} //기본생성자 (생성자 없으면 자동생성)
//생성자 오버로딩
public Car(String model, String color){ //매개변수가 있는 생성자
this.model = model;
this.color = color;
}
}
위의 코드와 같이 class에서 생성자를 만들 수 있다.
지금까지 생성자를 따로 만들지 않아도 정상적으로 인스턴스를 만들 수 있던 이유는 자바 컴파일러가 기본 생성자를 자동으로 추가해 주었기 때문이다.
기본 생성자는 매개변수가 없는 생성자를 의미한다.
-> 만약 생성자가 이미 추가되어 있다면 그 생성자를 기본으로 사용하게 된다.
적어둔 Car class를 통해 생성자를 생성해보자
public class ConstructorEx {
public static void main(String[] args) {
Car c = new Car("hyundai", "회색");
}
}
위와 같이 Car 인스턴스를 생성할 때 매개변수가 있는 생성자를 사용하게 되면 인스턴스의 필드값을 일일히 설정해줄 필요가 없어지고, 동시에 원하는 값으로 설정할 수 있어진다.
자신이 속한 class에서 다른 생성자를 호출하는 경우에 사용한다.
class Ex {
public Ex() { }
public Ex(int x) {
this();
}
}
위와 같이 만들게 되면 만약 main문에서 Ex(5)와 같이 선언하게 되면 두개의 생성자가 동시에 실행된다.
this()와 생긴건 비슷하지만 쓰임새가 다르다.
private String modelName;
private string color;
public Car(String modelName, String color){
this.modelName = modelName;
this.color = color;
}
먼저 설명하자면 this.modelName은 private String으로 선언한 class 하위의 modelName을 뜻하고 modelName은 String으로 선언한 지역변수를 뜻한다.
즉 this를 붙이게 되면 자신이 포함된 클래스의 객체(인스턴스 자신)를 가리키게 된다.
class OutClass { // 외부 클래스
private int a = 1; // 외부 클래스 인스턴스 변수
private static int b = 2; // 외부 클래스 정적 변수
private InClass inClass; // 내부 클래스 자료형 변수 선언
public OutClass() {
inclass = new InClass(); // 외부 클래스 생성자
}
class InClass { // 인스턴스 내부 클래스
int inNum = 100; // 내부 클래스 인스턴스 변수
void Test() { ... }
}
public void testClass() {
inClass.Test();
}
}
public class Main {
public static void main(String[] args) {
OutClass outClass = new OutClass();
outClass.testClass(); // 내부 클래스 기능 호출
}
}
Main문에서 OutClass outClass = new OutClass(); 를 실행하면 OutClass에 있는 기본 생성자까지 같이 실행된다 (inClass에 new InClass() 주입)
private InClass inClass;
public OutClass() {
inclass = new InClass();
}
public void testClass() {
inClass.Test();
}
내부 클래스 자료형 변수를 저렇게 따로 설정할 필요가 있나 싶은 생각이 들었다.
class ~~ {
static class ~~ {
}
}
위와 같이 내부 class에 static이 붙어 있는 것을 말하는데, 이것은 외부 클래스에서도 정적 멤버들만 사용할 수 있다.
class ~~ {
void ~~() {
class LocalInClass {
}
LocalInClass localInClass = new LocalInClass();
localInClass.~~();
}
}
클래스 안에 있는 메서드 내에서 정의되는 클래스를 지역 내부 클래스라 한다.