1 분 소요

메서드로 내가 수정할 수 있으면 인스턴스라고 하고,

메서드로 수정하지 못하면 오브젝트라고 합니다.


인스턴스화 란?

오브젝트를 인스턴스처럼 쓰면 인스턴스화(변경가능),

인스턴스를 오브젝트처럼 쓰면 오브젝트화(변경불가)

위에 두 개의 개념을 이해하기 위해서 코드로 설명을 드리도록 하겠습니다.

JVM

이 그림을 보시고 설명을 들으시면 편하실겁니다. (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+"원");
	
	}
}




객체지향을 공부하면서 “오브젝트를 참조한다”는 말과 수정이 왜 불가능한지, 가능한지의 차이에 대해서 개념이 많이 어려웠습니다. 그래서 그림을 그리면서 이해하려고 했고 도움이 조금 되었습니다.

카테고리:

업데이트:

댓글남기기