2025. 4. 14. 17:09ㆍJAVA/JAVA 기초 문법
💻 Construcotr(생성자)란?
컨스트럭터는 객체를 만들 때 자동으로 호출되는 특별한 메서드다.
주로 객체의 초기값을 설정하거나 준비 작업을 수행한다.
클래스를 만들고 객체를 생성 하게 되면, 그 객체에 초기값을 넣는 작업이 필요한데,
이걸 일일이 나중에 하면 번거롭고, 실수할 가능성이 크다.
그래서 자바는 객체가 생성될 때 자동으로 초기화되는 코드를 만들 수 있도록 컨스트럭터 라는 특별한 메서드를 제공해준다.
💿 생성자의 역할
- 객체 생성 시 자동 호출
- 초기값 설정 (필드 초기화)
- 객체 생성과 동시에 유효성 검사 수행 가능
- 강제적인 초기화 → 실수 방지
💿 생성자와 new 키워드
| new 키워드 | 객체를 생성할 때 사용하는 키워드 |
| 생성자 | new 키워드에 의해 호출되는 초기화 함수 역할 |
new 키워드는 생성자를 호출하는 주체이고, 생성자 안에서는 다른 객체를 만들기 위해 new를 또 사용할 수 있다.
❓ 예제
Person person = new Person();
- new Person()에서
→ new가 메모리에 객체 생성
→ 생성자 Person() 호출
→ 필드 초기화 등 수행됨
❌ 생성자 안에서 자기 자신을 new로 만들면?
public class Person {
public Person() {
Person person = new Person(); // ❌ 무한 루프 발생!! StackOverflowError
}
}
- 생성자 내부에서 다시 new Person() 호출
→ 다시 생성자 호출
→ 다시 new Person()
→ 무한 반복
→ 💥 StackOverflowError
💿 생성자 종류
📀 Default Constructor(기본 생성자)
파라미터가 없고, 클래스 이름과 동일하며 리턴값이 없는 생성자를 디폴트 생성자라한다.
public class Person {
public Person() {} // Person : 메서드 이름 + () :파라미터 리스트
}
- 파라미터(매개 변수)가 없음
- 리턴값 없음
- 클래스 이름과 동일
- 직접 작성했기 때문에 명시적 Default Constructor
암시적 Default Constructor
public class Person {
// 디포틀 컨스트럭터가 없음 > 컴파일 시 생성자가 자동 추가됨
// 디폴트 컨스트럭터는 우리가 작성하는 소스코드에는 전혀보이지 않지만
// 바이트 코드 상에서는
// 부모 클래스의 디폴트 컨스트럭터를 호출한다!!
// public Person() {}
}
- 클래스 내부에 생성자를 하나도 작성하지 않으면, 컴파일러가 자동 생성 → 하나의 생성자라도 있음 생성되지 않는다
- 이 생성자는 아무 코드도 포함하지 않음 (빈 생성자)
❓ 기본 생성자 미 작성시 생기는 오류 예시 ❓
Person 클래스
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
}
Main 클래스
public class Main {
public static void main(String[] args) {
Person person = new Person(); // The constructor Test() is undefined
} // 기본 생성자가 없어 생기는 컴파일 오류
}
‼️ Default Constructor을 작성하는 습관 들이기
📀 Parameter Constructor(파라미터 생성자)
객체를 생성 시 값을 전달받아 멤버 변수를 초기화하는 생성자
public class Person {
private int age;
private String name;
public Person() {}
// 파라미터 생성자
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
💥 주의: 쉐도잉 문제 💥
❓ 쉐도잉 예제
public class Person {
private String name;
public Person(String name) {
name = name; // 💥 쉐도잉 발생! 멤버 변수에 값이 들어가지 않음
}
}
- 이 코드는 생성자 파라미터 name이 클래스 필드 name을 가린다.
- 해결법 this 키워드 사용
✅ 올바른 코드 사용
public class Person {
private String name;
public Person(String name) {
this.name = name; // ✅ this로 멤버 변수 명확히 지정
}
}
📀 Constructor Overloading(오버로딩 생성자)
같은 클래스 안에서 이름은 같지만, 매개변수의 수나 타입이 다른 여러 생성자를 만드는 생성자
❓ 예제
public class Person {
String name;
int age;
// 기본 생성자
public Person() {
this("이름없음", 0); // 다른 생성자 호출
}
// 이름만 받는 생성자
public Person(String name) {
this(name, 0);
}
// 이름 + 나이 모두 받는 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
💥 주의: 오버로딩만 하고 기본 생성자 안 만들면?
public class Person{
public Person(String name) { }
}
// Person person = new Person(); // ❌ 컴파일 오류! 기본 생성자 없음
💥 주의 : 오버로딩 생성자에서도 쉐도잉 문제가 발생할수 있다.
오버로딩 생성자에서도 생기는 쉐도잉 문제도 this 키워드를 통해 해결할 수 있다.
💿 생성자와 초기화의
생성자와 초기화는 서로 다른 개념이다.
하지만 생성자는 초기화를 수행할 수 있는 도구 중 하나
| 개념 | 정의 | 키워드 |
| 생성자 | 객체를 생성할 때 자동 호출되는 특수 메서드 | 객체 생성, 상태 설정 |
| 초기화 | 변수나 객체를 처음 사용할 수 있게 값 설정 | 값 세팅, 준비 |
❓ 예제
ublic class Person {
// 1. 생성자 초기화
public Person(String name) {
this.name = name;
System.out.println("생성자 실행");
}
// 2. 명시적 초기화
String name = "Unknown";
// 3. 인스턴스 초기화 블록
{
System.out.println("초기화 블록 실행");
}
// 4. static 초기화 블록
static {
System.out.println("static 초기화 블록 실행");
}
}
💿 생성자와 메서드의 차이점
생성자는 메서드와 다르게 return 타입이 없다
→ 생성자는 객체 생성 시 자동 실행되는 블록이기 때문에 리턴 타입이 없다.
| 항목 | 생성자 | 일반 메서드 |
| 이름 | 클래스명과 동일 | 개발자가 설정 |
| 리턴타입 | 없음 | 있음 (void, int 등) |
| 호출 | 객체 생성 시 자동 호출 | 명시적 호출 |
| 목적 | 객체 초기화 | 특정 동작 실행 |
🎯 정리 🎯
자바에서 생성자는 객체를 의미 있는 상태로 태어나게 만들어주는 특수한 메서드이며,
객체 생성과 동시에 자동실행되어 초기화를 담당한다.
'JAVA > JAVA 기초 문법' 카테고리의 다른 글
| Array(배열) (0) | 2025.04.23 |
|---|---|
| 자바에서 This (0) | 2025.04.15 |
| Access Modifier(접근 제어자) (0) | 2025.04.04 |
| 변수(Variable) 필드(Field) 객체(Object) (0) | 2025.04.04 |
| Parameter와 Argument (0) | 2025.04.02 |