반응형

객체의 생성과 사용

 

1. 객체의 생성

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

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

Tv클래스 타입의 참조변수 t를 선언해서 객체를 다룰 참조변수를 선언한다.
그리고 해당 참조변수 t에 Tv클래스의 인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 참조변수t에 저장한다.

 

2. 객체의 사용

t.channel = 7;			// Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
t.channelDown();		// Tv인스턴스의 메서드 channelDown()을 호출한다.
Sytem.out.println("현재 채널은 " + t.channel + " 입니다.");

객체를 사용한다는 이야기는, 객체가 가지고 있는 변수와 메서드를 사용한다는 뜻이다.

위 코드를 보자.
참조변수 t가 가리키는 객체의 변수 channel에다 7을 저장한다.

그리고, 참조변수 t가 가리키는 객체에 channelDown이라는 메서드를 호출한다.
이때, channelDown이라는 메서드가 호출되면, 
Tv클래스에 정의된 channelDown메서드에 있는 문장들이 실행된다. 
변수 채널에 있는 값을 1감소시키는 것이다.

그리고나서 1감소된 현재 채널은 몇인지 출력하게 되어있다.

과정을 정리해보면,
1. 클래스 작성 (설계도)
2. 객체(인스턴스) 생성 (제품)
3. 객체의 사용 (사용)

간략히 설명한 과정을 좀더 자세히 알아보자.

Tv t;	// Tv클래스 타입의 참조변수 t를 선언

Tv는 기본형이 타입에 포함되지 않으므로 참조형이다.
우리가 Tv를 만들거니까 Tv타입을 이용해서 참조형 변수를 t를 선언한다.

t = new Tv();	// Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

그리고나서 객체를 생성한다.
생성된 객체(객체의 주소)를 Tv타입의 참조변수 t에 저장한다.

이제 생성한  Tv객체 인스턴스를 다룰 때는, 반드시 참조변수 t를 사용해서 다루게 된다.
즉, 생성하려는 객체의 타입과 해당 객체를 저장할 참조변수의 타입이 일치해야 한다.

객체 인스턴스가 생성될 때는, 해당 인스턴스를 생성한 클래스(설계도)의 내용대로 만들어진다.

클래스에 변수가 3개 +  메서드3개 있으므로 총 6개의 멤버로 구성되어 있다.
이때 멤버라는 것은 Tv클래스가 가진 구성요소를 말한다.

이제 객체를 생성했으니 객체를 사용해야한다.

t에 저장한 객체가 가진 변수를 사용해보자.

t.channel = 7;	// Tv인스턴스의 멤버변수 channel의 값을 7로 한다.

참조변수 t가 가리키는 객체의 channel이라는 변수에 7을 저장하는 것이다.

그 다음엔, 메서드를 사용해보자.

t.channelDown();	// Tv인스턴스의 메서드 channelDown()을 호출한다.

참조변수 t가 가리키는 channelDown()이라는 메서드를 호출하는 것이다.
메서드를 사용하는 것이다. (메서드 호출이라고도 한다.)
그러면, Tv클래스의 channelDown()이라는 메서드에 있는 문장이 실행된다.
해당 문장의 내용은, 변수 channel의 값을 1 감소시키는 것이다.

이렇게 객체를 생성하고, 변수를 사용하고, 메서드를 호출하는 식으로 사용하면 된다.

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

이 문장은 변수값을 읽어오는 것인데, 참조변수t가 가리키는 객체의 변수 channel의 값을 읽어오는 것이다.

7에서 1감소한 6이 출력될 것이다.

 


 

이번에는 객체를 2개 만들었다.

Tv t1 = new Tv();
Tv t2 = new Tv();

하나는 참조변수 t1으로 가리키고, 하나는 참조변수 t2로 가리킨다.

t1.channel = 7;

참조변수 t1이 가리키는 객체의 채널을 7로 바꾸는 문장이다.

이렇게 t1이 가리키는 객체의 channel변수에만 7이 저장된 것을 확인할 수 있다.
즉, t1과 t2는 별도의 저장공간이다.

객체를 만들 때마다 클래스가 가지고있는 저장공간(변수)이 객체별로 생성되며, 
그리고 각 변수는 어느 한쪽만 바꾼다고해서 영향을 받지 않는다. 즉 별도의 변수이다.

그래서 값을 찍어보면,

System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 cahnnel값은 " + t2.channel + "입니다.");

t1.channel은 7, t2.channel은 0이 찍힐 것이다.

객체마다 별도의 저장공간이 생긴다는 점을 기억하자.

그리고 만약에 이상태에서 

t1 = t2;

이라고 하면,  t2에 저장되어 있는 값을 t1에 저장하라고 하는 것이므로 
t2와 연결되어있는 객체의 주소값이 t2에서 사라진다.

그러면, t2와 연결되어있던 객체는 참조변수가 없기 때문에, 더이상 사용할 수 없는 객체가 된다.

원래는 필요할때 만든 객체가 더이상 필요하지 않게 되면, 객체를 삭제해 주어야 하는데,
Java는 우리가 할 필요 없이 편리하게 GC라는 가비지 컬렉터가 사용하지 않는 이러한 객체들을 찾아서 없애주며 메모리를 관리해준다.

우리는 필요할 때 만들어서 쓰기만 하면된다. 메모리 정리 할 필요없다.

이렇게 t1 = t2라고 하고나서,

System.out.println("t2의 cahnnel값은 " + t2.channel + "입니다.");

t2.channel을 출력해보면, t2와 t1이 가리키고 있는 객체의 주소는 같은 상태이기 때문에 7이 출력된다.

즉, 하나의 객체에 여러개의 참조변수를 사용하는 것이 가능하다.(여러개의 리모컨)

 

 

반응형

'JAVA' 카테고리의 다른 글

클래스의 정의  (0) 2022.03.24
객체 배열  (0) 2022.03.24
하나의 파일에 여러 클래스 작성하기  (0) 2022.03.24
클래스와 객체  (0) 2022.03.24
객체지향 언어  (0) 2022.03.24