셋째 날에는 자바에서 객체가 생성되는 과정과
객체를 구성하는 클래스의 주요 요소들을 중심으로 학습했다.
1. 생성자란 무엇인가
생성자(Constructor)는 new 연산자를 통해 객체가 생성될 때 호출되며,
객체를 사용 가능한 상태로 초기화하는 역할을 한다.
여기서 말하는 객체 초기화란:
- 필드에 초기값을 설정하고
- 필요한 메소드를 호출해
- 객체를 바로 사용할 수 있도록 준비하는 것을 의미한다.
생성자가 정상적으로 실행되면:
- 힙(Heap) 영역에 객체가 생성되고
- 해당 객체의 메모리 주소가 반환된다.
2. 기본 생성자와 명시적 생성자
모든 클래스에는 반드시 생성자가 존재한다.
- 클래스에 생성자를 하나도 선언하지 않으면
→ 컴파일러가 기본 생성자를 자동으로 추가한다. - 하지만 생성자를 하나라도 명시적으로 선언하면
→ 컴파일러는 기본 생성자를 추가하지 않는다.
public class Car { }
⬇️ 컴파일 시 내부적으로는
public class Car {
public Car() { }
}
명시적으로 생성자를 선언하는 이유는
객체를 다양한 값으로 초기화하기 위해서다.
3. 필드 초기화 방법
객체가 생성될 때 필드는 기본값으로 자동 초기화된다.
- int → 0
- boolean → false
- 참조 타입 → null
기본값이 아닌 다른 값으로 초기화하려면 두 가지 방법이 있다.
- 필드 선언 시 초기값 지정
- 생성자에서 초기화
상황에 따라 적절한 방식을 선택하면 된다.
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 |
