본문 바로가기

교내 개발 공부/[학교 지원 Study] 자바 프로그래밍 입문

JAVA 객체 | 객체와 메모리 | 객체 생성 | 동적 생성 | GC(Gabage Collector) | 레퍼런스 | null | NullPointException | 객체 호출

인프런

자바 프로그래밍 입문 강좌 (renew ver.) - 초보부터 개발자 취업까지!!

색션 2. JAVA 객체

객체와 메모리

 

14-1 : 메모리에서 객체 생성 (동적 생성)

객체는 메모리에서 동적으로 생성되며, 객체가 더 이상 필요 없게 되면 GC(Gabage Collector)에 의해서 제거됨

class 생성 obj.   obj.       제거 GC
(Gabage Collector)
obj.     obj.  
|   obj.    
| |     obj.
주소 주소   주소  
        obj. 주소

어떠한 레퍼런스와 관계가 없다고 생각하면 메모리를 정리하다가 가비지 컬렉터가 회수함

그 객체를 메모리에서 지움

그러면 메모리가 조금 더 넉넉해짐

넉넉하게 있다가 새로운 객체가 생성되면 그 메모리 사용할 수 있음

 

14-2 : 레퍼런스 (가리킨다)

생성한 객체의 주소를 변수에 저장하는 것을 레퍼런스라고 한다.

obj.     obj.   obj.
obj.    
|   주소   주소
| |        
주소 주소        

주소들 레퍼런스

 

package pjtTest;

public class ObjectClass {
	

}
package pjtTest;

public class MainClass_ObjectClass {
	
	public static void main(String[] args) {
		
		ObjectClass obj1 = new ObjectClass();
		ObjectClass obj2 = new ObjectClass();
		ObjectClass obj3 = new ObjectClass();
		
		System.out.println(" obj1 : " + obj1);
		System.out.println(" obj2 : " + obj2);
		System.out.println(" obj3 : " + obj3);
		
	}

}

obj1 : pjtTest.ObjectClass@506e1b77

obj2 : pjtTest.ObjectClass@4fca772d

obj3 : pjtTest.ObjectClass@9807454

똑같은 클래스에서 생성했지만 객체가 엄연히 다른 메모리 공간에 존재함을 알 수 있음

그러기에 안에 속성값이 다 다르다고 취급

 

14-3 : 자료형이 같아도 다른 객체

자료형이 같아도 다른 공간에 존재하는 객체는 다른 객체이다.

class 생성 obj.          
obj.        
|   obj.    
| |     obj.
주소 주소   주소  
          주소
package pjtTest;

public class MainClass_ObjectClass {
	
	public static void main(String[] args) {
		
		ObjectClass obj1 = new ObjectClass();
		ObjectClass obj2 = new ObjectClass();
		ObjectClass obj3 = new ObjectClass();
		
		/*System.out.println(" obj1 : " + obj1);
		System.out.println(" obj2 : " + obj2);
		System.out.println(" obj3 : " + obj3); */
		
		if(obj1 == obj2) {
			System.out.println("obj1 = obj2");
		} else {
			System.out.println("obj1 != obj2");
		}
		
		if(obj2 == obj3) {
			System.out.println("obj2 = obj3");
		} else {
			System.out.println("obj2 != obj3");
		}
		
		if(obj1 == obj3) {
			System.out.println("obj1 = obj3");
		} else {
			System.out.println("obj1 != obj3");
		}
		
	}
}

obj1 != obj2

obj2 != obj3

obj1 != obj3

 

14-4 : nullNullPointException

레퍼런스에 null 저장되면 객체의 연결이 끊기며, 더 이상 객체를 이용할 수 없음

obj.          
obj.        
|   obj.    
| |   ↑x   obj.
주소 주소   null   ↑x
          null
package pjtTest;

public class ObjectClass {
	
	public void getInfo() {
		
		System.out.println(" -- getInfo() --");
		
	}

}
package pjtTest;

public class MainClass_ObjectClass {
	
	public static void main(String[] args) {
		
		ObjectClass obj1 = new ObjectClass();
		ObjectClass obj2 = new ObjectClass();
		
		obj1.getInfo();
		
		}
		
	}

-- getInfo() --

package pjtTest;

public class MainClass_ObjectClass {
	
	public static void main(String[] args) {
		
		ObjectClass obj1 = new ObjectClass();
		ObjectClass obj2 = new ObjectClass();
		
		obj1.getInfo();
		obj1 = null; 	//레퍼런스 x 레퍼런스가 끊김 그래서회수해감
		obj1.getInfo();
		
		}
		
	}

-- getInfo() --

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "pjtTest.ObjectClass.getInfo()" because "obj1" is null

at pjtTest/pjtTest.MainClass_ObjectClass.main(MainClass_ObjectClass.java:34)

관계 끊겨서 호출 x

 

package pjtTest;

public class MainClass_ObjectClass {
	
	public static void main(String[] args) {
		
		ObjectClass obj1 = new ObjectClass();
		ObjectClass obj2 = new ObjectClass();
		
		obj1.getInfo();
		
		obj1 = null; 	//레퍼런스 x 레퍼런스가 끊김 그래서회수해감
		//obj1.getInfo();
		
		obj2.getInfo();
		}
		
	}

-- getInfo() --

-- getInfo() --

null로 끊기면 더 이상 객체에 접근할 수 없음