가독성 높은 코드 만들기 방법 #2 – 필수 변수는 생성자에서 넘겨라!

생성자 함수는 객체 생성시 최초 한번 호출 됩니다.
필수 변수는 생성자에서 그 값을 넣어야 합니다.

아래는 생성자 함수를 만들지 않은 경우 입니다.

class Line {

	Point start;
	Point end;
	Color color;

	public void setStart(Point point){
		
		start = point;
	}

	public void setEnd(Point point){

		end = point;
	}

	public void setColor(Color rgb){

		color = rgb;		
	}
	
	public void draw() {

		if(color == null)
			return;

		if(start == null)
			return;

		if(end == null)
			return;

		// Implementation required
	}
}


int main() {

	Line line = new Line();  // 불안정한 상태
	line.setStart(new Point(10, 10));
	line.setEnd(new Point(20, 40));
	line.setColor(new Color(255,0,0)); // 이제 안정된 상태
	line.draw();
}

main 함수에서 Line 객체가 생성(40번째 줄) 되면, 멤버 변수 start, end, color 는 null 또는 쓰레기 값을 가져 객체는 불안정한 상태가 됩니다. 이 상태에서 draw 를 호출하면 오동작 할 것입니다.
다음으로 setStart, setEnd, setColor을 호출하고 나서야 비로서 객체는 사용 할 수 있는 안정된 상태가 됩니다.

객체는 생성 되었는데, 다른 set 함수들을 호출하지 않으면 사용 할 수 없다? 이상 하지 않나요?

필수 멤버 변수는 객체 생성시, 생성자를 통해 할당 되도록 합니다.
예제에서 멤버 변수 start, end은 Line 을 그리기 위한 필수 변수입니다. color 는 필수 변수 이지만 따로 지정하지 않을 경우 검은색으로 할당 되도록 하죠.

아래와 같이 리펙토링 해보겠습니다.

class Line {

	Point start;
	Point end;
	Color color;
	
	public Line(Point pointStart, Point pointEnd, Color clr) {

		start = pointStart;
		end = pointEnd;
		color = clr;
	}

	public Line(Point pointStart, Point pointEnd) {

		start = pointStart;
		end = pointEnd;
		color = new Color(0,0,0);
	}

	public void setStart(Point point){
		
		start = point;
	}

	public void setEnd(Point point){

		end = point;
	}

	public void setColor(Color rgb){

		color = rgb;		
	}
	
	public void draw() {

		/*  Unnecessary
		if(color == null)
			return;

		if(start == null)
			return;

		if(end == null)
			return;
		*/

		// Implementation required
	}
}


int main() {

	Line line1 = new Line(new Point(10, 10), new Point(20, 40));
	line1.draw();

	Line line2 = new Line(new Point(10, 10), new Point(20, 40), new Color(0,255,0));
	line2.draw();
}

이제 Line 객체 생성시 start, end 값을 필수로 넣어야 객체 생성이 가능하게 되었네요.
또한 필수 멤버 변수가 할당 되었다는 것을 보장 되므로 draw 함수에서 null 검사도 이제 필요 없게 되었네요.
만약 “Line 객체 생성 후, start, end, color 가 변경이 가능해야 한다”는 요구사항 이 있을 경우에만 setStart, setEnd, setColor 함수가 필요합니다. 그렇지 않다면 저것 또한 필요 없죠.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중