안녕하세요
인스턴스에 대한 개념이 헷갈려서 질문드립니다.
제가 아는 인스턴스는 static 처럼 클래스가 로드 될때 바로 메모리에 같이 올라가서 공유되는것이 아니라, 명시적으로 new 코드를 입력하여 인스턴스를 생성하고 그때마다 새롭게 초기화된 값이 메모리에 올라가기 때문에, 여러개를 생성한다고 해도 각각의 새로운 인스턴스가 생성될뿐, 그 값이 계속 지속 공유 되는게 아닌것으로 알고 있습니다.
아래의 코드를 보시면 메인메서드에서 tv라는 인스턴스를 생성하였고, 처음에는 tv.setChannel(30)을 통하여 prevChannel에는 현재 채널인 0값을 channel에는 매개변수 값인 30을 주었습니다.
이해가 안가기 시작한것이 tv.gotoPrevChannel()을 호출하면서 부터인데 보시면 알겠지만
해당 메서드 안에는 새롭게 MyTv2 tv = new Mytv2라는 인스턴스하고 있습니다.
메인 메서드 안에 인스턴스 tv와 저 tv는 이름이 같더라도 엄연히 다른 주소를 가지고 각각의 인스턴스를 가지고 있는 참조변수라는것은 알고 있습니다.
그런데 어째서 tv.gotoPrevChannel이 호출될때 새롭게 생성되는 참조변수 tv는, 메인메서드 안에 있는 참조변수 tv가 prevChannel의 리터럴 값을 setChannel로 변경한다고 해서 서로 다른 주소값이라 그 값을 공유 할수 없는데 sysout을 통해서 찍는 이전채널 값을 메인메서드 안에 참조변수 tv가 변경한 값으로 출력해줄수 있는건가요?
gotoPrevChannel의 tv.getChannel는 엄염히 새롭게 생성된 tv 안에 있는 메서드임에도 불구하고 말이죠
```
class MyTv2 {
private boolean isPowerOn;
private int channel;
private int volume;
private int prevChannel;
private final int MAX_VOLUME = 100;
private final int MIN_VOLUME = 0;
private final int MAX_CHANNEL = 100;
private final int MIN_CHANNEL = 0;
public boolean getIsPowerOn() {
return isPowerOn;
}
public int getChannel() {
return channel;
}
public int getVolume() {
return volume;
}
public void gotoPrevChannel() {
MyTv2 tv = new MyTv2();
tv.setChannel(prevChannel);
System.out.println("이전채널 : "+tv.getChannel());
}
public void setIsPowerOn(boolean isPowerOn) {
this.isPowerOn = !isPowerOn;
}
public void setChannel(int channel) {
//매개변수 channel의 값이 100보다 작거나 크고
//0보다 크거나 작으면 채널을 매개변수 값으로 변경한다.
if(channel<=MAX_CHANNEL && channel>=MIN_CHANNEL) {
this.prevChannel = this.channel;
this.channel = channel;
}else if(channel>MAX_CHANNEL){
this.channel = MIN_CHANNEL;
}else if(channel<MIN_CHANNEL) {
this.channel = MAX_CHANNEL;
}
}
public void setVolume(int volume) {
if(volume<=MAX_VOLUME && volume>=MIN_VOLUME) {
this.volume = volume;
}else if(volume>MAX_VOLUME){
this.volume = MAX_VOLUME;
}else if(volume<MIN_VOLUME) {
this.volume = MAX_VOLUME;
}
}
}
public class Ex11 {
public static void main(String[] args) {
MyTv2 tv = new MyTv2();
tv.setChannel(30);
System.out.println("현재채널 : "+tv.getChannel());
tv.gotoPrevChannel();
tv.setChannel(50);
System.out.println("현재채널 : "+tv.getChannel());
tv.gotoPrevChannel();
}
}
```
## 결과값
```
현재채널 : 30
이전채널 : 0
현재채널 : 50
이전채널 : 30
```
sehongpark님의 답변
# 이해하신 내용이 맞습니다.
위 문제의 원인은 *모든 인스턴스의 초기 채널값이 `0`* 이기에 생기는 혼선이라 판단됩니다.