티스토리 뷰
생성자는 new 연산자를 사용하여 객체를 초기화하는 특별한 메서드이다.
생성자의 종류와 생성자를 다양하게 선언할 수 있는 방법에 대해 알아보려고 한다.
생성자 종류
생성자의 종류는 기본 생성자와 사용자 정의 생성자 두 가지로 볼 수 있다.
기본 생성자는 매개변수가 없는 생성자로 특별한 동작이 없고 필드를 기본값으로 초기화한다. 클래스는 기본 생성자를 제공한다. 이는 클래스 내부에 생성자 선언을 명시적으로 하지 않았다면 컴파일러는 자동으로 기본 생성자를 바이트 코드에 추가한다는 것이다.
사용자 정의 생성자는 매개변수를 받아 특정 값으로 필드를 초기화하는 생성자이다.
프로그래머가 사용자 정의 생성자를 정의하였다면 컴파일러는 기본 생성자를 자동으로 추가하지 않는다. 기본 생성자를 사용하고 싶은데 사용자 정의 생성자를 정의하였다면 프로그래머가 명시적으로 기본 생성자를 정의해줘야한다.
public class Car {}
생성자가 없는 클래스로 보이지만, 컴파일러는 자동으로 기본 생성자를 추가하기 때문에 new Car() 를 통해 객체를 생성할 수 있다.
생성자 선언 방법
기본 생성자 외에 프로그래머가 생성자(사용자 정의 생성자)를 선언할 수 있다고 했다.
사용자 정의 생성자는 다음과 같이 선언할 수 있다.
public class Car {
private String brand;
private String model;
private String color;
private int enginOn;
public Car(String brand, String model, String color) {
this.brand = brand;
this.model = model;
this.color = color;
this.enginOn = false;
}
}
Car 클래스에 선언된 모든 필드를 객체를 생성할 때 매개변수로 넘겨서 초기화를 하고자 하는 코드이다. 만약 특정 필드만 매개변수로 넘기고 싶거나 기본 생성자를 통해 초기화를 하고자 한다면 오버로딩을 통해 생성자를 추가할 수 있다.
오버로딩
오버로딩은 클래스 내에 매개변수가 다른 같은 이름의 메서드를 여러개 선언하는 것이다.
오버로딩은 다음과 같은 조건을 갖는다.
1) 모든 오버로딩 된 메서드의 이름은 동일해야 한다.
2) 매개변수의 개수 또는 타입이 달라야한다. 여기서 주의 할 점은, 매개 변수의 개수와 타입 그리고 선언된 순서가 같을 경우 매개 변수 이름만 바꾸는 것은 오버로딩이 아니다.
public class Car {
private String brand;
private String model;
private String color;
private int enginOn;
//기본 생성자
public Car() {}
//model만 매개변수로 받는 생성자
public Car(String model) {
this.brand = "hyundai";
this.model = model;
this.color = "black";
this.enginOn = false;
}
//brand, model만 매개변수로 받는 생성자
public Car(String brand, String model) {
this.brand = brand;
this.model = model;
this.color = "black";
this.enginOn = false;
}
public Car(String brand, String model, String color) {
this.brand = brand;
this.model = model;
this.color = color;
this.enginOn = false;
}
//위 생성자와 동일, 오버로딩이 아니다.
public Car(String model, String color, String brand) {
...
}
}
다른 생성자 호출
생성자 오버로딩이 많아지면 생성자 간의 중복 코드가 발생할 수 있다.
필드 초기화 내용은 한 생성자에서만 하도록 작성하고, 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하도록 할 수 있다.
다른 생성자를 호출할 때에 this 라는 키워드를 사용해서 호출할 수 있는데 이는 객체 자신을 가리킨다.
중요한건, this() 는 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용된다는 것이다. 다시말해 this() 를 호출하고 그 밑줄에 다른 코드를 허용하지 않는다는 것이다.
public class Car {
private String brand;
private String model;
private String color;
private int enginOn;
//기본 생성자
public Car() {
this("hyundai", "tucson", "TCM", false);
}
//model만 매개변수로 받는 생성자
public Car(String model) {
this("hyundai", model, "TCM", false);
}
//brand, model만 매개변수로 받는 생성자
public Car(String brand, String model) {
this(brand, model, "TCM", false);
}
public Car(String brand, String model, String color) {
this.brand = brand;
this.model = model;
this.color = color;
this.enginOn = false;
}
}
생성자와 오버로딩에 대해 정리한다.
생성자는 객체가 생성시 호출되어 객체 초기화를 수행하며, 오버로딩을 통해 같은 이름의 생성자를 매개변수의 개수나 타입을 달리하여 여러 개 정의할 수 있다.
'Language > Java' 카테고리의 다른 글
인스턴스 멤버와 정적 멤버 (0) | 2024.10.18 |
---|---|
final 키워드 (0) | 2024.10.18 |
클래스 (0) | 2024.10.17 |
이넘(Enum) (0) | 2024.10.16 |
배열에서 메모리 접근 (0) | 2024.10.15 |
- Total
- Today
- Yesterday
- 티스토리챌린지
- 정적변수
- AutoConfiguration
- @conditional
- HashSet
- Spring
- fail-fast
- java
- syncronized
- Sticky Session
- 로드 밸런서
- nginx
- 자동구성
- nosql
- 인스턴스변수
- Load Balancer
- 오블완
- 인터페이스
- HashMap
- object
- Hash
- 다중화
- spring boot
- 고정 세션
- Red-Black Tree
- Caching
- Security
- JPA
- fail-safe
- 추상클래스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |