초기화란 변수에 처음 값을 설정하는 것입니다. 자바에서는 변수나 필드를 여러 방식으로 초기화할 수 있습니다.
초기화 방식 |
설명 |
예시 |
---|---|---|
명시적 초기화 |
선언과 동시에 값을 지정 |
int x = 10; |
초기화 블록 |
중괄호 {}를 사용한 블록에서 초기화 |
static 또는 인스턴스 초기화 블록 |
생성자 초기화 |
생성자 내부에서 변수 초기화 |
this.value = 100; |
기본값 초기화 |
자바가 자동으로 설정 (필드에 한함) |
int → 0, boolean → false 등 |
생성자는 객체를 생성할 때 자동으로 호출되는 특수한 메소드입니다. 클래스 이름과 동일하며, 반환 타입이 없습니다.
클래스 이름과 동일
반환값이 없음 (void도 쓰지 않음)
오직 객체 생성 시(new 키워드 사용 시) 자동 호출
필요에 따라 오버로딩 가능 (여러 개 정의)
자바 컴파일러는 사용자가 생성자를 정의하지 않으면 자동으로 기본 생성자를 생성합니다.
public class Person {
String name;
// 기본 생성자 (명시적으로 작성)
public Person() {
name = "홍길동";
}
}
public class Person {
String name;
public Person(String name) {
this.name = name; // this는 현재 인스턴스를 가리킴
}
}
사용 예:
Person p = new Person("이순신");
System.out.println(p.name); // 이순신
하나의 클래스에 여러 개의 생성자를 정의할 수 있으며, 매개변수의 개수나 타입으로 구분합니다.
public class Car {
String model;
int year;
public Car() {
this("모델 없음", 0);
}
public Car(String model) {
this(model, 0);
}
public Car(String model, int year) {
this.model = model;
this.year = year;
}
}
하나의 생성자에서 같은 클래스 내의 다른 생성자를 호출할 때 this()를 사용합니다.
public class Book {
String title;
int price;
public Book() {
this("제목 없음", 0);
}
public Book(String title, int price) {
this.title = title;
this.price = price;
}
}
객체가 생성될 때마다 실행됩니다. 생성자보다 먼저 실행됩니다.
public class Example {
int number;
{
number = 100; // 인스턴스 초기화 블록
}
public Example() {
System.out.println("생성자 호출됨");
}
}
클래스가 메모리에 최초 로딩될 때 단 한 번 실행됩니다.
public class StaticExample {
static int staticVar;
static {
staticVar = 500;
System.out.println("static 초기화 블록 실행");
}
}
객체가 생성될 때 실행 순서는 다음과 같습니다:
필드의 명시적 초기화
인스턴스 초기화 블록
생성자
개념 |
설명 |
---|---|
명시적 초기화 |
변수 선언과 동시에 초기값 지정 |
초기화 블록 |
생성자 호출 전 실행되는 초기화 영역 |
생성자(Constructor) |
객체 생성 시 호출, 클래스 이름과 동일, 반환형 없음 |
this 키워드 |
인스턴스 자신을 가리킴 |
this() |
다른 생성자를 호출할 때 사용 |
생성자 오버로딩 |
다양한 인자를 받는 여러 생성자 정의 가능 |
public class Student {
String name;
int grade;
// 인스턴스 초기화 블록
{
grade = 1;
}
// 생성자 1
public Student() {
this("이름 없음");
}
// 생성자 2
public Student(String name) {
this.name = name;
}
void printInfo() {
System.out.println("이름: " + name + ", 학년: " + grade);
}
public static void main(String[] args) {
Student s = new Student("김영희");
s.printInfo(); // 이름: 김영희, 학년: 1
}
}