객체 생성과 클래스 변수

3215 단어 JavaJava

📢 해당글은 'Java의 정석', '이것이 자바다' 책의 일부 내용을 인용합니다.

클래스로부터 인스턴스를 생성할 때는 다음과 같이 한다.

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

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

new 연산자는 클래스로부터 객체를 생성시키는 연산자이다. 인스턴스를 생성할 클래스를 읽어서 인스턴스 생성에 필요한 메모리를 계산한 다음에, 메모리 힙(heap) 영역의 빈 공간을 찾아 객체를 생성한다. 그리고 생성된 객체의 메모리 주소를 반환한다.

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

public 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 + "입니다.");

	}

}

실행결과 :

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

  2. t = new Tv();
    연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 이 때 멤버변수는 각 자료형에 해당하는 기본값으로 초기화된다. 그 다음 대입연산자(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장된다. 이제는 참조변수 t를 통해 Tv인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해서는 참조변수가 반드시 필요하다.

  3. t.channel = 7;
    참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다. 인스턴스의 멤버변수(속성)을 사용하려면 '참조변수.멤버변수'와 같이 하면 된다.

  4. t.channelDown();
    참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다. channelDown메서드는 멤버변수 channel에 저장되어있는 값을 1 감소시킨다. channel의 값은 6이된다.

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

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

public class TvTest2 {

	public static void main(String[] args) {
		
		Tv t1 = new Tv();
		Tv t2 = new Tv();
		System.out.println("t1의 channel 값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel 값은 " + t2.channel + "입니다.");
		
		t1.channel = 7;
		System.out.println("t1의 channel값을 7로 변경했습니다.");
		
		System.out.println("t1의 채널값은 " + t1.channel + "입니다.");
		System.out.println("t2의 채널값은 " + t2.channel + "입니다.");

	}

}

실행결과:

Tv클래스는 하나지만 new연산자를 사용한 만큼 객체가 메모리에 생성된다. 이러한 객체들은 Tv 클래스의 인스턴스들이다. 비록 같은 클래스로부터 생성되었지만 각각의 Tv객체는 자신만의 고유 데이터를 가지면서 메모리에서 활동하게 된다. t1과 t2가 참조하는 Tv객체는 완전히 독립된 서로 다른 객체이다. 같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일하다.

좋은 웹페이지 즐겨찾기