new 연산자는 객체 생성 후 연이어 생성자(Constructor)를 호출해서 객체를 초기화하는 역할을 한다.
객체 초기화란 필드 초기화를 하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것이다.
문법
클래스 변수 = new 클래스( );
생성자 호출
생성자 실행이 끝나면 new 연산자는 객체의 주소를 리턴하고, 리턴된 주소는 클래스 변수에 대입되어 객체의 필드나 메소드 접근에 이용된다.
1. 기본 생성자(Default Constructor)
모든 클래스는 생성자가 존재하며, 하나 이상을 가질 수 있다. 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가시킨다.
문법
[public] 클래스() { }
클래스가 public이면 기본 생성자도 public이지만, 클래스가 public 없이 class로만 선언되면 기본 생성자도 public이 아니다.
예제 코드
// 소스 파일 Car.java
publice class Car {
}
// 바이트코드 파일 Car.class
public class Car {
public Car() { } // 자동 추가
}
Car 클래스를 설계할 때 생성자를 생략하면 기본 생성자가 생성된다.
그러나 개발자가 명시적으로 선언한 생성자가 있다면 기본 생성자를 추가하지 않는다.
2. 생성자 선언
생성자 블록 문법
클래스 (매개변수, ...) {
// 객체의 초기화 코드
}
생성자와 메소드는 비슷하지만 리턴 타입이 없고 클래스 이름과 동일하다.
매개변수는 new 연산자로 생성자를 호출할 때 매개값을 생성자 블록 내부로 전달하는 역할을 한다.
생성자 선언 예제 코드
package cs06.sec07.exam01;
public class Car {
// 생성자 선언
Car(String model, String color, int maxSpeed) {
}
}
package cs06.sec07.exam01;
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car("투싼", "black", 250);
}
}
클래스에 개발자가 선언한 생성자가 있어 기본 생성자가 없다.
3. 필드 초기화
필드 초기화 경우 추천
- 객체마다 동일한 값 ➡️ 필드 선언 시 초기값 대입
- 객체마다 다른 값 ➡️ 생성자에서 필드 초기화
예제 코드
package cs06.sec07.exam02;
public class Korean { // 필드 선언
String nation = "대한민국";
String name;
String ssn;
public Korean(String name, String ssn) { // 생성자 선언
this.name = name;
this.ssn = ssn;
}
}
매개변수명이 필드명과 동일하기 때문에 구분을 위해 this 키워드를 붙여서 사용한다.
this는 현재 객체이며, this.name은 현재 객체의 데이터(필드)의 name을 뜻한다.
package cs06.sec07.exam02;
public class KoreanExample {
public static void main(String[] args) {
// 객체 생성
Korean k1 = new Korean("홍길동", "010101-1231234");
// 객체 데이터 읽기
System.out.println("k1.nation = " + k1.nation);
System.out.println("k1.name = " + k1.name);
System.out.println("k1.ssn = " + k1.ssn);
Korean k2 = new Korean("이이", "010204-2123123");
System.out.println("k2.nation = " + k2.nation);
System.out.println("k2.name = " + k2.name);
System.out.println("k2.ssn = " + k2.ssn);
}
}
4. 생성자 오버로딩(Overloading)
생성자 오버로딩이란 매개변수를 달리하는 생성자 여러 개를 선언하는 것을 말하며, 매개값으로 객체의 필드를 다양하게 초기화하기 위해 생성자 오버로딩이 필요하다.
생성자가 오버로딩되어 있을 경우에 new 연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 따라 실행될 생성자가 결정된다.
예제 코드
package cs06.sec07.exam04;
public class Car {
String company = "현대";
String model;
String color;
int maxSpeed;
// 생성자 선언
Car() { // 생성자1
}
Car(String model) { // 생성자2
this.model = model;
}
Car(String model, String color) { // 생성자3
this.model = model;
this.color = color;
}
Car(String model, String color, int maxSpeed) { // 생성자4
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
package cs06.sec07.exam04;
public class CarExample {
public static void main(String[] args) {
Car car1 = new Car(); // 생성자1 호출
System.out.println("Car1 = " + car1.company);
System.out.println();
Car car2 = new Car("투싼"); // 생성자2 호출
System.out.println("car2.company = " + car2.company);
System.out.println("car2.model = " + car2.model);
System.out.println("car2.color = " + car2.color);
System.out.println("car2.maxSpeed = " + car2.maxSpeed);
System.out.println();
Car car3 = new Car("투싼", "black"); // 생성자3 호출
System.out.println("car3.company = " + car3.company);
System.out.println("car3.model = " + car3.model);
System.out.println("car3.color = " + car3.color);
System.out.println("car3.maxSpeed = " + car3.maxSpeed);
System.out.println();
Car car4 = new Car("그랜저", "white", 250); // 생성자4 호출
System.out.println("car4.company = " + car4.company);
System.out.println("car4.model = " + car4.model);
System.out.println("car4.color = " + car4.color);
System.out.println("car4.maxSpeed = " + car4.maxSpeed);
}
}
5. 다른 생성자 호출
생성자 오버로딩이 많아지면 생성자 간의 중복된 코드가 많아질 수 있다. 그런 경우에 사용하며 공통 코드를 한 생성자에게 집중적으로 작성하고, 나머지 생성자는 this(...)를 사용하여 공통 코드를 갖고 있는 생성자를 호출하는 방법으로 개선할 수 있다.
this(매개값, ...)는 생성자의 첫 줄에 작성되어 다른 생성자를 호출하는 역할이다. this() 다음에는 실행문 작성이 가능하며, 호출되는 생성자의 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문을 실행한다.
this 예제 코드
package cs06.sec07.exam05;
public class Car {
String company = "현대";
String model;
String color;
int maxSpeed;
Car(String model) { // 생성자1
this(model, "white", 250);
}
Car(String model, String color) { // 생성자2
this(model, color, 250);
}
Car(String model, String color, int maxSpeed) { // 생성자3
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
package cs06.sec07.exam05;
public class CarExample {
public static void main(String[] args) {
Car car1 = new Car("그랜저"); // 생성자 호출1
System.out.println("car1.company = " + car1.company);
System.out.println("car1.model = " + car1.model);
System.out.println("car1.color = " + car1.color);
System.out.println("car1.maxSpeed = " + car1.maxSpeed);
System.out.println();
Car car2 = new Car("그랜저", "red"); // 생성자 호출2
System.out.println("car2.company = " + car2.company);
System.out.println("car2.model = " + car2.model);
System.out.println("car2.color = " + car2.color);
System.out.println("car2.maxSpeed = " + car2.maxSpeed);
System.out.println();
Car car3 = new Car("그랜저", "black", 100); // 생성자 호출3
System.out.println("car3.company = " + car3.company);
System.out.println("car3.model = " + car3.model);
System.out.println("car3.color = " + car3.color);
System.out.println("car3.maxSpeed = " + car3.maxSpeed);
}
}
'IT > Java' 카테고리의 다른 글
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2024.03.05 |
---|---|
[Java] 메소드 선언과 호출 (0) | 2024.03.04 |
[Java] 클래스 필드 선언과 사용 (0) | 2024.02.29 |
[Java] 클래스 객체 생성 (0) | 2024.02.29 |
[Java] 클래스 선언 (0) | 2024.02.29 |