[Java] 객체(인스턴스화)
메서드로 내가 수정할 수 있으면 인스턴스라고 하고,
메서드로 수정하지 못하면 오브젝트라고 합니다.
인스턴스화 란?
오브젝트를 인스턴스처럼 쓰면 인스턴스화(변경가능),
인스턴스를 오브젝트처럼 쓰면 오브젝트화(변경불가)
위에 두 개의 개념을 이해하기 위해서 코드로 설명을 드리도록 하겠습니다.
이 그림을 보시고 설명을 들으시면 편하실겁니다. (JVM메모리 구조에 대해서는 아직 다 이해하지 못해서 공부를 한 후에 다루도록 하겠습니다.)
A a = //new A (아직 변수 a에 저장하지 않은 상태)
A = 클래스 영역
a = 스택영역(오브젝트)
A a = new A
new A = 힙 영역 즉, A라는 생성자가 변수a 에 저장되어 a도 힙 영역이라고 생각하면 됩니다.
오브젝트와 인스턴스 예시1
public class A
String str = “오브젝트입니다.”;
}
위의 예시는 오브젝트입니다.
public class A
String str = “오브젝트입니다.”;
public static void main(String[] args){
new A(). str = “변경하고 싶지만 오브젝트를 참조할 수 없어서 변경 불가능합니다.”;
System.out.puintln(new A().str);
}
}
str 변수(오브젝트)를 참조해서 수정하려고 했지만 new A(). str 이러한 형태는 주소값만 복사가 되었고, 값이 없기 때문에 오브젝트를 참조할 수가 없습니다. 그래서 수정이 불가능합니다.
이런 형태라고 생각하면 좋을 것 같습니다.
쉽게 생각해서 스택에 있는 str을 복사했지만 스택에 있는 오브젝트를 참조하는 것이 아닌 힙영역에서 주소값만 복사하고 값을 복사하지 못해서 str을 출력해보면 그대로 “오브젝트입니다.”라고 출력이 됩니다.
그렇다면 오브젝트 값을 수정하기 위해서는
public class A
String str = “오브젝트입니다.”;
public static void main(String[] args){
A a = new A()
a.str = “이제는 오브젝트를 참조해서 값을 변경할 수 있습니다.”;
System.out.puintln(a.str);
}
}
이런 형태로 참조되기 때문에 수정이 가능합니다.
오브젝트와 인스턴스 예시2
public class SaleCommand {
int price;
void priceUp(){
price = price + 100;
}
}
public class SalePrice {
public static void main(String[] args) {
// SaleCommand클래스를 힙으로 저장하기 위해saleCommand에 저장
// 스택(영역에 있는 오브젝트)를 힙(영역에 있는 인스턴스)으로 저장하는 과정을 인스턴스 화라고 함
SaleCommand saleCommand = new SaleCommand();
// SaleCommand의 클래스에 있는 price를 참조
// 인스턴스 멤버변수인 int price는 이제 1000으로 변경
saleCommand.price = 10000;
// SaleCommand클래스의 priceUp의 메서드를 참조해서 동작한다라는 의미
saleCommand.priceUp();
// price = price + 100// 그럼 메인에서 넣어준 10000+100
// SaleCommand클래스에서 선언된 price를 출력
System.out.println("가격 = "+saleCommand.price+"원");
}
}
객체지향을 공부하면서 “오브젝트를 참조한다”는 말과 수정이 왜 불가능한지, 가능한지의 차이에 대해서 개념이 많이 어려웠습니다. 그래서 그림을 그리면서 이해하려고 했고 도움이 조금 되었습니다.
댓글남기기