2026년 02월 15일

🏗️ Java 클래스 — 객체를 만드는 설계도

Java Spring Boot
Cover Image

🏗️ Java 클래스 — 객체를 만드는 설계도

핵심 아이디어 : 클래스는 객체를 찍어내는 설계도다. 설계도(클래스) 하나로 여러 개의 객체(인스턴스)를 만들 수 있다.


1️⃣ 클래스와 인스턴스

클래스  →  객체를 생성하기 위한 설계도
인스턴스  →  클래스로부터 만들어진 실제 객체
인스턴스화  →  클래스 → 객체를 만드는 과정

하나의 설계도로 여러 대의 자동차를 만들 수 있듯,
하나의 클래스로 여러 개의 인스턴스를 생성할 수 있다.


2️⃣ 클래스 선언

// 파일명과 클래스명은 반드시 동일해야 한다 (SportsCar.java)
public class SportsCar {
}

클래스명 작성 규칙

구분내용
스타일첫 글자 대문자, camelCase
사용 가능문자, 숫자, $, _
금지숫자로 시작

💡 하나의 소스 파일에 클래스를 여러 개 선언할 수 있지만, public class는 파일명과 동일한 클래스 하나뿐이다. 특별한 이유가 없다면 파일 하나에 클래스 하나를 권장한다.


3️⃣ 객체 생성 — new 연산자

// 클래스 변수 = new 클래스();
Student s1 = new Student();  // Heap에 객체 생성 후 주소를 s1에 저장
Student s2 = new Student();  // 별개의 객체가 또 생성됨

클래스의 두 가지 역할

종류설명예시
라이브러리 클래스다른 클래스에서 이용Student
실행 클래스main() 메서드 보유StudentExample

4️⃣ 클래스의 3가지 구성 멤버

public class ClassName {
    int fieldName;           // 필드(field)    : 객체의 데이터 저장
    ClassName() { ... }     // 생성자(constructor) : 객체 생성 시 초기화
    void methodName() { ... } // 메서드(method) : 객체의 동작 정의
}

5️⃣ 필드(Field)

필드 선언과 기본값

초기값 없이 선언하면 타입에 따라 자동으로 기본값으로 초기화된다.

public class Car {
    String model;    // null
    int speed;       // 0
    boolean start;   // false
    Tire tire;       // null (참조 타입)
}
타입기본값
정수 (byte, short, int, long)0
실수 (float, double)0.0
논리 (boolean)false
참조 (클래스, 배열, 인터페이스)null

필드 vs 지역변수

구분필드지역변수
선언 위치클래스 블록생성자·메서드 블록
존재 위치객체 내부 (Heap)메서드 호출 시에만 (Stack)
사용 범위객체 내·외부해당 블록 내부만

필드 사용 — 도트(.) 연산자

Car myCar = new Car();

// 외부에서 필드 읽기·변경
System.out.println(myCar.speed);  // 읽기
myCar.speed = 60;                 // 변경

6️⃣ 생성자(Constructor)

기본 생성자

생성자를 별도로 선언하지 않으면 컴파일러가 자동으로 추가한다.

// 작성한 코드
public class Car { }

// 컴파일 후 실제 동작
public class Car {
    public Car() { }  // 자동 추가
}

개발자가 생성자를 직접 선언하면 기본 생성자는 자동 추가되지 않는다.

생성자에서 필드 초기화 + this 키워드

public class Korean {
    String nation = "대한민국";  // 공통값 → 필드 선언 시 초기화
    String name;                 // 개인마다 다름 → 생성자에서 초기화
    String ssn;

    public Korean(String name, String ssn) {
        this.name = name;  // this = 현재 객체 / this.name = 필드
        this.ssn = ssn;
    }
}
Korean k1 = new Korean("박자바", "011225-1234567");
Korean k2 = new Korean("김자바", "930525-0654321");
// 같은 클래스지만 서로 다른 name, ssn을 가진 독립 객체

💡 매개변수명과 필드명이 같을 때는 반드시 this.필드명으로 구분한다.


7️⃣ 생성자 오버로딩(Overloading)

매개변수의 타입·개수·순서를 다르게 해서 생성자를 여러 개 선언할 수 있다.

public class Car {
    Car() { ... }
    Car(String model) { ... }
    Car(String model, String color) { ... }
    Car(String model, String color, int maxSpeed) { ... }
}

// 호출 시 매개값에 따라 자동으로 생성자 선택
Car car1 = new Car();
Car car2 = new Car("그랜저");
Car car3 = new Car("그랜저", "흰색");
Car car4 = new Car("그랜저", "흰색", 300);

this()로 생성자 간 중복 제거

오버로딩된 생성자 사이에 중복 코드가 많다면, this()로 한 생성자에 위임한다.

// ❌ 중복 코드 발생
Car(String model) {
    this.model = model;
    this.color = "은색";
    this.maxSpeed = 250;
}
Car(String model, String color) {
    this.model = model;
    this.color = color;
    this.maxSpeed = 250;
}

// ✅ this()로 위임
Car(String model) {
    this(model, "은색", 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;
}

⚠️ this()는 반드시 생성자의 첫 줄에 위치해야 한다.


📌 핵심 요약

클래스  =  필드 + 생성자 + 메서드
new     =  Heap에 객체 생성 후 주소 반환
필드    =  초기값 없으면 타입별 기본값으로 자동 초기화
this    =  현재 객체 참조 (필드명·매개변수명 충돌 해결)
this()  =  같은 클래스 내 다른 생성자 호출 (중복 제거)
← 목록으로 돌아가기