[Java] 클래스와 객체

배창민·2025년 9월 10일
post-thumbnail

자바 클래스·객체


1) 클래스와 객체

클래스란?

  • 서로 다른 타입의 필드+메소드를 묶어 만든 사용자 정의 자료형.
  • 객체(인스턴스)는 클래스 설계도로부터 new로 생성.

변수만으로 데이터 관리할 때의 문제

  • 변수명 난립, 메소드 인자 과다, 서로 다른 타입을 한 번에 반환 불가.

클래스 사용

class Member {
  String id, pwd, name;
  int age; char gender;
  String[] hobby;
}

// 사용
Member m = new Member();          // 기본값: 참조형 null, 숫자 0, char '\u0000'
m.id="user01"; m.age=20;

2) 캡슐화(Encapsulation)

왜?

  • 필드 직접 접근 시 유효성 통제 불가, 변경 전파 큼(결합도 ↑).

어떻게?

  • 필드 private + **공개 메소드(getter/setter)**에서 검증.
class Monster {
  private String kinds;
  private int hp;

  public void setKinds(String kinds){ this.kinds = kinds; }
  public void setHp(int hp){ this.hp = Math.max(0, hp); }
  public String getInfo(){
    return "종류=" + kinds + ", 체력=" + hp;
  }
}

접근 제어자 요약

범위클래스 내부같은 패키지하위클래스전체
publicOOOO
protectedOOO
(default)OO
privateO

3) 추상화(Abstraction)

개념

  • 유연성을 위해 공통은 남기고 비공통은 제거 → 객체 도출, 클래스 설계.
  • OOP는 **객체 간 메시지(메소드 호출)**로 상호작용 설계가 핵심.

예시(행위 중심)

  • 카레이서: 시동걸기/엑셀/브레이크/시동끄기(→ 자동차에 메시지)
  • 자동차: 시동/전진/정지/시동끄기, 상태(시동 on/off, 속도)

예시(데이터 중심: DTO)

class MemberDTO {
  private int number; private String name;
  private int age; private char gender;
  private double height, weight;
  private boolean activated;
  // getter/setter (boolean은 isActivated)
}

4) 생성자(Constructor)

  • 인스턴스 초기 1회 수행 메소드. 기본생성자는 컴파일러가 자동 추가.
  • 오버로딩으로 다양한 초기화 제공, **this(...)**로 생성자 체이닝.
class User {
  String id, pwd, name; java.util.Date enrollDate;

  public User() {}
  public User(String id, String pwd, String name){
    this.id=id; this.pwd=pwd; this.name=name;
  }
  public User(String id, String pwd, String name, java.util.Date d){
    this(id,pwd,name); this.enrollDate = d;
  }
  public User(User other){ this(other.id,other.pwd,other.name,other.enrollDate); }
}

5) 오버로딩(Overloading)

  • 메소드명 동일하되 **파라미터(타입/개수/순서)**가 달라야 함.
  • 반환형/접근제어자/매개변수 이름은 판단기준 아님.
void test() {}
void test(int n) {}
void test(int n, String s) {}
void test(String s, int n) {}

6) static & final

static

  • 프로그램 시작 시 로드, 인스턴스 없이 클래스명.멤버 접근.
  • 여러 인스턴스가 공유해야 하는 값/동작에 사용.

final

  • 변경 불가 의미.

    • 변수: 재할당 불가(상수는 static final 대문자 관례).
    • 메소드/클래스: 오버라이드/상속 금지.
  • final 필드는 선언 시 혹은 생성자에서 반드시 초기화.


7) 변수의 종류(메모리·수명)

구분키워드저장영역생성시기소멸시기
클래스 변수staticstatic 영역프로그램 시작종료
인스턴스 변수(없음)heap객체 생성GC 대상
지역 변수메소드 내부stack블록 진입블록 종료

8) 초기화 블록

  • 인스턴스 초기화 블록: 모든 생성자 전에 공통 실행.
  • 정적 초기화 블록: 클래스 로드 시 1회 실행.
class A {
  static { /* 정적 초기화 */ }
  { /* 인스턴스 초기화 */ }
}

9) 객체 배열(클래스 자료형 배열)

  • 참조(레퍼런스)들의 배열로 여러 객체를 일괄 관리.
class Car {
  String name; int max;
  Car(String n, int m){ name=n; max=m; }
  void driveMaxSpeed(){ System.out.println(name+"가 "+max+"km/h!"); }
}

Car[] cars = new Car[3];
cars[0]=new Car("페라리", 300);
cars[1]=new Car("람보르기니", 350);
cars[2]=new Car("롤스로이스", 250);

for (Car c : cars) c.driveMaxSpeed();

요약

  • 필드는 private, 공개는 메소드 중심(행위 설계 우선).
  • 생성자 체이닝으로 중복 제거.
  • 불변 의도면 final 적극 사용.
  • 공용 상수: public static final + UPPER_SNAKE_CASE.
  • 유효성 검증은 setter/팩토리/생성자에서.
profile
개발자 희망자

0개의 댓글