[기본 개념] 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의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 1 | (2.3) 메서드 호출, RETURN 문 (0) | 2021.08.18 |
---|---|
[기본 개념] 1 | (2.2) 메서드 선언/구현 (0) | 2021.08.17 |
[기본 개념] 1 | (2.1) 선언 위치에 따른 변수 종류, 클래스/인스턴스 변수 (0) | 2021.08.17 |
[기본 개념] 1 | (1.3) 객체 배열, 클래스의 정의 (0) | 2021.08.11 |
[기본 개념] 1 | (1.1) 클래스와 객체 (0) | 2021.08.09 |