Java 클래스와 객체 완전 이해: 명확한 개념과 실전 예제
클래스와 객체는 Java 객체지향 프로그래밍의 핵심입니다. 밀접하게 관련되어 있지만 서로 다른 역할을 합니다. 이 가이드는 둘의 차이를 명확히 하고 실전 예제로 구현 방법을 보여줍니다.
Java에서 클래스란?
클래스는 객체 그룹에 공통적인 구조와 행동을 정의하는 청사진입니다. 객체가 가질 데이터 필드(속성)와 메서드(함수)를 지정합니다.
클래스 문법
class <ClassName> {
// 필드들
// 메서드들
}
Java에서 객체란?
객체는 클래스의 인스턴스입니다. 고유한 메모리 위치를 가진 구체적 엔티티로, 클래스에 정의된 필드 값을 보유합니다. 객체에서 메서드를 호출하면 그 특정 인스턴스에게 동작을 요청하는 것입니다.
객체 생성 문법
ClassName obj = new ClassName();
클래스와 객체의 핵심 차이
- 클래스 — 타입의 추상적 정의 (청사진).
- 객체 — 그 청사진에서 생성된 구체적 인스턴스.
실전 예제: 반려동물 관리 시스템
강아지 데이터 관리 시스템 구축을 상상해보세요. 공통 속성(품종, 나이, 크기, 색상)과 행동(먹기, 자기, 앉기)을 파악합니다. 이들이 Dog 클래스의 데이터 멤버와 메서드가 됩니다.
시스템의 각 강아지마다 해당 속성의 구체적 값으로 새 Dog 객체를 인스턴스화합니다.

Java 클래스 설계 원칙
- 단일 책임 원칙 (SRP) — 클래스는 변경 이유가 하나여야 함.
- 개방-폐쇄 원칙 (OCP) — 클래스는 확장엔 열려있고 수정엔 닫혀있어야 함.
- 리스코프 치환 원칙 (LSP) — 파생 클래스는 기반 클래스로 치환 가능해야 함.
- 의존성 역전 원칙 (DIP) — 구현이 아닌 추상화에 의존해야 함.
- 인터페이스 분리 원칙 (ISP) — 클라이언트 필요에 맞춘 세분화된 인터페이스 제공.
예제 프로그램: main 메서드가 클래스 내부에 있는 경우
// 클래스 선언
public class Dog {
// 인스턴스 변수
String breed;
String size;
int age;
String color;
// 강아지 정보 반환 메서드
public String getInfo() {
return "Breed is: " + breed + " Size is:" + size + " Age is:" + age + " color is: " + color;
}
public static void main(String[] args) {
Dog maltese = new Dog();
maltese.breed = "Maltese";
maltese.size = "Small";
maltese.age = 2;
maltese.color = "white";
System.out.println(maltese.getInfo());
}
}
출력:
Breed is: Maltese Size is:Small Age is:2 color is: white
예제 프로그램: main 메서드가 별도 클래스에 있는 경우
// Dog 클래스 정의
class Dog {
String breed;
String size;
int age;
String color;
public String getInfo() {
return "Breed is: " + breed + " Size is:" + size + " Age is:" + age + " color is: " + color;
}
}
// main 메서드를 가진 별도 클래스
public class Execute {
public static void main(String[] args) {
Dog maltese = new Dog();
maltese.breed = "Maltese";
maltese.size = "Small";
maltese.age = 2;
maltese.color = "white";
System.out.println(maltese.getInfo());
}
}
출력:
Breed is: Maltese Size is:Small Age is:2 color is: white
요약
- Java 클래스는 해당 타입의 모든 객체에 공통적인 구조와 행동을 정의.
- 객체는 클래스의 인스턴스로, 구체적 데이터를 보유하고 메서드 실행 가능.
- 상속, 메서드 오버라이딩 등 OOP 개념으로 클래스 확장해 복잡한 시스템 구축 가능.