[기본 개념] 1 | (1.2) 인스턴스 생성

728x90

[기본 개념] 1 | (1.2) 인스턴스 생성

1 클래스와 객체의 정의 & 용도

2 객체와 인스턴스

3 객체의 구성요소 (속성 & 기능)

4> 인스턴스 생성 & 사용

5 객체 배열

6 클래스의 또 다른 정의

4. 인스턴스의 생성 & 사용

 저번에 TV클래스를 선언한 것은 TV설계도를 작성한 것에 불과하므로, TV인스턴스를 생성해야 제품(TV)를 사용할 수 있다. 일반적으로 다음과 같이 한다.

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

Tv t;                      // Tv클래스 타입의 참조변수 t를 선언
t = new Tv();              // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

예제/TvTest.java

class Tv {
	// Tv의 속성(멤버변수)
    String color;                // 색상
    boolean power;               // 전원상태(on/off)
    int channel;                 // 채널
    
    // Tv의 기능(메서드)
    void power() { power = !power; }   // TV를 켜거나 끄는 기능을 하는 메서드
    void channerUp() { ++channel; }    // TV의 채널을 높이는 기능을 하는 메서드
    void channerDown() { --channel; }  // TV의 채널을 낮추는 기능을 하는 메서드
}

class TvTest {
	public static void main(String[] args) {
    	Tv = t;                  // Tv인스턴스를 참조하기 위한 변수 t를 선언
        t = new Tv();            // Tv인스턴스를 생성한다.
        t.channel = 7;           // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
        t.channelDown();         // Tv인스턴스의 메서드 channelDown()을 호출한다.
        System.out.println("현재 채널은 " + t.channel + " 입니다.");
    }
}
실행결과

현재 채널은 6 입니다.

 

 이 예제는 TV클래스로부터 인스턴스를 생성하고 인스턴스의 속성(channel)과 메서드(channelDown())을 사용하는 방법을 보여 주는 것이다. 이 예제를 단계별로 자세히 살펴보도록 하자.

1. Tv = t ;

 TV클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다. 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.

2. t = new Tv () ;

 연산자 new에 의해 TV클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 주소가 0×100인 곳에 생성되었다고 가정하자. 이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화된다.

 color는 참조형이므로 null로, power는 boolean이므로 false로, 그리고 channel은 int이므로 0으로 초기화된다.

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

3. t.channel = 7 ;

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

4. t.channelDown () ;

 참조변수 t가 참조하고 있는 TV인스턴스의 channelDown메서드를 호출한다. channelDown메서드는 멤버변수 channel에 저장되어 있는 값을 1 감소시킨다.

 

            void channelDown() { -- channel ; }

 

 channelDown()에 의해서 channel의 값은 7에서 6이 된다.

5. System.out.println("현재 채널은 " + t.channel + " 입니다.") ;

 참조변수 t가 참조하고 있는 TV인스턴스의 멤버변수 channel에 저장되어 있는 값을 출력한다. 현재 channel의 값은 6이므로 '현재 채널은 6입니다.'가 화면에 출력된다.

 

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

 

예제/TvTest2.java

class Tv {
	// Tv의 속성(멤버변수)
    String color;                // 색상
    boolean power;               // 전원상태(on/off)
    int channel;                 // 채널
    
    // Tv의 기능(메서드)
    void power() { power = !power; }   // TV를 켜거나 끄는 기능을 하는 메서드
    void channerUp() { ++channel; }    // TV의 채널을 높이는 기능을 하는 메서드
    void channerDown() { --channel; }  // TV의 채널을 낮추는 기능을 하는 메서드
}

class TvTest2 {
	public static void main(String[] args) {
    	Tv t1 = new Tv();  // Tv t1; t1 = new Tv();를 한 문장으로 가능
        Tv t2 = new Tv(); 
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
        
        t1.channel = 7;  // channel 값을 7으로 한다.
        System.out.println("t1의 channel값을 7로 변경하였습니다.");
        
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
    }
}
실행결과

t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 channel값을 7로 변경하였습니다.
t1의 channel값은 7입니다.
t2의 channel값은 0입니다.

 

 이 예제는 TV클래스의 인스턴스 t1과 t2를 생성한 후에, 인스턴스 t1의 멤버변수인 channel의 값을 변경하였다.

 

 같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일하다. 그리고 참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가르키는 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가르키는 것은 가능하지 않다.

 

 

 

 

 

출처 | Java의 정석 (남궁 성)

728x90