3.4.2 변수와 메서드 결합의 의미 I
클래스에 메서드가 추가되는 예를 알아보았다. 어떻게 클래스 내에 메서드가 들어가는지 알았을 것이다. 그렇다면 왜라는 질문을 던져 보자. 왜 변수들의 집합인 구조체에 메서드를 추가했을까?
너무나도 간단한 질문일 수도 있으며 너무나도 복잡한 질문일 수도 있다. 메모리적인 측면과 방법론적인 측면을 고려해서 생각해보자.
□ 질문
◇ 왜 변수들의 집합인 구조체에 메서드를 추가했을까?
이것의 차이를 알아보기 위해서 메서드만으로 이루어진 클래스와 메서드와 변수가 결합된 클래스를 테스트해보자. 테스트할 클래스는 다음과 같다.
□ 테스트할 클래스
◇ 메서드로만 이루어진 클래스(SeparatedData 클래스)
◇ 메서드와 변수가 결합된 클래스(UnitedData 클래스)
□ SeparatedData 클래스의 특징
◇ 메서드로만 이루어진 클래스는 메서드를 호출할 때마다 필요한 데이터를 넣어 주어야 한다.
먼저 메서드로만 이루어진 클래스부터 학습해보자.
§chap03\SeparatedData.java
|
/** 메서드로만 이루어진 클래스 **/ public class SeparatedData { public int plus( int x, int y) { //멤버메서드 return x + y; } public int minus( int x, int y){ //멤버메서드 return x - y; } public int divide( int x, int y){ //멤버메서드 return x / y; } public int mul( int x, int y){ //멤버메서드 return x * y; } } /*** c:\javasrc\chap03>javac SeparatedData.java ***/ |
SeparatedData라는 클래스는 단순한 메서드의 집합이다. 클래스 내부에 데이터(멤버 변수)는 존재하지 않는다. 다음과 같이 객체를 생성한 후 메서드를 호출하기 위해서는 매개변수를 넣어준 후 메서드를 호출해야 한다. 즉 메서드를 호출할 때마다 데이터를 매개변수로 넣어 주어야 한다.
▒ SeparatedData 객체의 생성과 메서드의 호출
|
SeparatedData d = new SeparatedData(); int a = d.minus( 5 , 10 ); int b = d.plus( 5 , 10 ); int c = d.divide( 5 , 10 ); int d = d.mul( 5 , 10 ); |
이것을 테스트하는 예는 다음과 같다.
§chap03\SeparatedDataMain.java
|
/** SeparatedData를 테스트하는 클래스 **/ public class SeparatedDataMain{ public static void main(String[] args){ SeparatedData d = new SeparatedData(); //SeparatedData 객체 생성 System.out.println(d.minus( 5 , 10 )); //minus() 메서드 호출 후 결과 출력 System.out.println(d.plus( 5 , 10 )); //plus() 메서드 호출 후 결과 출력 System.out.println(d.divide( 5 , 10 )); //divide() 메서드 호출 후 결과 출력 System.out.println(d.mul( 5 , 10 )); //mul() 메서드 호출 후 결과 출력 } } /*** c:\javasrc\chap03>javac SeparatedDataMain.java c:\javasrc\chap03>java SeparatedDataMain -5 15 0 50 ***/ |
이러한 프로그램 기법은 C 언어 계열에서 사용하던 프로그램 기법이다. 객체지향이 없던 시절 아주 일반화된 프로그래밍 기법이다. C 언어의 라이브러리는 함수들의 집합으로 이루어져 있으며, 필요할 때 함수를 코드에 포함시켜 사용하였다. 즉 함수 형태의 라이브러리였다. 필요한 데이터는 함수를 호출할 때마다 매개변수를 통해서 넣어 주고 호출하였다.
이러한 측면에서 본다면 메서드로만 이루어진 클래스는 C 언어의 함수 라이브러리와 별 차이가 없다. 그럼, 데이터와 메서드가 결합된 형태를 보고 그 차이점을 알아보자.
☞ 참고
main()이 클래스 내부에 들어 있는 것은 자바에서는 아주 당연한 것이다. C나 C++ 언어에 익숙한 분들은 '왜 main() 메서드가 클래스 안에 있지?'라고 생각할 수도 있다. C나 C++에서는 메서드가 독립적으로 존재할 수 있지만, 그리고 main()은 독립된 함수로 존재해야 되지만, 자바에서는 무조건적으로 클래스 내에 넣어야 한다. 자바에서 클래스 외부에 존재하는 변수나 메서드는 아예 존재하지도 않는다. |