인스턴스(instance) 멤버란 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메서드를 말한다.
각각 인스턴스 필드, 인스턴스 메서드라고 부른다.
스택영역에 생기는 변수인 지역변수는 개발자가 별도로 초기화하지 않으면 쓰레기 값을 갖게 된다. classArea(methodArea)과 Heap은 별도로 초기화해주지 않아도 정수형은 0, 부동소수점은 0.0, 논리형은 false, 객체는 null로 초기화 된다. 지역변수는 별도로 초기화해야 하는데 멤버변수는 왜 자동으로 초기화가 될까?
그것은 지역변수는 한 지역에서만 쓰는 변수이지만 멤버변수는 공유변수의 성격을 가지고 있기 때문이다.
public class Car {
//필드
int gas;
//메서드
void setSpeed(int speed) {}
}
위의 코드를 보면 gas필드와 setSpeed() 메서드는 인스턴스멤버이기 때문에 외부 클래스에서 사용하기 위해서는 객체를 생성하고 참조변수로 접근을 해야한다.
객체를 생성하는 것에는 new연산자를 사용하면 되는데 아래의 코드에서 나타내었다.
Car yourCar = new Car();
yourCar.gas = 20;
youtCar.setSpeed(80);
yourCar의 참조변수를 만들고 new라는 객체를 생성하였다. 그렇게되면 statck에 yourCar의 참조변수가 생기며
new 연산자로 Car객체가 Heap영역에 배치가 된다. 참조변수 yourCar가 Car객체를 참조하고 있는 형태가 된다.
참조변수.gas , 참조변수.car로써 접근을 할 수 있다. 여기서 인스턴스 필드는gas는 객체마다 따로 존재하고, 인스턴스메서드 setSpeed() 는 객체마다 존재하지 않고 메서드 영역에 저장되고 공유된다.
this
객체 외부에서 인스턴스 멤버에 접근하기 위해 참조변수를 사용하는 것과 같은 의미로 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this 를 사용할 수 있다.
▶ this를 사용하는 이유
public class car {
//필드
String model;
int speed;
//생성자
Car(String model){
this.model = model;
}
//메서드
void setModel(String model){
this.model = model;
}
this.model은 자신이 가지고 있는 model필드라는 뜻이다. this 는 주로 생성자와 메서드의 매개변수이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용한다.