
* 개념 복습과 학습 정도를 파악하고자 포스팅합니다!
* Claude, ChatGPT를 활용하여 이미지를 생성하고 활용합니다.
생성자와 캡슐화
1. 생성자(Constructor) ?
객체가 생성될 때 자동으로 호출되는 특수한 메서드.
객체의 초기값을 설정하는 역할을 합니다!
생성자의 특징은 세 가지에요. 메서드의 이름이 클래스 이름과 같아야 하고, 반환타입도 없고(void도 아님), new 키워드로 객체를 생성할 때 자동으로 호출됩니다.

2. 기본 생성자 (Default Constructor)
생성자를 하나도 정의하지 않으면 Java가 자동으로 매개변수 없는 기본 생성자를 만들어줘요.
public class Person {
String name;
int age;
// 생성자를 하나도 안 썼지만
}
// Java가 내부적으로 이걸 자동 생성
// Person() { } ← 기본 생성자
Person p = new Person(); // 기본 생성자 호출
단, 생성자를 하나라도 직접 정의하면 기본 생성자는 자동 생성되지 않아요.
public class Person {
String name;
Person(String name) { // 직접 생성자 정의
this.name = name;
}
}
Person p1 = new Person("홍길동"); // OK
Person p2 = new Person(); // 오류! 기본 생성자 없음
기본 생성자가 필요하면 직접 명시해줘야 합니다.
3. 생성자 종류

public class Person {
String name;
int age;
// ① 기본 생성자
Person() {
this.name = "이름없음";
this.age = 0;
}
// ② 이름만 받는 생성자
Person(String name) {
this.name = name;
this.age = 0;
}
// ③ 이름+나이 받는 생성자
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
// 호출
Person p1 = new Person(); // 이름없음, 0
Person p2 = new Person("홍길동"); // 홍길동, 0
Person p3 = new Person("이순신", 45); // 이순신, 45
4. this() - 생성자 체이팅
생성자 안에서 다른 생성자를 호출할 때 this()를 써요. 코드 중복을 줄일 수 있습니다!

public class Person {
String name;
int age;
Person() {
this("이름없음", 0); // 반드시 첫 줄
}
Person(String name) {
this(name, 0); // 반드시 첫 줄
}
Person(String name, int age) {
this.name = name; // 실제 초기화는 여기서
this.age = age;
}
}
5. 캡슐화(Encapsulation) ?
객체의 데이터(필드)를 외부에서 직접 접근하지 못하게 숨기고, 메서드를 통해서만 접근하게 하는 것.
객체지향의 4대 특성 중 하나!

6. 접근 제어자(Access Modifier)
캡슐화를 구현하는 핵심 도구!
클래스 - 필드 - 메서드에 붙어서 접근 범위를 제한합니다.
(제 면접 경험중에서도 면접관께서 접근제어자에 대해 여쭤보셨어요. 자바 개발자라면 당연히 숙지해야 하는 요소입니다!!!!)

7. getter / setter
필드를 private으로 막아두고 getter(읽기), setter(쓰기) 메서드로만 접근하게 합니다.

public class Person {
// 필드는 private — 외부 직접 접근 차단
private String name;
private int age;
// 생성자
public Person(String name, int age) {
this.name = name;
setAge(age); // setter를 통해 유효성 검사
}
// getter — 읽기
public String getName() {
return name;
}
public int getAge() {
return age;
}
// setter — 쓰기 + 유효성 검사
public void setName(String name) {
if (name != null && !name.isEmpty()) {
this.name = name;
}
}
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
} else {
System.out.println("잘못된 나이입니다.");
}
}
}
Person p = new Person("홍길동", 25);
// 직접 접근 불가
// p.age = -100; // 오류! private 필드
// setter로만 접근
p.setAge(-100); // "잘못된 나이입니다." 출력
p.setAge(30); // 정상 변경
// getter로 읽기
System.out.println(p.getAge()); // 30
System.out.println(p.getName()); // 홍길동
8. 캡슐화가 필요한 이유

9. 예제
계좌 입/출금 (캡슐화 적용한 클래스)
public class BankAccount {
private String owner; // 소유자
private int balance; // 잔액 — 외부 직접 접근 차단
// 생성자
public BankAccount(String owner, int initialBalance) {
this.owner = owner;
setBalance(initialBalance);
}
// getter
public String getOwner() {
return owner;
}
public int getBalance() {
return balance;
}
// setter — 잔액은 직접 변경 불가, 입금/출금만 가능
private void setBalance(int balance) {
if (balance >= 0) this.balance = balance;
}
// 입금
public void deposit(int amount) {
if (amount > 0) {
balance += amount;
System.out.println(amount + "원 입금 → 잔액: " + balance);
} else {
System.out.println("입금액은 0보다 커야 해요.");
}
}
// 출금
public void withdraw(int amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println(amount + "원 출금 → 잔액: " + balance);
} else {
System.out.println("출금 불가 — 잔액 부족 또는 잘못된 금액");
}
}
}
BankAccount account = new BankAccount("홍길동", 10000);
account.deposit(5000); // 5000원 입금 → 잔액: 15000
account.withdraw(3000); // 3000원 출금 → 잔액: 12000
account.withdraw(99999); // 출금 불가 — 잔액 부족
// 직접 잔액 변경 불가
// account.balance = 999999; // 오류! private
핵심 정리

오늘 복습하고 정리한 내용은 참 매우 중요한 것 같습니다..!!!!
정리하면서 다시한번 미흡했던 개념을 익힐 수 있었네요!
'Language > Java' 카테고리의 다른 글
| [Java] 추상 클래스 & 인터페이스 완전히 정리해버리기 (0) | 2026.04.22 |
|---|---|
| [Java] 상속 완전히 정리해버리기 (0) | 2026.04.22 |
| [Java] 메서드 (0) | 2026.04.20 |
| [Java] 클래스와 객체 (0) | 2026.04.20 |
| [Java] 자바는 입력을 어떻게 받아? - Scanner (0) | 2026.04.20 |