[멋사 클라우드 5기] Day 3 - 객체 생성 흐름과 클래스 구조 이해하기

2026. 1. 25. 02:40·Learning Log

셋째 날에는 자바에서 객체가 생성되는 과정과

객체를 구성하는 클래스의 주요 요소들을 중심으로 학습했다.


1. 생성자란 무엇인가

생성자(Constructor)는 new 연산자를 통해 객체가 생성될 때 호출되며,

객체를 사용 가능한 상태로 초기화하는 역할을 한다.

여기서 말하는 객체 초기화란:

  • 필드에 초기값을 설정하고
  • 필요한 메소드를 호출해
  • 객체를 바로 사용할 수 있도록 준비하는 것을 의미한다.

생성자가 정상적으로 실행되면:

  • 힙(Heap) 영역에 객체가 생성되고
  • 해당 객체의 메모리 주소가 반환된다.

2. 기본 생성자와 명시적 생성자

모든 클래스에는 반드시 생성자가 존재한다.

  • 클래스에 생성자를 하나도 선언하지 않으면
    → 컴파일러가 기본 생성자를 자동으로 추가한다.
  • 하지만 생성자를 하나라도 명시적으로 선언하면
    → 컴파일러는 기본 생성자를 추가하지 않는다.
public class Car { }

⬇️ 컴파일 시 내부적으로는

public class Car {
    public Car() { }
}

명시적으로 생성자를 선언하는 이유는

객체를 다양한 값으로 초기화하기 위해서다.


3. 필드 초기화 방법

객체가 생성될 때 필드는 기본값으로 자동 초기화된다.

  • int → 0
  • boolean → false
  • 참조 타입 → null

기본값이 아닌 다른 값으로 초기화하려면 두 가지 방법이 있다.

  1. 필드 선언 시 초기값 지정
  2. 생성자에서 초기화

상황에 따라 적절한 방식을 선택하면 된다.


4. 생성자 오버로딩

객체를 생성할 때 전달되는 값의 형태가 다양하다면,

생성자 또한 여러 개가 필요하다.

이를 생성자 오버로딩이라고 한다.

public class Car {
    Car() {}
    Car(String model) {}
    Car(String model, String color) {}
}

5. this()를 이용한 생성자 호출

생성자가 많아질수록

중복된 초기화 코드가 생기기 쉽다.

이때 this()를 사용하면

다른 생성자를 호출해 중복 코드를 줄일 수 있다.

public class Car {
    Car() {}

    Car(String model) {
        this(model, "silver", 250);
    }

    Car(String model, String color) {
        this(model, color, 250);
    }

    Car(String model, String color, int maxSpeed) {
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

6. 객체 생성 시 내부 동작 흐름

자바에서 객체가 생성될 때 내부적으로는 다음과 같은 단계가 진행된다.

1. Class Loading

  • JVM이 해당 클래스의 .class 파일을 메모리에 로딩
  • static 필드 및 static 초기화 블록 실행

2. Memory Allocation

  • 힙(Heap) 영역에 객체가 들어갈 공간 확보
  • 객체의 메모리 주소 생성

3. Default Initialization

  • 모든 인스턴스 필드를 기본값으로 초기화

4. Explicit Initialization

  • 코드에 명시된 필드 초기값, 인스턴스 초기화 블록 실행

5. Constructor Execution

  • 부모 클래스 생성자부터 순서대로 실행
  • 생성자 내부 코드 수행

7. 인스턴스 멤버와 this

인스턴스 멤버는

객체가 생성된 이후에 사용할 수 있는 필드와 메소드다.

객체 내부에서는 this 키워드를 사용해

자기 자신의 인스턴스 멤버를 참조할 수 있다.

주로:

  • 필드 이름과 매개변수 이름이 같을 때
  • 인스턴스 필드를 명확히 구분하고 싶을 때 사용한다.

8. 정적 멤버(static)

static은 클래스에 고정된 멤버를 의미한다.

  • 객체 생성 없이 사용 가능
  • 클래스 로딩 시 메모리에 올라감
  • 모든 객체가 공유
public class Example {
    static int count;

    static void increase() {
        count++;
    }
}

언제 static을 써야 할까?

  • 객체마다 달라질 필요가 없는 데이터 → static
  • 객체마다 다른 값을 가져야 한다면 → 인스턴스 필드

9. 패키지와 접근 제한자

패키지

패키지는 단순한 폴더가 아니라

클래스를 유일하게 식별하는 네임스페이스 역할을 한다.

* 패키지명.클래스명
* 상위패키지명.하위패키지명.클래스명

접근 제한자

제한자 접근 범위

public 어디서든 접근 가능
protected 같은 패키지 또는 자식 클래스
default 같은 패키지
private 클래스 내부
접근 제한 강화 →
public < protected < default < private


10. Singleton 패턴

프로그램 전체에서 단 하나의 객체만 필요할 때 사용하는 패턴이다.

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

11. Getter & Setter

객체의 필드를 외부에서 직접 수정하게 되면

객체의 상태가 쉽게 깨질 수 있다.

그래서:

  • 필드는 private
  • 접근은 메소드를 통해 수행한다.
void setSpeed(double speed) {
    this.speed = speed < 0 ? 0 : speed;
}

double getSpeed() {
    return speed * 1.6;
}

이를 통해:

  • 값 검증 가능
  • 내부 구현 은닉
  • 객체 무결성 유지

12. 예외(Exception)

예외는 실행 중 발생할 수 있는 비정상적인 상황이다.

자바는 예외를 클래스로 관리하며,

모든 예외는 Exception 클래스를 상속한다.

예외 종류

  • Checked Exception
    → 컴파일 시 처리 여부 검사
  • Runtime Exception
    → 실행 중 발생, 컴파일러 검사 없음

예외 처리를 통해

프로그램을 종료하지 않고 정상 흐름을 유지할 수 있다.


📚 Reference

  • 『혼자 공부하는 자바』, 신용권 저

'Learning Log' 카테고리의 다른 글

equals가 있는데 hashCode는 왜 필요할까?  (0) 2026.01.27
abstract vs interface: 비슷한데 왜 굳이 둘 다 있을까?  (0) 2026.01.27
[멋사 클라우드 5기] Day 4 - 상속, 다형성, 그리고 abstract vs interface  (0) 2026.01.27
[멋사 클라우드 5기] Day 2 - 배열, Git & GitHub 기본 개념 정리  (0) 2026.01.25
[멋사 클라우드 5기] Day 1 - Java 개발 환경과 기본 타입  (0) 2026.01.25
'Learning Log' 카테고리의 다른 글
  • abstract vs interface: 비슷한데 왜 굳이 둘 다 있을까?
  • [멋사 클라우드 5기] Day 4 - 상속, 다형성, 그리고 abstract vs interface
  • [멋사 클라우드 5기] Day 2 - 배열, Git & GitHub 기본 개념 정리
  • [멋사 클라우드 5기] Day 1 - Java 개발 환경과 기본 타입
allluck777
allluck777
allluck777
    • 분류 전체보기 (44) N
      • AWS (0)
      • Network (0)
      • Linux (0)
      • Docker (0)
      • Project (4)
        • CloudNote (4)
      • Learning Log (36) N
      • Lecture (3)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (3)
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.6
allluck777
[멋사 클라우드 5기] Day 3 - 객체 생성 흐름과 클래스 구조 이해하기
상단으로

티스토리툴바