Language/JAVA

[이것이 자바다].ch5.클래스

JSJH._. 2025. 12. 26. 17:40

[이것이 자바다] 05. 클래스

안녕하세요. 이번에는 자바의 핵심이라고도 할수있는 클래스에 대해 정리한 내용입니다. 객체지향 언어를 배울때 이런 객체의 개념을 아는것이 정말 중요한데, 확실히 자바로 개념을 익히니까 다른 언어에서 이런 클래스가 나와도 사용하기가 더 쉬워지는것 같습니다.


1. 클래스 사용 이유

  • 서로 연관된 데이터를 따로 관리하는건 매우 비효율적이며, 오류를 유발할 수 있습니다.
  • 객체 지향 프로그래밍(OOP)
    • 각 대상을 하나의 객체(Object)로 선언, 객체의 설계도 == 클래스(Class)입니다.
  • 클래스 == 속성(필드) + 행동(메서드)로 이루어져 있습니다.

2. 클래스와 객체

  • 클래스(Class)
    • 객체 설계도
    • 데이터와 기닝을 정의합니다.
  • 객체(Object)
    • 클래스를 바탕으로 만들어진 실체(Instance)입니다.
    • 메모리 공간 차지, 고유한 데이터를 저장합니다.
  • 객체 생성 행위 : 인스턴스화(Instantiation)
  • 생성된 객체 : 클래스의 인스턴스(Instance)라고 부릅니다.
// 객체의 설계도(클래스)
public class 클래스이름 {
    // 필드 (Field): 객체의 데이터, 속성
    타입1 이름1;
    타입2 이름2;
    ...
}
// 클래스 객체 생성
클래스이름 클래스변수 = new 클래스이름(); // 'new' 연산자로 객체 생성(인스턴스화)
  • 클래스 객체 : 참조 변수입니다.
    • 실제 힙(Heap) 메모리의 주소값을 저장합니다.

3. 3가지 핵심 구성요소

필드 / 생성자 / 메소드

필드 (Fields)

  • 클래스 블록 {}에 선언된 변수. 객체의 데이터(멤버 변수)입니다.
  • 사용법
    • 클래스변수.필드이름
    • . 으로 접근합니다.

생성자 (Constructors)

  • new 연산자로 객체 생성 할때 호출됩니다.
    • 호출되며 객체의 필드를 초기화합니다.
  • 규칙
    1. 생성자 이름 == 클래스 이름
    2. 리턴 타입이 없음
  • 기본 생성자 (Default Constructor)
    • 생성자 안만들면 자바 컴파일러가 public 클래스이름() {} 형태 빈 생성자를 자동 추가합니다.
  • 생성자 오버로딩
    • 객체 생성 방법 여러 가지 제공합니다.
    • 매개변수의 타입, 개수, 순서 바꾸면서 오버로딩합니다.
public class 클래스이름 {
    타입1 이름1;
    // 생성자 1: 기본 생성자
    public 클래스이름() {
    }
    // 생성자 2
    public 클래스이름(타입 이름) {
        this.이름1 = 이름;
        // this == 이 객체 자신
    }
    // 생성자 3
    public 클래스이름(타입 이름1, 타입 이름2) {
        this.이름1 = 이름2;
    }
}
  • this/this():
    • this.필드명
      • 매개변수 이름 == 필드 이름
      • 이 객체 자신의 필드임을 명시합니다.
    • this()
      • 생성자 내부에서 사용합니다.
      • 같은 클래스의 다른 생성자 호출합니다.
      • 반드시 생성자 첫 줄 위치해야 합니다.
public 클래스이름(String 변수1, String 변수2) {
    this(변수1, 변수2, 값); // 아래의 생성자를 호출함
}
public 클래스이름(String 변수1, String 변수2, int 변수3) {
    this.변수1 = 변수1;
    this.변수2 = 변수2;
    this.변수3 = 변수3;
}

메소드 (Methods)

  • 객체의 동작, 기능을 정의하며 like 함수와 같습니다.
리턴타입 메소드이름(매개변수, ...) {
    실행할 코드;
    return 값;
}
  • 리턴 타입

    • 메소드가 끝나고 return 할 값의 타입입니다.
    • 리턴 없으면 void입니다.
    • return
      1. 메소드 실행 즉시 중단
      2. return 뒤의 값 반환
  • 메소드 오버로딩 (Method Overloading)

    • 클래스 내부 이름은 같지만 매개변수의 타입, 개수, 순서 바꾸면서 오버로딩합니다.

4. 인스턴스 멤버 vs 정적 멤버

인스턴스 멤버 (Instance Member)

  • 객체 소유입니다.
    • 객체 생성 >> 객체 내부 독립적인 공간 할당됩니다.
    • 반드시 객체 생성 >> 참조변수.멤버이름 형태로 접근합니다.

정적(static) 멤버

  • 클래스 소유입니다.
    • 프로그램 시작 시 클래스 자체에 한 번만 고정 공간 할당됩니다.
    • 객체 생성 X >> 클래스이름.멤버이름 형태로 바로 접근합니다.
    • 모든 객체가 static 멤버 공유합니다.
  • 공용 데이터
    • 모든 객체가 동일한 값을 공유할때 사용합니다.
  • 유틸리티 기능
    • 객체의 상태와 상관없이 결과 도출할 때 사용합니다.

static 사용 주의사항

  • 정적(static) 메소드 내부 인스턴스 멤버 사용 불가합니다.
    • 인스턴스 멤버 : 객체가 생성되어야만 존재하기 때문입니다.
  • but, 인스턴스 메소드에서 static 멤버 사용 가능합니다.

5. final 키워드

  • final 필드: 상수(Constant)화
    • 단 한 번만 초기화 가능 이후 값 변경 불가합니다.
  • final 클래스: 마지막 자식
    • 다른 클래스가 상속(extends) 불가능합니다.
  • final 메소드:
    • 자식 클래스에서 오버라이딩(재정의) 불가능합니다.

6. 패키지와 접근 제한자

패키지 (Package)

  • 연관된 클래스 묶음 관리 폴더입니다.
    • 클래스의 이름 중복 방지, 체계적 코드 관리합니다.
  • import
    • 다른 패키지의 클래스 사용하기 위해 해당 클래스 경로 명시합니다.

접근 제한자 (Access Modifier)

  • 외부 접근 범위 제한 >> 데이터 보호, 의도치 않은 사용방지 (캡슐화)합니다.

  • public

    • 완전 공개.
    • 어떤 클래스에서든 접근가능합니다.
  • protected

    • 가족 공개.
    • 같은 패키지 or 상속 관계 다른 패키지의 자식 클래스에서만 접근 가능합니다.
  • default

    • 이웃 공개.
    • 아무것도 안적으면 default, 같은 패키지의 클래스에서만 접근 가능합니다.
  • private

    • 나만 공개.
    • 해당 클래스 내부에서만 접근 가능합니다.

Getter와 Setter 메소드

  • private 필드를 외부에서 안전하게 접근할 수 있도록 하는 public 메소드입니다.

  • Getter

    • 필드 값 읽어서 반환합니다.
  • Setter

    • 외부로부터 필드 값을 변경합니다.

ex)

public class Car {
    private int speed; // 외부에서 직접 수정 불가

    // Getter
    public int getSpeed() {
        return speed;
    }

    // Setter
    public void setSpeed(int speed) {
        if (speed < 0) { // 유효성 검사
            this.speed = 0;
            return; // 음수 속도는 무시
        }
        this.speed = speed;
    }
}

감사합니다.