객체 사용하기

정소이·2023년 1월 24일
0

OOP를 향해서

목록 보기
10/10

객체의 필드 참조

객체 필드는 그 이름으로 엑세스된다. 따라서 명확한 이름을 사용해야한다.
클래스 내에 있는 필드 이름은 간단하게 할 수 있다.
예로, Rectangle 클래스에 widthheight를 출력하는 코드를 추가할 수 있다.

	System.out.println("Width and height are: " + width + ", " + height);

이 경우에 widthheight는 간단한 이름이다.

객체 클래스 외부에 있는 코드는 객체 참조나 dot(.) 연산자/간단한 필드 이름이 따라오는 표현식을 사용해야 한다.

	objectReference.fieldName

예를들어, CreateObjectDemo 클래스는 Rectangle 클래스 바깥에 있다.
rectOne 이라는 이름을 가진 Rectangle 클래스의 origin, width, height 필드를 참조하기 위해 CreateObjectDemo 클래스는 rectOne.origin, rectOne.width, rectOne.height 같이 사용해야한다.

System.out.println("Width of rectOne: "  + rectOne.width);
System.out.println("Height of rectOne: " + rectOne.height);

CreateObjectDemo 클래스에서 단순히 width와 height를 사용하는건 의미가 없다. 이 필드들은 오직 객체 안에서만 존재하기때문에 컴파일 에러가 발생한다.

필드에 접근하기 위해 객체를 참조한 이름이나 객체 참조를 리턴하는 표현식을 사용할 수 있다. new 연산자는 객체에 대한 참조를 리턴한다. 그래서 새로운 객체의 필드에 접근하기 위한 new 연산자가 리턴한 값을 사용할 수 있다.

int height = new Rectangle().height;

이 표현식은 새로운 Rectangle 객체를 만들고 즉시 해당 높이를 가져온다. 본질적으로, 이 표현식은 Rectangle 의 기본 height를 계산한다.
이 명령문을 실행한 후, 프로그램은 이 참조를 어디에도 저장하지 않았기 때문에 Rectangle 에 대한 참조는 더이상 존재하지 않는다. 이 객체는 참조되지 않으며, 해당 리소스는 JVM 내에서 자유롭게 사용할 수 있다.


객체의 메서드 호출하기

객체의 메서드를 호출하기위해 객체 참조를 사용한다. dot(.) 연산자를 이용해서 객체 참조에 메서드 이름을 추가한다. 또한 괄호안에 메서드에 대한 모든 인자를 넣는다. 만약 어떤 인자도 필요 없으면, 비워두면 된다.

objectReference.methodName(argumentList);
or:

objectReference.methodName();

Rectangle 클래스는 두개의 메서드를 갖고 있다. (사각형의 넓이를 계산하는 getArea(), 원점을 이동시키는 move())
두 메서드를 호출하는 CreateObjectDemo 코드는 다음과 같다.

System.out.println("Area of rectOne: " + rectOne.getArea());
...
rectTwo.move(40, 72);

처음 명령어는 getArea() 메서드를 호출하여 rectOne 객체의 면적을 구하고 결과를 출력한다. 두번째 명령어는 origin.x, origin.yrectTwo 객체를 움직인다.
인스턴스 필드와 마찬가지로, objectReference는 반드시 객체의 참조여야 한다. 반드시 변수 이름을 사용해야하지만, 객체 참조를 반환하는 식을 사용할수도 있다. new 연산자는 객체 참조를 반환하기때문에 반환된 값으로 새 객체의 메서드를 호출할 수 있다.

new Rectangle(100, 50).getArea()

new Rectangle(100, 50) 표현식은 Rectangle 객체를 참조하는 객체 참조를 반환한다. 보다시피 dot(.) 연산자와 new Rectangle() 를 호출해서 새로운 사각형의 면적을 계산할 수 있다.

getArea() 같은 메서드들은 값을 리턴한다. 값을 리턴하는 메서드는 표현식에서 메서드를 호출할 수 있다. 리턴된 값을 변수로 할당할 수 있고, 이로 결정을 내리거나, 루프를 제어할 수 있다. 아래 코드는 getArea() 로 리턴된 값을 areaOfRectangle 변수로 할당한다.

int areaOfRectangle = new Rectangle(100, 50).getArea();

특정 객체에서 메서드를 호출하는 건 객체에 메세지를 보내는 것과 같다. 이 경우에 getArea()가 호출된 객체는 생성자가 반환한 rectangle이다.


가비지컬렉터 (The Garbage Collector)

일부 객체지향 언어는 생성한 모든 객체를 추적하고 더이상 사용하지 않을 땐 폐기해야 한다. 메모리를 관리하는건 지루하고 에러가 발생하기 쉽다. 자바 플렛폼에서는 우리가 원하는 만큼 많은 객체를 만들고 메모리 관리에 걱정하지 않도록 한다. 자바 런타임 환경은 객체가 더이상 사용하지 않는다고 판단되면 그 객체들을 삭제한다. 이 프로세스를 garbage collection 이라고 한다.

해당 객체에 대한 참조가 더이상 없으면 그 객체는 가비지 컬렉션 대상이다. 변수에 포함된 참조는 변수가 범위를 벗어날 때 삭제된다. 또는 변수를 null 로 설정해서 객체 참조를 삭제할 수 있다. 프로그램은 같은 객체에 대해 다수의 참조를 가질 수 있다. 모든 객체 참조는 객체가 garbage collection 이 되기 전에 삭제되어야 한다.

자바 런타임 환경에는 주기적으로 사용하지 않는 객체가 사용하는 메모리를 해제하는 가비지 컬렉터가 있다. 가비지 컬렉터는 때가 됐다고 판단하면 자동적으로 컬렉터 임무를 수행한다.

출처
https://docs.oracle.com/javase/tutorial/java/javaOO/usingobject.html

profile
프로그래밍 학습에 왕도는 없다! 내가 컴퓨터를 닮아갈때까지!

0개의 댓글