java/객체지향

2. 객체 생성 및 사용

VanillaSky7 2023. 1. 12. 22:09

 

지난 글(https://developer-vanilla.tistory.com/5)에서 객체, 클래스, 인스턴스에 대한 정의와 용도, 설계도에 해당

 

되는 클래스의 정의 코드까지 살펴보았습니다. 이번 글에서는 객체의 생성 및 사용에 대해 살펴보겠습니다.


객체 생성


객체는 클래스의 실체화. 좀 더 쉽게 풀어보면 설계도를 통해 만들어진 제품이라고 하였습니다.

 

따라서 객체는 해당 클래스를 사용했다를 가리킬 수 있는 변수를 선언해야 하는데 이때 이 변수를 "참조변수"라고 합니다.

 

Refrigerator R; ← Refrigerator(냉장고)라는 클래스 타입을 사용하는 R이 바로 참조변수!

R = new Refrigerator(); ← 인스턴스화 하여 냉장고라는 인스턴스를 만들었고 이 주소를 대입연산자 =을 통해 참조변수 R에 저장

 

Refrigerator R = new Refrigerator(); ← 물론 한 줄로 작성할 수 있고, 참조변수 R이 이 인스턴스에 대한 주소를 저장!

 

* 참조변수 데이터타입) 참조변수 R은 Refrigerator라는 번지값을 통해 객체를 참조하는 참조타입(Reference type)의 데이터타입을 가지게 되는데, 이 참조타입의 데이터타입은 String, Int 등과 같이 실제값을 변수에 저장하는 기본 데이터타입(Primitive type)과는 다릅니다. 좀 더 자세한 이해가 필요하시다면 자바 데이터 타입 등과 같은 키워드를 통해 검색해보시면 좋겠습니다!

 

따라서 다음과 같은 객체마다의 고유한 번지 주소값, 변수(속성)와 메서드(기능)가 묶인 객체가 생성되었습니다!

 

0x100(번지 주소값)  
power false
temperature 0
power()  
temperatureUp()  
temperatureDown()  

 

Refrigerator R2 = new Refrigerator(); ← 이번에는 R2라는 참조변수를 통해 인스턴스화 하여 한 개의 객체를 더 생

성해보겠습니다.

 

0x200  
power false
temperatrue 0
power()  
temperatureUp()  
temperatureDown()  

 

또 다른 객체 즉, 두 번째 제품을 만들어 보았습니다. 차이점은 가리키는 번지 주소값이 다릅니다. (이어 다루게 될 객체의 사용 파트에서 번지 주소값에 대한 설명드릴테니 끝까지 정독해주세요!)


객체 사용


 

만들어진 객체는 참조변수를 통해 사용할 수 있습니다.

 

R.temperature = 15; ← 참조변수 R이 가리키는 객체의 temperature라는 변수에 15를 저장

R.temperatureUp(); ← 참조변수 R이 가리키는 객체의 temperatrueUp()이라는 메서드를 호출

 

매우 간단합니다!

 

* 멤버) 말 그대로 구성원이라는 뜻으로, 객체에도 구성원이 존재하는데, 변수와 메서드가 이에 해당합니다!

 

이때 중요한 것이 한 가지 있는데, 앞서 우리는 두 개의 객체이자 제품을 생성했습니다. 그렇다면 번지 주소값이 서로 다른

 

R과 R2의 경우 다음과 같은 코드에 각각 어떻게 동작할까요?

 

R.temperature = 15;

 

당연하게도 참조변수 R을 통해 연결되는 객체의 temperature의 값만 15가 되고, 참조변수 R2를 통해 연결되는 객체의

 

temperature는 그대로 0일 것입니다. 그런데 만약 제가 다음과 같은 코드를 추가하면 이번에는 어떻게 동작할까요?

 

R2 = R

R.temperature = 15;

 

참조변수 R2에 참조변수 R로 새롭게 대입되었으므로 R2의 주소값은 R이 가리키는 객체의 번지 주소값(0x100)으로 옮겨

 

졌습니다. 따라서 다음과 같은 코드에 의해 확인하게 되면 R이 가리키는 객체의 temperature의 값인 15를 띄울 것입니다.

 

System.out.println(R2.temperature)

 

즉 다른 번지 주소값을 통해 각 객체들을 구분할 수 있었던 것입니다!


요약 및 코드


 

객체 생성 요약)

 

클래스명 참조변수명;

참조변수명 = new 클래스명();

 

(또는)

 

클래스명 참조변수명 = new 클래스명();

 

객체 사용 요약)

 

참조변수명.멤버(변수) = 값;

참조변수명.멤버(메서드);

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 냉장고 설계도
class Refrigerator {
    int temperature;
    boolean power;
    
    void power() { power = !power; }
    void temperatureUp() { ++temperature; }
    void temperatureDown() { --temperature; }
    
}
 
// 냉장고 제품화(객체 생성, 인스턴스화)
class Exam {
    public static void main(String args[]) {
        
        Refrigerator R = new Refrigerator(); // 첫 번째 객체 생성
        Refrigerator R2 = new Refrigerator(); // 두 번째 객체 생성
        R.temperature = 15// 첫 번째 객체 temperature 변수에 15 값 저장
        R2.temperature = 20// 두 번째 객체 temperature 변수에 20 값 저장
        System.out.println(R.temperature);
        System.out.println(R2.temperature);
        R2 = R;
        
        System.out.println(R2.temperature);
    }
}
cs