생성자
생성자는 간단하게 얘기하면 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다.
인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다.
- 생성자명과 클래스명이 같아야 한다.
- 생성자는 리턴 값이 없다. void 또한 사용하지 않는다.
- 생성자는 몇 가지 특징을 제외하면 메소드와 다르지 않다.
- 생성자는 메소드 처럼 클래스 내에 선언되고, 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
1. 기본 생성자(default constructor)
컴파일을 할 때, 소스파일의 클래스에 생성자가 하나도 정의되어있지 않으면 컴파일러가 자동으로 기본 생성자를 생성해서 컴파일해준다. (아래 예제 참고)
class Data1 {
int value;
}
class Data2 {
int value;
Data2(int x) { // 매개변수가 있는 생성자.
this.value = x;
}
}
class ConstructorTest {
public static void main(String[] args) {
Data1 d1 = new Data1();
Data2 d2 = new Data2(); //에러가 발생한다.
}
}
위에 코드를 실행해보면 Data1 d1 = new Data1()의 경우는 생성자가 존재하지 않는다.
그래서 컴파일러가 자동으로 생성자를 제공하여 작동하는 것을 확인할 수 있다.
하지만 Data2 d2 = new Data2() 부분에서 에러가 발생한다.
이유는 Data2()는 매개변수를 받는 생성자가 존재하여 기본 생성자를 생성해 주지 않기 때문이다.
만약 작동하게 하려면 수동으로 기본 생성자를 작성해주어야 한다.
2. 매개변수가 있는 생성자
위 에러가 발생했던 Data2()처럼, 인스턴스를 생성할 때 매개변수가 있는 생성자를 사용한다면 인스턴스를 생성함과 동시에 원하는 값으로 초기화를 할 수 있어 보다 간결하고 직관적이다. (아래 예제 참고)
class Car {
String color;
String gearType;
int door;
Car() {} // 기본 생성자 (직접 생성자를 만들지 않더라도 자동으로 기본 생성자 추가)
Car(String c, String g, int d) { // 매개변수가 있는 생성자
this.color = c;
this.gearType = g;
this.door = d;
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car(); // Car c1은 기본 생성자에서 값을 초기화해주는 과정이 있다.
c1.color = "white";
c1.gearType = "auto";
c1.door = 4;
Car c2 = new Car("white", "auto", 4);
}
}
Car c2 = new Car("white", "auto", 4); 이 부분이 매개변수가 있는 생성자를 이용한 인스턴스 생성이다.
Car c1은 기본 생성자에서 값을 초기화해주는 과정이 있어서 간결하지 못하고 직관적이지 못하다.
3. this, this()
this는 인스턴스 자기 자신을 의미한다.
주로 전역변수와 메서드, 생성자 매개변수가 동일할 때, 인스턴스 필드임을 명확하게 하기 위해 사용한다.
자세한 내용은 다른 시간에 다뤄보도록 하자.
생성자에선 서로 간에 호출이 가능한데, 아래의 조건을 따라야 한다.
- 생성자의 이름으로 클래스 이름 대신 this를 사용해야 한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
class Car { // 생성자 Car
String color;
String gearType;
int door;
Car() { // 다른 생성자 호출
this("white", "auto", 4);
}
Car(String color) {
this(color, "auto", 4);
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class CarTest2 {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car("blue");
}
}
생성자 Car()에서 다른 생성자 Car(String color, String gearType, int door)을 호출했다.
이렇게 생성자 간의 호출에서는 생성자 이름 대신 this를 사용해야 한다.
그리고 Car()의 첫 번째 줄에서 호출하였다.
같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이렇게 연결하고 호출하는 방식으로 구현하면 더 효율적이고, 유지보수도 쉬워진다.
출처: 🌐 생성자란?
[자바/Java] 생성자 란?
자바 프로그래밍을 할 때, 생성자에 대해 모르고 그냥 사용하는 경우가 많다. 하지만 깊이 있는 프로그래밍을 위해서는 생성자의 개념이 중요하다고 생각해서 정리하게 되었다. 먼저, 생성자란?
resilient-923.tistory.com
생성자를 사용하는 이유
클래스 내에 선언된 변수의 맨 앞에 붙은 private는 클래스 외부에서 이 변수를 마음대로 접근할 수 없게 된다.
어떤 객체를 인스턴스로 생성할 때(new Order() 할 때) 이 변수들에 일정한 값을 주며 생성하기 위해선 생성자를 이용해야 한다. (또 다른 방법으로는 수정자라고 하는 setter를 이용하여 이 변수들에 값을 하나씩 할당하는 방법도 있다.)
생성자의 간단한 용도는 위의 설명과 같지만, 객체지향 프로그래밍에서 생성자의 의미는 좀 더 중요한 역할을 담당한다.
생성자는 어떤 객체가 생성과 동시에 유효함을 보장하는 역할을 한다.
나이와 키를 갖는 사람 객체 예제
class Person {
int age;
int height;
}
Person p = new Person();
// 현재 Person p는 나이가 0이고 키도 0입니다.
// 이런 사람은 존재하지 않습니다.
// 그래서 이런 객체는 유효하지 않다고 합니다.
// 이 문제를 해결하기 위해 생성자를 이용합니다.
class Person {
int age;
int height;
public Person(int age, int height) {
this.age = age;
this.height = height;
}
}
Person p = new Person(10, 130);
// Person p 는 생성과 동시에 나이 10, 키는 130을 갖습니다.
// 이것은 유효하다고 할 수 있습니다.
생성자는 객체를 새로 생성할때 최초로 한번 실행되며 그 이후엔 사용자가 임의로 호출할 수 없다는 규칙이 있다.
그리고 모든 클래스는 반드시 하나이상의 생성자를 가져야 한다.
그래서 개발자가 별도의 생성자를 작성하지 않을 경우 컴파일러가 빈 생성자(파라미터로 아무것도 받지 않는 생성자)를 추가하도록 설정되어 있기도 하다.
출처: 🌐 생성자를 만드는 이유
생성자를 만드는 이유가 먼가요? - 인프런 | 질문 & 답변
public class Order { private Long memberId; private String itemName; private int itemPrice; private int discountPrice;public Order(Long memb...
www.inflearn.com
Notion Link : https://solar-textbook-084.notion.site/52b7031d99594e20948fe438dce4beaa