※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
[ 1 ] 클래스, 객체, 인스턴스
- 클래스 : 객체를 만들어내기 위해 정의해 놓은 것. 즉, 객체의 설계도
- 객체 : 소프트웨어 세계에 구현할 대상이자 클래스에 선언된 모양대로 생성된 실체이다. 객체는 속성과 기능이라는 구성 요소로 이루어지며 일반적으로 속성은 멤버변수, 기능은 메서드라고 한다.
- 인스턴스 : 클래스로부터 객체를 만드는 과정을 '클래스의 인스턴스화'라고 하며 어떤 클래스로부터 만들어진 객체를 인스턴스라고 한다.
[ 2 ] 객체와 인스턴스
그렇다면 객체와 인스턴스는 같은 것인가? 결론부터 말하자면 객체와 인스턴스는 같은 의미이면서도 차이가 존재한다.
객체는 '모든 인스턴스'를 대표하는 포괄적인 의미를 갖는 반면, 인스턴스는 어떤 클래스로부터 만들어진 것인지(A라는 클래스의 인스턴스 등)를 강조하는 보다 구체적인 의미를 갖는다.
객체 지향 프로그래밍 관점에서도 차이를 확인할 수 있는데, 객체는 특정 클래스의 타입으로 선언되었을 때를, 인스턴스는 연산자 new에 의해 메모리에 실제로 할당될 때를 의미한다.
public class Person {
String name;
int age;
}
public class Main {
public static void main(String[] args) {
// 객체
Person p1, p2;
// 인스턴스화
p1 = new Person();
// p1은 Person 클래스의 인스턴스
p2 = new Person();
// p2는 Person 클래스의 인스턴스
}
}
[ 3 ] 인스턴스 생성 과정 및 사용
위 코드의 Person 클래스로 인스턴스를 생성하는 과정을 살펴보자.
Person p1;
(1) 클래스명 참조변수명; 으로 인스턴스의 주소값을 담을 수 있는 참조변수를 선언한다.
인스턴스가 생성되지 않았으므로 아직 참조변수 p1으로 할 수 있는 것은 없다.
p1 = new Person();
(2) 연산자 new에 의해 Person 클래스의 인스턴스가 메모리에 생성(주소값이 0x01이라고 가정)된다. 멤버변수는 각 자료형에 해당하는 기본값으로 초기화된다. (해당 예시에서 참조변수인 String의 기본값은 null, int의 기본값은 0)
(3) 대입연산자(=)에 의해 생성된 인스턴스의 주소값이 참조변수 p1에 저장된다.
(1), (2), (3)의 과정을 거친 후 이제 참조변수 p1을 통해 Person 클래스의 인스턴스에 접근할 수 있다.
※ 즉, 인스턴스를 다루기 위해서는 참조변수가 반드시 필요하다.
다음과 같이 Person 클래스의 인스턴스를 참조하는 참조변수 p1, p2가 있다.
public class Main {
public static void main(String[] args) {
Person p1, p2;
p1 = new Person();
p2 = new Person();
p1.age = 10;
p2.age = 20;
}
}
p1, p2의 멤버변수 int를 10과 20으로 초기화하자. 그렇다면 현재 상황을 아래와 같은 그림으로 표현할 수 있을 것이다.
이 상황에서 p2 = p1; 을 하면 어떻게 될까?
p1이 참조하고 있는 인스턴스(주소값 0x01)를 p2도 참조하게 된다. 그 결과 p2가 원래 참조하던 인스턴스(주소값 0x02)는 더 이상 사용될 수 없다.
p2 = p1;
// 10
System.out.println(p1.age);
// 10
System.out.println(p2.age);
p2.age = 15;
// p1과 p2가 같은 인스턴스 주소값을 저장하고 있으므로 p1.age도 15가 된다
System.out.println(p1.age);
[ 4 ] 객체 배열
객체 배열은 결국 '참조변수의 배열'이다. 그러므로 객체 배열 안에는 객체가 저장되는 것이 아니라 객체의 주소가 저장된다.
Person[] arr = new Person[3];
arr[0], arr[1], arr[2] 는 인스턴스를 담기 위한 참조변수일 뿐이지, 아직 실제 인스턴스가 담기지 않았다.
즉, arr[0], arr[1], arr[2] 는 참조변수의 기본값인 null로 초기화되어 있다.
그러므로 객체 배열의 각 요소에 인스턴스를 생성하는 과정을 잊지 말자.
Person[] arr = new Person[3];
for(int i = 0; i < arr.length; i++) {
arr[i] = new Person();
}
'Programming > Java' 카테고리의 다른 글
[Java] 스택(Stack)과, 큐(Queue) (3) | 2023.02.28 |
---|---|
[Java] JVM의 메모리 구조(Runtime Data Area) (0) | 2023.02.22 |
[Java] JVM, Java 환경변수 설정(Mac, 기본 zsh 쉘) (5) | 2023.01.18 |
[Java] List Interface (0) | 2022.10.10 |
[Java] 컬렉션 프레임워크 (1) | 2022.10.03 |