E D R , A S I H C RSS

Constructor Method

Constructor Method

인스턴스를 만들때 가장 유연한 방법은 "new" 메소드 뒤에다가 여러 메세지를 보내주는 것이다.
~cpp 
class Point
{
/* ... */
	void setXnY(int x, int y) { /* ... */ }
/* ... */
};

Point* pt = new Point;
pt->setXnY(0,0); // C++/Java라면 이렇게 쓸 일은 없다.
하지만 이 방법은 쓸만한 인스턴스를 만들기 위해 클래스의 레퍼런스를 찾아봐야 하는 등의 골치 아픈 문제가 있다. 특히 클래스가 복잡할때는 문제가 좀 커진다.

그래서 Constructor Method를 쓰기를 권한다. 즉 인스턴스를 똑바로 만들어주는 각각의 메소드를 추가해주는 것이다.
한가지 예로 위의 것을 고쳐보자.
~cpp 
class Point
{
/* ... */
	void setXnY(int x, int y) { /* ... */ }
	static Point* makeFromXnY(int x, int y)
	{
		Point* pt = new Point;
		pt->setXnY(x,y);
		return pt;
	}
/* ... */
};

Point* pt = Point::makeFromXnY(0,0);
또다른 예로 반지름과 각도를 받아 x,y를 계산해주는 Constructor method를 만들어보자.
~cpp 
class Point
{
/* ... */
	void setXnY(int x, int y) { /* ... */ }
	static Point* makeFromXnY(int x, int y)	{ /* ... */ }
	static Point* makeFromRnTheta(int r, int theta)
	{
		return makeFromXnY(r*cos(theta),r*sin(theta));
	}
/* ... */
};
하지만 이 패턴은 C++/Java에서는 별로 필요가 없을듯하다. 생성자의 오버로딩을 언어 차원에서 지원해주는데 굳이 쓸 필요가 있나 하는 생각이 든다. 하지만 스몰토크에서는 new를 오버로딩하는걸 그리 반겨하는것 같지는 않다.

''DesignPatterns 로 이야기한다면 일종의 FactoryMethod 임.(완전히 매치되는건 아니고, 어느정도 비슷) 비교적 자주 사용되는 패턴인데, 왜냐하면 객체를 생성하고 각각 임의로 셋팅해주는 일을 생성자 오버로딩을 더하지 않고서도 할 수 있으니까.
요새 프로그래밍 하면서 느끼는 점은, 과도한 오버로딩은 해당 객체를 이용하는 사람입장에서 골치아프게 만든다는것. 왜냐하면, 같은 메소드 이름에서는 해당 파라메터가 다른 것으로 바뀌었을때에 대한 의도를 메소드 이름에 드러나지 않기 때문에.
개인적으로는 JUnit Test 작성할때, Test 대상이 되는 클래스에 대한 리팩토링 시도하는중 중간단계 역할로 많이 써먹었음.

ps. 스몰토크에서는 오버로딩이 없는 걸로 알고 있음. --1002''
음.. 오버로딩이 없나요? 보면 new랑 new:이렇게 두개 있는 클래스도 있던데... 저건 아예 다른 메세지인가요? --인수


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.0919 sec