Contents

조회 수 445 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄


3.4.4 변수와 메서드의 분리와 결합

객체지향이 존재하지 않던 전통적인 프로그램에서는 변수와 메서드는 분리되어 있었다. 객체지향의 의미가 등장하면서 결합시키는 방법이 나왔기 때문에 분리되어 있는 것은 당연한 것이었다.

SeparatedData 클래스의 경우에는 메서드를 호출할 때마다 데이터를 넘겨주어야 하지만, UnitedData 클래스의 경우에는 메서드의 호출에 필요한 데이터를 클래스 내부에 포함하고 있기 때문에 메서드를 호출할 때마다 매개변수를 넣어줄 필요가 없다.

SeparatedData 클래스의 메서드들은 호출할 때마다 데이터를 넘겨주고 호출하였다. 단순한 개념이지만 이것은 다음과 같은 문제점을 가지고 있다.

□ 데이터와 메서드가 분리되어 있을 때의 문제점
◇ 메서드를 호출할 때마다 데이터를 매개변수로 넘겨주어야 한다.
◇ 특정 데이터를 사용하는 메서드가 몇 개인지 알 수 없다.
◇ 특정 데이터를 사용하는 메서드를 묶어서 관리할 수 없다.

실제 예를 들어 보자. 다음과 같이 도면이 한 장 있다고 가정하자. 그리고 이 도면에 그리기 작업을 하기 위해서 선그리기(), 원그리기(), 사각형그리기()와 같은 메서드를 사용한다고 가정하자. 그렇다면 다음과 같은 형식으로 프로그램해야 할 것이다.

▒ 데이터
 
도면 r;

▒ 메서드
 
void 선그리기(도면 w){
        //선그리기 작업
 }
 void 원그리기(도면 w){
        //원그리는 작업
 }
 void 사각형그리기(도면 w){
        //사각형그리는 작업
 }

위의 데이터와 메서드가 분리되어 있다고 가정한다면 다음과 같이 메서드를 호출해야 할 것이다. 두 개의 선과 두 개의 원 그리고 하나의 사각형을 도면에 그리는 방법은 다음과 같다.

▒ 데이터와 메서드가 분리된 상태에서 메서드의 호출
 
도면 r;
선그리기(r);
선그리기(r);
원그리기(r);
원그리기(r);
사각형그리기(r);

불행하게도 계속해서 도면 r을 메서드의 매개변수로 넘겨준 후에 메서드를 호출해야만 한다. 이것은 사용자가 도면 r을 계속 기억하고 있으면서, r을 상대로 뭔가를 그리기 위한 메서드를 찾아서 사용해야 한다는 단점을 가지고 있다.

결과적으로 도면 r이라는 메모리와 도면과 관련된 메서드들을 분리해서 관리해야 한다는 단점을 가지고 있다. 이러한 문제점을 객체지향에서는 클래스가 해결하고 있다.

데이터와 메서드가 결합된 형태라고 생각하면 쉽다. 만약 도면과 사용할 메서드들이 결합된 형태라면 전혀 다른 결과를 가져오게 된다. 개략적으로 위의 도면 그리기를 WhiteBoard라는 클래스로 작성해보자. 그 구조는 다음과 같다.

▒ WhiteBoard 클래스
 
public class WhiteBoard{
         public 도면 r;
         public void 선그리기(){...}
         public void 원그리기(){...}
         public void 사각형그리기(){...}
 }

위의 WhiteBoard 클래스를 이용하기 위해서는 다음과 같이 프로그램할 것이다

▒ WhiteBoard 클래스를 이용한 그리기 작업
 
WhiteBoard h = new WhiteBoard();
h.선그리기();
h.선그리기();
h.원그리기();
h.원그리기();
h.사각형그리기();

어떤가! 느낌이 다르지 않는가! 여러분이 알고 있는 C 언어는 데이터와 메서드가 분리된 형태의 프로그램 기법이었다. 하지만 이제 객체지향 계열의 자바를 배우면 데이터와 메서드를 결합시켜 관리할 수 있는 것이다.

☞ 또 다른 생각
객체지향적인 설계가 무조건 좋은 것은 아니다. 앞에서 만들었던 계산기 프로그램과 같은 경우에 어떤 방식의 프로그램 기법이 좋은지 한번 생각해보기 바란다. 두 수를 주고 4가지 방식의 계산을 하는 경우는 별로 없다. 그럴 경우에는 데이터와 변수를 묶을 필요가 없다. 단순히 메서드의 집합으로서의 클래스를 사용하는 것이 더 옳을 것이다. 멤버 변수를 둘 필요가 없는 곳에 멤버 변수를 두는 것 또한 비효율적인 프로그램 기법이다. 메서드로만 사용해야 할 경우와 데이터+메서드(변수+메서드)를 함께 사용해야 할 경우를 생각하면서 클래스를 디자인해야 한다.


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
56 Java 3.4.5 결론 IT장인 2013.12.28 342
» Java 3.4.4 변수와 메서드의 분리와 결합 IT장인 2013.12.28 445
54 Java 3.4.3 변수와 메서드 결합의 의미 II IT장인 2013.12.28 385
53 Java 3.4.2 변수와 메서드 결합의 의미 I IT장인 2013.12.28 370
52 Java 3.4.1 클래스 내의 메서드 IT장인 2013.12.28 338
51 Java 3.3.7 값복사가 적용되는 곳 IT장인 2013.12.28 398
50 Java 3.3.6 값복사와 매개변수의 전달 IT장인 2013.12.28 459
49 Java 3.3.5 값복사 IT장인 2013.12.28 335
48 Java 3.3.4 리턴과 매개변수 IT장인 2013.12.28 402
47 Java 3.3.3 메서드는 변수다. IT장인 2013.12.28 328
46 Java 3.3.2 메서드 IT장인 2013.12.28 313
45 Java 3.3.1 클래스의 구성요소 IT장인 2013.12.28 380
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6