
프로그래밍에서 Class(클래스), 객체(Object), 인스턴스(Instance)는 객체 지향 프로그래밍(OOP)의 핵심 개념입니다. 이 세 가지 용어는 서로 밀접하게 연관되어 있지만, 각 개념의 의미와 사용 방법에 있어서는 차이가 있습니다.
Class(클래스)는 객체를 정의하는 틀 혹은 설계도입니다. 클래스는 객체가 가져야 할 속성(변수)과 동작(메서드)을 정의하며, 이를 기반으로 객체를 생성합니다. 쉽게 말해, 클래스는 일종의 '청사진' 역할을 하여, 이 청사진에 따라 여러 객체를 만들어낼 수 있습니다.
클래스는 그 자체로 메모리 공간을 차지하지 않으며, 단순히 객체를 만들기 위한 틀일 뿐입니다. 클래스를 통해 여러 객체를 만들어낼 수 있으며, 객체마다 서로 다른 값을 가질 수 있습니다. 예를 들어, 자동차라는 클래스를 만든다면, 이 클래스는 차의 속성(예: 색상, 브랜드, 모델)과 동작(예: 가속, 감속)을 정의할 수 있습니다.
class Car {
String color;
String brand;
void accelerate() {
System.out.println("The car is accelerating.");
}
void brake() {
System.out.println("The car is slowing down.");
}
}
객체(Object)는 클래스를 기반으로 만들어진 실제 존재하는 '물체'입니다. 즉, 클래스에서 정의된 속성과 동작을 갖는 구체적인 데이터 구조를 의미합니다.
객체는 클래스의 '인스턴스화'된 실체로, 실제 메모리에 할당되어 동작할 수 있습니다. 객체는 클래스에서 정의된 변수와 메서드를 가지고 있으며, 이 객체들은 각각 다른 값을 가질 수 있습니다. 앞서 만든 자동차 클래스에서 여러 대의 자동차 객체를 만들 수 있고, 각각의 자동차는 다른 색상과 브랜드를 가질 수 있습니다.
Car car1 = new Car();
car1.color = "Red";
car1.brand = "Toyota";
Car car2 = new Car();
car2.color = "Blue";
car2.brand = "Honda";
위 예시에서 car1과 car2는 객체로, 서로 다른 속성값(색상, 브랜드)을 가집니다. 이처럼 같은 클래스를 기반으로 한 객체라도 각기 다른 데이터를 가질 수 있습니다.
인스턴스(Instance)는 객체와 혼동되기 쉬운 개념이지만, 보다 정확히 말하면 '특정 클래스의 실체화된 객체'를 의미합니다. 즉, 인스턴스는 클래스의 구체적인 구현물을 지칭하는 용어입니다.
"객체"와 "인스턴스"라는 용어는 종종 같은 의미로 사용되기도 하지만, 인스턴스는 클래스에서 생성된 특정 객체를 지칭하는 데 사용됩니다. 쉽게 말해, 객체는 일반적인 의미로 사용되는 반면, 인스턴스는 특정 클래스에 속한 객체임을 강조할 때 사용합니다.
Car myCar = new Car();

class Person {
String name;
int age;
void introduce() {
System.out.println("Hi, I'm " + name + " and I'm " + age + " years old.");
}
}
Person person1 = new Person();
person1.name = "Alice";
person1.age = 25;
person1.introduce(); // 출력: Hi, I'm Alice and I'm 25 years old.
Person person2 = new Person();
person2.name = "Bob";
person2.age = 30;
person2.introduce(); // 출력: Hi, I'm Bob and I'm 30 years old.
위 코드에서 Person 클래스는 '사람'을 나타내는 틀입니다. person1과 person2는 이 클래스에서 생성된 객체이며, 동시에 인스턴스라고 부를 수 있습니다. person1과 person2는 각각 다른 이름과 나이를 가지지만, 둘 다 Person 클래스의 인스턴스라는 공통점이 있습니다.
객체 지향 프로그래밍(OOP)에서 클래스는 추상화(abstraction)를 제공하며, 객체는 상태(state)와 행동(behavior)을 담는 구체적인 실체입니다. 클래스를 통해 여러 인스턴스를 만들 수 있고, 이를 통해 복잡한 문제를 간결하고 재사용 가능한 코드로 해결할 수 있습니다.