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 2021-02-07 05:23:00
Processing time 0.0123 sec