[Java] 생성자 & 캡슐화 완전히 정리해버리기

2026. 4. 22. 00:14·Language/Java


* 개념 복습과 학습 정도를 파악하고자 포스팅합니다!

* 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
'Language/Java' 카테고리의 다른 글
  • [Java] 추상 클래스 & 인터페이스 완전히 정리해버리기
  • [Java] 상속 완전히 정리해버리기
  • [Java] 메서드
  • [Java] 클래스와 객체
BackendInho
BackendInho
항상 열정적으로 부딪히고 깨닫는 주니어 백엔드 개발자의 여정을 기록합니다!
  • BackendInho
    Inho.devlog
    BackendInho
  • 전체
    오늘
    어제
    • 분류 전체보기 (41)
      • TIL (0)
      • Language (21)
        • Java (21)
      • Backend (8)
        • Spring (8)
      • Database (0)
        • SQL (0)
      • CS (8)
        • Computer Structure (2)
        • Network (2)
        • OS (1)
        • Data Structure & Algorithms (3)
      • Devops (0)
        • Docker & Kubernetes (0)
      • Coding-Test (1)
        • Programmers (3)
        • LeatCode (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    API
    CS
    HTTP
    java
    REST
    REST API
    Spring
    Spring Boot
    Web
    공간복잡도
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
BackendInho
[Java] 생성자 & 캡슐화 완전히 정리해버리기
상단으로

티스토리툴바