클래스 (Class)
클래스는 객체 지향 프로그래밍에서 설계도와 같은 역할을 한다.
현실 세계에서 어떤 물건을 만들기 위한 설계도가 필요하듯이, 클래스는 객체를 정의하고 만드는데 필요한 설계도이다.
클래스에는 객체를 구성하는 멤버가 명시된다.
구성 멤버로는 필드 (field), 생성자 (constructor), 메소드 (method) 가 있다.
- 필드 (field) : 객체의 고유 데이터, 상태 정보 등의 속성을 가진다. 선언 형태는 변수와 비슷하다.
- 생성자 (constructor) : 객체 생성시 초기화를 담당하며, 오버로딩이 가능하다.
- 메소드 (method) : 객체의 동작을 나타내며, 특정 기능을 수행할 수 있다.
기본 구조는 다음과 같으며, 파일 이름과 동일한 이름의 클래스에만 'public' 을 붙일 수 있다.
public class ClassName{
//필드
int field;
//생성자
ClassName() {}
//메소드
void methodName(){}
}
* 필드는 변수와 비슷한 형태지만 차이가 있다. *
- 변수는 선언된 생성자 또는 메소드 블록 내에서만 사용할 수 있다. (지역변수의 개념)
- 필드는 생성자와 모든 메소드에서 사용이 가능하다.
객체 (Object)
객체는 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중 자신의 속성을 가지고 다른 것과 식별되는 것을 말한다.
이는 클래스에 정의된 형식으로 생성된 실체를 말한다. 'new' 연산자를 통해 생성되며, 개별적으로 사용되거나 다른 객체와 관계를 맺을 수 있다.
또한 객체는 클래스에 선언된 모양 그대로 생성된 실체, '클래스의 인스턴스(instance)' 라고도 불린다.
즉, 객체 지향 프로그래밍의 관점에서 클래스의 형식으로 선언된 것을 객체라고 한다.
public class Main{
public static void main(String[] args){
Class a = new Class(); //생성된 객체
}
}
인스턴스 (Instance)
인스턴스는 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체를 말한다. 이것이 객체가 클래스의 인스턴스라고도 불리는 이유이다. 클래스라는 추상적인 설계도로부터 실제로 구현된 것이 객체이고, 객체가 메모리에 할당될 때 인스턴스라고 한다.
인스턴스는 독립적으로 사용되기보단 위처럼 '~의 인스턴스' 로 많이 쓰인다.
추상적 개념 <-> 실체로 구현된 것의 관계에 관한 용어라고 생각하면 쉬울 것이다.
인스턴스 멤버 (instance member)
인스턴스 멤버는 객체를 생성한 뒤 사용할 수 있는 필드와 메소드를 말한다.
이를 인스턴스 필드, 인스턴스 메소드라고 한다. 중요한 것은 일반 변수나 메소드와 다르게 객체가 없으면 사용할 수 없다.
인스턴스 멤버는 객체에 소속되었기 때문에, 객체가 생성되지 않는다면 사용할 수 없다.
// 클래스
public class A{
...
}
public class Main{
public static void main(String[] args){
A a; // 객체
a = new A(); // a는 A의 인스턴스
}
}
정리
- 관계
클래스 (class) → 객체 (object) ≒ 인스턴스 (instance)
- 비교
클래스 (Class) | 객체 (Object) | 인스턴스 (Instance) |
설계도 | 클래스의 실체화 (구현 대상) | 객체를 메모리에 할당 |
클래스 타입으로 선언될 때 | 객체가 실제로 사용될 때 | |
실체 | 관계 |