17. 생성자(Constructor)

박은서's avatar
Dec 17, 2025
17. 생성자(Constructor)

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 + ",)"); } }
notion image

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(); } }
notion image
 

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 +")"); } }
notion image

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