[Java] Chapter 6. 클래스

SeungWoo Cha·2025년 9월 7일

Chapter 6. 클래스

6.1 객체 지향 프로그래밍

1. 객체란?

  • 속성(필드) + 동작(메소드)으로 구성됨.
  • 현실 세계 객체를 소프트웨어적으로 설계하는 것 → 객체 모델링
class Car {
    String color;   // 속성(필드)
    void drive() {  // 동작(메소드)
        System.out.println("Driving...");
    }
}

2. 객체의 상호작용 (메소드 호출)

  • 객체 간 데이터 교환은 메소드 호출로 수행됨.
  • 매개값: 실행에 필요한 값 / 리턴값: 실행 결과
int sum = calc.add(3, 5); // 메소드 호출

3. 객체 간 관계

  • 집합 관계(포함), 사용 관계(호출), 상속 관계(확장)

4. 객체 지향 프로그래밍 특징

  1. 캡슐화 – 필드/메소드 묶음, 외부에서 구현 숨김
  2. 상속 – 코드 재사용, 유지보수 용이
  3. 다형성 – 같은 이름 메소드, 매개변수에 따라 다르게 동작

6.2 객체와 클래스

  • 클래스 → 객체의 설계도
  • 객체 생성된 상태 = 인스턴스
  • 객체 생성 과정 = 인스턴스화

6.3 클래스 선언

  • 클래스는 필드, 생성자, 메소드로 구성됨.
  • 소스파일명과 동일한 클래스만 public 가능.
public class Student {
    String name;
    int age;
    
    void study() {
        System.out.println(name + " is studying");
    }
}

6.4 객체 생성과 클래스 변수

  • new 연산자로 객체 생성 → 힙(heap)에 저장, 스택(stack)에는 참조 주소 저장

  • 클래스 용도

    1. 라이브러리 클래스 – 기능 제공
    2. 실행 클래스 – main() 보유, 실행 가능
Student s1 = new Student(); // new 사용

6.5 클래스의 구성 멤버

  1. 필드 – 데이터 저장
  2. 생성자 – 객체 초기화
  3. 메소드 – 동작 정의

6.6 필드 선언과 사용

  • 클래스 블록 안에 선언, 초기값 없으면 기본값 할당됨.
  • 객체 필요, 참조변수.필드로 접근
Car myCar = new Car();
myCar.color = "red";  // 필드 접근

6.7 생성자 선언과 호출

  • new → 생성자 호출 → 객체 초기화 → 참조값 반환
  • 기본 생성자: 선언 없으면 컴파일러가 자동 생성
  • 오버로딩: 매개변수 다르게 여러 생성자 선언
  • this(): 다른 생성자 호출
class Car {
    String model;
    Car(String model) {
        this(model, "은색", 250); // 다른 생성자 호출
    }
    Car(String model, String color, int speed) {
        this.model = model;
    }
}

6.8 메소드 선언과 호출

  • 구조: 리턴타입 메소드명(매개변수) { ... }
  • 호출: 참조변수.메소드()

가변 매개변수

int sum(int... values) {
    int result = 0;
    for (int v : values) result += v;
    return result;
}

메소드 오버로딩

  • 같은 이름, 매개변수 다르게 선언 가능

6.9 인스턴스 멤버 vs 정적 멤버

  • 인스턴스 멤버: 객체 생성 후 사용
  • 정적 멤버: 객체 없이 클래스 이름으로 접근 가능
class Counter {
    int count;           // 인스턴스 멤버
    static int total;    // 정적 멤버
}
  • this: 객체 자신 참조, 인스턴스 멤버 접근 가능

6.10 정적 멤버

  • static 키워드로 선언, 클래스에 고정됨.
  • 객체 없이 클래스명.멤버 형태로 사용.
class Util {
    static int add(int a, int b) {
        return a + b;
    }
}
int result = Util.add(5, 3);

정적 블록

  • 복잡한 초기화 수행 가능
class Config {
    static String info;
    static {
        info = "Setting Loaded";
    }
}
  • 주의: 정적 메소드/블록에서 인스턴스 멤버나 this 사용 불가

좋습니다 👍 이번에 주신 6.11 ~ 6.15(final 필드, 패키지, 접근제한자, Getter/Setter, 싱글톤 패턴) 부분도 이전과 동일하게 요약 중심 + 코드 예제 보강으로 정리해드렸습니다.


6.11. final 필드와 상수

  • 일반 필드(인스턴스/정적)는 값 변경 가능 → 경우에 따라 수정 불가 필드 필요
  • final 사용 시 값이 한 번 저장되면 수정 불가

1. final 필드

  • 초기화 방법

    1. 선언 시 대입
    2. 생성자에서 대입
class Car {
    final String model;
    
    Car(String model) {   // 생성자 초기화
        this.model = model;
    }
}

2. 상수 (static final)

  • 불변의 공용 값
  • 선언 시 반드시 초기화
  • 관례: 대문자 + 언더스코어
class Earth {
    static final double RADIUS = 6400; // 단위: km
}

6.12. 패키지

  • 클래스의 고유한 식별자 역할
  • 일반적으로 회사 도메인 역순 사용 (com.company.project)

패키지 선언

package com.mycompany.project;

import문

  • 다른 패키지 클래스 사용 시 필요
  • import 패키지명.*; → 하위 패키지 포함 ❌
import com.hankook.Tire; // 특정 클래스
import com.hankook.*;    // 동일 패키지 내 모든 클래스

클래스 충돌 시

  • 전체 이름(fully-qualified name)으로 구분
com.hankook.Tire tire = new com.hankook.Tire();

6.13. 접근 제한자

  • 캡슐화객체 무결성 보장 목적
  • 접근 범위 요약:
제한자클래스패키지자식 클래스전체
public
protected
(default)
private

클래스

  • public, default만 가능

생성자 / 필드 / 메소드

  • public, protected, default, private 모두 가능

6.14. Getter와 Setter

  • 무결성 보장 위해 private 필드 사용
  • 외부 접근 → Getter / Setter 제공
class Member {
    private String name;

    public String getName() {     // Getter
        return name;
    }
    public void setName(String n) {  // Setter
        this.name = n;
    }
}

6.15. 싱글톤 패턴

  • 프로그램 전체에서 단 하나의 객체만 생성
  • 핵심: 생성자를 private으로 막음
public class Singleton {
    // private 정적 필드, 한 번만 로딩됨
    private static final Singleton instance = new Singleton();
    
    private Singleton() {}  // private 생성자

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

사용 예

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); // true (동일 객체)
profile
한 발자국씩

0개의 댓글