본문 바로가기

Java SE Tutorials/Objects

Java Objects

Java 프로그래밍, 오브젝트 ( Objects )의 사용


Java 언어로 작성된 프로그램이 실행될 때는 다수개의 오브제트를 생성하고 사용하게 된다. 객체를 사용한다는 것은 객체 안에 포함된 인스턴스 변수와 인스턴스 메소드를 호출하여 정보를 처리하는데 활용한다는 것이다.


인스턴스 변수, 인스턴스 메소드

Instance Variables : 인스턴스를 생성하면 Heap Memory에 생성되는 변수들. 인스턴스의 참조를 이용해야만 접근가능

  • static 키워드를 사용하지 않고 선언한 멤버변수
  • non-static 변수라고도 함
  • 객체변수라고도 함
  • 인스턴스가 생성되기 전에는 Heap Memory 에 존재하지 않으며, 인스턴스가 생성될 때마다 중복하여 Heap Memory에 생성됨

Instance Methods : 인스턴스가 생성된 후에 인스턴스의 참조를 이용해야만 호출가능한 메소드

  • static 키워드를 사용하지 않고 선언한 메소드
  • non-static 메소드라고도 함
  • 객체 메소드라고도 함
  • 인스턴스를 생성하기 전에는 사용할 수가 없음
  • 메소드 안에서 this 키워드를 사용하여 인스턴스 메소드를 호출한 객체를 참조할 수 있음


인스턴스 메소드( Instance Methods )에 대한 이해

인스턴스 메소드는 static 키워드가 없이 선언된 메소드를 말한다. 즉, 인스턴스의 참조를 이용해야만 호출가능한데, 인스턴스를 생성할 때마다 Heap Memory에 로드되는 인스턴스 변수와 달리 인스턴스가 생성될 때 인스턴스 메소드는 Heap Memory에 로드되지 않는다. 인스턴스 메소드는 클래스가 클래스로더에 의해 로드될 때 Method Area 에 단 한번만 저장되어 이후에 인스턴스 메소드 호출시에 실행된다. 인스턴스는 많이 생성되더라도 메소드는 한개만 존재한다는 뜻이므로 다수의 객체가 한개의 인스턴스 메소드를 공유하게 되는 셈이다. 그렇지만 인스턴스 메소드는 마치 한개의 인스턴스에 포함되어 다른 인스턴스에 독립된 것처럼 작동한다. 예를 들어, 인스턴스 메소드는 인스턴스 메소드를 호출한 인스턴스의 변수들을 다른 인스턴스의 변수들과 구별하여 다룰 수가 있다. 

인스턴스 메소드가 컴파일 될 때, 개발자가 정의한 그대로 컴파일되는 것이 아니라 시스템에 의해서 파라미터가 추가되어 컴파일되도록 하고 있다. 파라미터 리스트의 첫 값으로 해당 메소드를 포함한 클래스의 참조가 전달되도록 조작된다. 그리고 인스턴스의 참조를 통하여 인스턴스 메소드를 호출하면 해당 인스턴스의 참조가 인스턴스 메소드의 첫 파라미터로 전달되어 메소드 안에서는 this 라는 키워드로 사용된다.

생성자도 호출될 때 생성된 인스턴스의 참조가 생성자의 첫 아규먼트로 전달된다. 그러므로 생성장 안에서도 this 키워드를 사용하여 해당 인스턴스의 멤버에 접근할 수 있다


객체를 생성할 때 그 참조를 변수에 저장해두고 그 참조와 도트 연산자( . )를 이용하여 인스턴스 변수나 메소드에 접근할 수가 있다


객체의 참조(Reference)와 도트 연산자( . )를 이용하여 객체의 변수와 메소드를 사용하는 예

public class Tutorials 
{
	public static void main(String[] args) 
	{
		// 객체 생성(참조변수에 생성된 객체의 참조가 저장됨)
		User user = new User(10,"홍길동", "hong@naver.com");
		
		String email = user.email; // 인스턴스 변수의 이름을 이용하여 직접 접근하는 예
		
		System.out.printf("E-mail : %s %n", email);
		
		// 인스턴스 메소드 호출
		user.printUser();
	}
}

class User
{
	int num;     
	String name;
	String email;
	
	User(int num, String name, String email){
		this.num = num;
		this.name = name;
		this.email = email;
	}

	public void printUser()
	{
		System.out.println("====== 회원정보 ======");
		System.out.printf(" 번호 : %d %n", num);
		System.out.printf(" 이름 : %s %n", name);
		System.out.printf(" 메일 : %s %n", email);
	}
}


Garbage Collector

가비지 컬렉터는 사용하지 않는 객체의 메모리를 해제하여 메모리 가용성을 높이는 구실을 한다. 가비지 컬렉터 시스템을 사용하지 않는 다른 언어에서는 개발자가 직접 객체의 메모리를 해제하는데 신경을 써야 하는데, 이 작업은 까다롭고 오류가 발생하기 쉬운 단점이 있다. 자바에서는 생성된 객체를 참조하는 참조 변수의 수를 관리하여 참조의 수가 0에 도달하면 자동으로 객체의 메모리를 회수한다. 즉, 객체를 메모리에서 제거한다 이런 기능을 자동으로 수행하는 시스템 쓰레드가 Garbage Collector 이다.

참조 변수가 지역변수로 선언된 경우에는 해당 블럭이 종료하면 변수는 자동으로 제거되므로 블럭이 종료하면 가비지 컬렉터가 실행될 가능성이 있는 것이다. 가비지 컬렉터는 주기적으로 메모리를 해제하는데, 시스템이 비교적 한가한 경우, 혹은 메모리가 부족하여 위험한 경우에도 작동하여 메모리를 해제한다.

개발자가 참조 변수에 저장된 참조를 명시적으로 비울 수도 있는데, ref = null; 과 같은 방법을 사용하면 된다. 특정 객체의 참조가 0 이 되어야만 가비지 컬럭터의 대상이 된다.