1. 생성자(Constructor)
교재 p.155-162 4.3 생성자와 메소드 오버로딩
1️⃣ 생성자란?
객체가 생성될 때 객체의 상태를 초기화하는 특수한 메소드
객체 상태의 초기화를 유연하게 할 수 있음
※기본적이고 가장 많이 사용되는 상태는 기본 생성자로, 특수하고 변동사항이 있을 경우 생성자로 받음
2️⃣ 생성자의 특징
특징 | 설명 |
이름 | 클래스 이름과 동일 |
반환 타입 | 없음 (void도 ❌) |
호출 시점 | 객체 생성 시 |
오버로딩 | ⭕ 가능 |
3️⃣ 주의해야 할 점 (객체 지향 관점)
1) 생성자는 초기 상태만 책임진다
- 생성자는 객체가 만들어질 때 반드시 필요한 값만 초기화
- 모든 필드를 생성자에서 초기화 할 필요 ❌
// ❌ 모든 상태를 생성자에서 처리
new Player(hp, level, score, position);2) 시간에 따라 변하는 값은 생성자에서 ❌
- 객체 생성 이후에 변하는 값
→ 생성자 ❌
→ 메서드 ⭕
- 예시 : 점수 증가, 체력 감소, 상태 변경
player.takeDamage(10);
player.addScore(100);3) 행위 없는 상태 변화는 잘못된 설계
- 중간에 갑자기 값이 바뀌는 건 ❌
- 이유 없는 값 변경 = 마법 같은 코드
player.hp =0; // ❌ 행위 없음4) 상태 변화는 반드시 “행위(메서드)”를 통해서
- 객체의 상태 변화는 의미 있는 메서드로 표현해야 함
player.die(); // ⭕
player.heal(20); // ⭕➡️ 상태 변경 = 행위의 결과
객체 지향의 첫 번째 원칙
👉 위의 4가지 내용이 객체 지향의 첫 번째 원칙
- 객체는 데이터를 들고 있고, 행위를 통해서만 상태가 변함
객체 = 상태 + 행위4️⃣ 예시
class Person {
String name;
// 생성자
Person(String name) {
this.name = name;
}
}5️⃣ 교재 예제
1) PizzaTest(p.156)
package ex04;
class Pizza{
int size;
String type;
// 매개 변수가 없는 생성자 -> 상태 고정
public Pizza(){
size = 12;
type = "슈퍼스프림";
}
// 매개 변수가 있는 생성자 -> 객체 생성 때마다 초기화 가능
public Pizza(int s, String t){
size = s;
type = t;
}
}
public class PizzaTest {
public static void main(String[] args) {
Pizza obj1 = new Pizza();
System.out.println("(" + obj1.type + " , " + obj1.size + ",)");
Pizza obj2 = new Pizza(24,"포테이토");
System.out.println("(" + obj2.type + " , " + obj2.size + ",)");
}
}
2) 예제 4-4 TelevisionTest (p.157)
package ex04;
class Television {
private int channel;
private int volume;
private boolean onOff;
Television(int c, int v, boolean o){
channel = c;
volume = v;
onOff = o;
}
void print() {
System.out.println("채널은 " + channel + "이고 볼륨은 " + volume + "입니다.");
}
}
public class TelevisionTest {
public static void main(String[] args) {
Television myTv = new Television(7,10,true);
myTv.print();
Television yourTv = new Television(11, 20, true);
yourTv.print();
}
}
2. 기본 생성자(Default Contructor)
1️⃣ 기본 생성자란?
매개변수가 없으며, 클래스가 아무 생성자도 정의하지 않았을 때 컴파일러가 자동으로 제공하는 생성자
2️⃣ 기본 생성자의 특징
- 매개변수가 없음
- 클래스에 생성자를 하나도 만들지 않으면 자동으로 생성
- 개발자가 생성자를 하나라도 정의하면 기본 생성자는 자동으로 생성되지 않음
- 객체 생성 시 **필드를 기본값(0, null, false 등)**으로 초기화한다.
3️⃣ 주의해야 할 점
1) 생성자를 하나라도 정의하면 기본 생성자는 자동 생성 ❌
- 자바는 생성자를 하나도 정의하지 않았을 때만 기본 생성자(
클래스명())를 자동으로 만들어줌
classUser {
User(String name) {}
}
// User() 기본 생성자 ❌ 자동 생성 안 됨객체 생성 시 항상 값을 입력하지 않는다면?
- 객체를 만들 때마다 모든 상태 값을 넘기는 건 비효율적 → 그래서 기본값을 갖는 생성자 필요
➡️ 해결 방법 :
- 기본 생성자 직접 정의 ⭕
- 가장 많이 사용되는 기본 상태로 초기화
- 객체 생성 진입점을 제공
classUser {
String role;
boolean active;
User() {
this.role ="USER";
this.active =true;
}
}- 특수한 경우를 위한 생성자도 함께 제공
- 상황에 따라 다른 초기화가 필요할 수 있음 → 오버로딩된 생성자 사용
classUser {
String role;
boolean active;
User() {
this("USER",true);
}
User(String role,boolean active) {
this.role = role;
this.active = active;
}
}생성자 설계의 핵심 원칙
- 기본 생성자 → 가장 많이 쓰이는 기본 상태
- 매개변수 생성자 → 특수한 초기 상태
👉 객체 생성의 의도를 생성자로 표현
4️⃣ 교재 예제
1) BoxTest(p.158)
package ex04;
class Box2 {
int width, height, depth;
}
public class BoxTest2 {
public static void main(String[] args) {
Box2 b = new Box2();
System.out.println("상자의 크기 : (" + b.width + "," + b.height + "," + b.depth +")");
}
}

3. 실습
package ex04;
public class Burger {
String 재료1;
String 재료2;
String 재료3;
int price;
// 기본생성자
Burger(){
재료1 = "불고기";
재료2 = "양상추";
재료3 = "빵";
price = 3800;
}
// 생성자
Burger(String 재료1, int price){
this.재료1 = 재료1;
재료2 = "양상추";
재료3 = "빵";
this.price = price;
}
public static void main(String[] args) {
Burger b1 = new Burger();
Burger b2 = new Burger();
Burger b3 = new Burger();
Burger b4 = new Burger();
Burger b5 = new Burger();
Burger b6 = new Burger();
Burger b7 = new Burger("새우", 4000);
Burger b8 = new Burger("한우불고기", 8000);
}
}Share article