클래스의 정의
클래스의 용도
객체의 정의
겍체의 용도
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.
인스턴스와 객체는 같은 의미이므로 두 용어의 사용을 엄격히 구별할 필요는 없다. 하지만 문맥에 따라 구별하여 사용하는 것이 좋다.
클래스 ---인스턴스화---> 인스턴스( 객체 )
객체는 속성과 기능의 집합이라고 할 수 있다.
클래스란 객체를 정의한 것이므로 클래스에는 객체의 모든 속성과 기능이 정의되어있다.
속성(property) = 멤버변수
기능(function) = 메서드, 함수
클래스를 선언하는 것은 설계도를 작성한 것에 불과하다.
즉, 인스턴스를 생성해야 사용할 수 있다.
클래스명 변수명;
//클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명()
//클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
TV t;
//TV클래스 타입의 참조변수 t를 선언
t = new TV();
//TV인스턴스를 생성한 후, 생성된 TV인스턴스의 주소를 t에 저장
TV t;
TV클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다. 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.
t = new TV();
연산자 new에 의해 TV클래스의 인스턴스가 메모리의 빈 공간에 생성된다.
이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.
인스턴스에서 구현된 메서드를 참조변수 t를 통해서 사용할 수 있게 되었다.
t.메서드명(); //참조변수 t를 통해서 인스턴스의 메서드 호출
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스 타입과 일치해야한다.
예제1
class Tv{
//Tv의 속성(멤버변수)
String color; //색상
bollean power; //전원상태(on/off)
int channel; //채널
//tv의 기능(메서드)
void power(){power = !power;} //tv를 켜거나 끄는 기능
void chnnelUp(){ ++channel; } //tv의 채널을 높이는 기능
void chnnelDown(){ --channel; } //tv의 채널을 낮추는 기능
}
class TvTest2()
{
public static void main(String args[])
{
Tv t1 = new Tv();
Tv t2 = new Tv();
System.out.printlnl(t1.channel);
System.out.printlnl(t2.channel);
t1.channel = 7; //chnnel 값을 7로 한다.
System.out.printlnl(t1.channel);
System.out.printlnl(t2.channel);
}
}
실행결과
0
0
7
0
예제에서 Tv클래스의 인스턴스 t1과 t2를 생성한 후에, 인스턴스 t1의 멤버변수인 channel의 값을 변경했다.
같은 클래스로부터 생성되었을지라도 각 인스컨스의 속성은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일하다.
예제2
class Tv{
//Tv의 속성(멤버변수)
String color; //색상
bollean power; //전원상태(on/off)
int channel; //채널
//tv의 기능(메서드)
void power(){power = !power;} //tv를 켜거나 끄는 기능
void chnnelUp(){ ++channel; } //tv의 채널을 높이는 기능
void chnnelDown(){ --channel; } //tv의 채널을 낮추는 기능
}
class TvTest2()
{
public static void main(String args[])
{
Tv t1 = new Tv();
Tv t2 = new Tv();
System.out.printlnl(t1.channel);
System.out.printlnl(t2.channel);
t2 = t1; //t1이 저장하고 있는 값을 t2에 저장
t1.channel = 7; //chnnel 값을 7로 한다.
System.out.printlnl(t1.channel);
System.out.printlnl(t2.channel);
}
}
실행결과
0
0
7
7
t2 = t1;
t1은 참조변수이므로, 인스턴스의 주소를 저장하고 있다. 이 문장이 수행되면, t2가 가지고 있던 값은 잃어버리게 되고 t1에 저장되어 있던 값이 t2에 저장되게 된다. 그렇게 되면 t2역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되고, t2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다.
t1, t2 모두 같은 Tv 클래스의 인스턴스를 가리키고 있기 때문에 t1.channel과 t2.channel의 값은 7이 된다.
즉, 참조변수에는 하나의 값만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는 것은 가능하지만,
하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않다.