이전 포스팅에서 클래스와 객체의 관계에 대해 알아보았다. 그렇다면 객체와 인스턴스는 어떤 관계를 갖고있을까? 이번 포스팅에서 알아보자. 두 관계를 알아보기 전에, 객체와 인스턴스에 대해 알아보도록 하겠다.

객체

간단하게 객체는 실제로 존재하는 것이라고 정의하는데, 실제로 존재하는 것이라면, 속성과 기능의 집합이라고 말할 수 있다. 여기서 속성과 기능에 따라 용도가 달라진다고 정의하였다. 그렇다면 속성과 기능은 어떻게 나뉠까?

속성과 기능

속성기능
크기, 길이, 높이, 색상, 볼륨, 채널켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 바꾸기

속성(property) 👉 멤버 변수(variable)
기능(function) 👉 메서드(method)

채널 👉 int channelNumber
채널 높이기 👉 channelUp() { }

인스턴스

객체는 인스턴스를 포함하는 일반적인 의미이다.

  • 책상은 인스턴스다 👉 책상은 책상 클래스의 객체다
  • 책상은 객체다 👉 책상은 책상 클래스의 인스턴스다

인스턴스화(instantiate)

클래스로부터 인스턴스를 생성하는 것이자, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.

그러면 객체 = 인스턴스? Not really!

오해하기 쉬운 부분이 맞다. Tv클래스로부터 만들어진 객체를 Tv클래스의 인스턴스라고 하듯이, 결국 인스턴스와 객체는 같은 의미이다.
BUT!!! 객체(object) 는 모든 인스턴스를 대표하는 포괄적인 의미이고, 인스턴스(instance) 는 어떤 클래스로부터 만들어진 것인지를 보다 강조하는 의미를 갖고 있다. 이 부분을 꼭 생각하자👀👀

인스턴스의 생성과 사용에 대해서 알아보자😎

  • 생성 방법
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv tv; //Tv클래스 타입의 참조변수 tv를 선언
tv = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 tv에 저장
  • 예제 코드
class Main {
	public static void main(String[] args) {
    	Tv tv; //Tv인스턴스를 참조하기 위한 변수 t선언
        tv = new Tv(); //Tv인스턴스를 생성
        
        tv.channel = 7; //Tv인스턴스의 멤버변수 channel의 값을 7로 설정
        tv.channelDown(); //Tv인스턴스의 메서드 channelDonw()을 호출
        
        System.out.println("Channel: " + tv.channel);
    }
}

class Tv {
	
    //Tv의 속성(멤버변수)
    String color; //색상
    boolean power; //전원상태(on/off)
    int channel; //채널
    
    //Tv의 기능(메서드)
    void power() {
    	power = !power;
    }
    
    void channelUp() {
    	++channel;
    }
    
    void channelDown() {
    	--channel;
    }
}

위 예제코드를 통해 단계별로 자세히 살펴보자👀

  1. Tv tv;

    Tv 클래스 타입의 참조변수 tv를 선언하였다. 메모리에 참조변수 tv를 위한 공간이 마련되는 것이다. 아직 인스턴스가 생성되지 않은 상태이기 때문에 이 참조변수로 할 수 있는 것은 아무 것도 없다.
  2. tv = new Tv();

    연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 주소가 0x100인 곳에 생성되었다고 가정하자. 이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다. color는 참조형이므로 null로, power는 boolean이므로 기본값이 false로, channel은 int값이므로 0으로 초기화 된다.

    그 다음에는 대입연산자(=)에 의해 생성된 객체의 주소값이 참조변수 tv에 저장된다. 이제는 참조변수 tv를 통해 Tv인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해서는 참조변수가 반.드.시 필요하다.
  3. tv.channel = 7;

    참조변수 tv에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다. 여기서 알 수 있는 것 처럼, 인스턴스의 멤버변수(속성)를 사용하려면, '참조변수.멤버변수'와 같이 하면된다.
  4. tv.channelDown();

    참조변수 tv가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다. channel Down 메서드는 멤버변수 channel에 저장되어 있는 값을 1 감소시킨다.
  5. System.out.println("Channel: " + tv.channel);

    참조변수 tv가 참조하고 있는 Tv인스턴스의 멤버변수 channel에 저장되어 있는 값을 출력한다. 현재 channel의 값은 6이므로 "Channel: 6"가 화면에 출력될 것이다.

마지막으로, 인스턴스와 참조변수의 관계는 마치 우리가 일상생활에서 사용하는 TV와 TV리모콘의 관계와 같다. TV리모콘(참조변수)을 사용하여 TV(인스턴스)를 다루기 때문이다.

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

profile
Welcome to my velog! I love learning something new to build up my ability in development field. I don't think it is shame not to know, but it is shame to pretend to know about something you don't know.

0개의 댓글