자 여기 User 클래스와 메인 메서드를 갖고있는 UserTest 클래스가 있습니다. 이 UserTest의 프로그램을 돌렸을 때, 나오는 값은 어떻게 될까?
public class UserTest {
public static void main(String[] args) {
User userEx1 = new User();
userEx1.userName = "brandi";
userEx1.userEmail = "brandi@gmail.com";
userEx1.showUserInfo();
User userEx2 = new User();
userEx2.userName = "yolanda";
userEx2.userEmail = "yolanda@gmail.com";
userEx2.showUserInfo();
System.out.println(userEx1);
System.out.println(userEx2);
}
}
public class User {
public String userName;
public String userEmail;
public void showUserInfo() {
System.out.println(userName + "," + userEmail);
}
}
인스턴스(instance)는 클래스는 이 인스턴스의 속성과 기능을 구현해 많들어 둔 코드이다. 이렇게 실제 클래스 기반으로 생성된 객체(인스턴스)들은 각각 다른 멤버 변수 값을 갖게 된다! 즉, 사용자 클래스에서 생성된 각각 인스턴스들은 각각 다른 이름과 이메일을 갖게된다는 의미이다.
근데 이게 어떻게 이렇게 가능한걸까?
그 이유는 바로 이렇게 생성된 인스턴스들이 동적 메모리(heap memory)에 할당되기 때문!!! 자바에서는 GC가 주기적으로 사용하지 않는 메모리들을 청소해주기 때문에 프로그래머가 수거하지 않아도 되지만, C나 C++ 같은 언어에서는 사용한 동적 메모리를 프로그래머가 일일이 해제 시켜야 한다. 그.래.서 자바 개발자로서 GC를 모르면 안된다는 뜻임😢
그렇게 저 위 코드를 돌리면 나오는 결과는 아래와 같다. 그 이유는, 하나의 클래스로부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 갖게 되기 때문이다!
동일한 클래스로 나왔지만 각기다른 인스턴스(객체)이기 때문에 userEx1은 @6e8cf4c6이라는 할당된 주소를 갖고, userEx2는 @12edcd21이라는 할당된 주소를 갖는다고 생각하면 쉽다.