2011년 5월 2일 월요일

자바의 클래스(class)와 메소드(method), 그리고 객체(object)


자바는 객체지향 프로그래밍의 대표적인 언어라고 부르는데 그렇게 부르는 이유는 객체들끼리 빈번하게 메세지 교환을 하면서 프로그램이 실행되도록 하며 필요에 따라서 생성되고 자신의 능력을 다 발휘하고 나면 소멸되기 때문이다. 클래스를 이용해 객체를 만들수 있으며 이 객체를 이용해 메소드를 손쉽게 조작할수 있게 된다. 클래스, 메소드, 그리고 객체(클래스를 참조하고 있다고 해서 레퍼런스 reference라 부르기도 한다)에 대해서 짧게나마 초반에 메인 메소드를 설명하면서 언급한 적이 있지만 이번 장에서는 보다 자세히 들여다 보기로 하자.

지금까지 여러분은 강이의 자바강좌를 공부하면서 믿기 힘들겠지만 이미 여러종류의 클래스와 메소드 그리고 객체를 생성하는 방법까지도 예제를 통해 알게 모르게 습득한 상태이다. 메소드는 공부한 적이 없는데 이러면 정말 난감하다. 메인 메소드도 메소드니까 말이다.--; 한마디로 그 나물에 그 밥이다.^^

일단 클래스부터 만들어 보자. 클래스를 만들어야 객체를 만들수 있으니까 말이다. 클래스는 여러분이 구체화시키고 싶은 전체 대상을 말하고 메소드는 말 그대로 클래스 즉 만들어 놓은 대상에 대한 구체적인 작동이나 액션을 프로그램화하는 것이다. 예를 들어 여러분이 일하는 회사에서 봉급을 주는 프로그램을 만든다고 가정해 보자. 그러면 전체적인 목적, 그 대상이 무엇인가? 말그대로 목적하는바인 봉급을 클래스로 놓는게 자연스러울 것이다. 그럼 한달마다 봉급(Salary)을 계산하려면 무엇이 필요할까? 당연히 얼마나 일했는지 일한 시간(time)을 알아야 하고 시간당 얼마를 받는지 시급(wage)을 알아야 한달 봉급을 계산할수 있다. 따라서 이 세가지 요소를 변수로 놓으면 될 것이다. 이것을 이용해 클래스를 만들어 보자.

class Salary
{
변수 선언
...
......
메소드 표현
...
......
}

이런 식으로 만들어지게 될 것이다. 변수를 넣고 조금씩 구체화시켜보자.

class Salary
{
     int time;   //일한 시간
     int wage; //시간당 받는 임금
     int day;   //일한 기간
}

변수는 월급계산하려고 만들었으니까 이제 그것을 메소드로 표현해 보자.

class Salary
{
     int time;
     int wage;
     int day;

void calculation( )
{
     System.out.println(time*wage*day);
} //calculation 메소드 괄호닫기

} //Salary 클래스 괄호닫기

월급계산하는 메소드 이름을 calculation이라고 명하고 시간이랑 시급 그리고 일한 날짜수를  곱하면 한달 월급이 계산될 것이다. 그럼 평상시와 같이 메인 메소드를 만들어서 위의 클래스에 객체를 통해서 어떻게 접근하는지 예제를 통해 살펴보자.


예제에 대한 설명을 시작하겠다. 모두 잠에서 깨어나기 바란다. ㅎㅎ 클래스가 두개다. 하나는 Salary고 다른 하나는 프로그램을 총괄하는 메인메소드가 위치한 Test35 클래스이다. 메소드도 두개다. 하나는 월급을 계산하는 calculation이고 다른 하나는 Test35 클래스안에 있는 메인 메소드다. 프로그램의 시작과 끝은 어디에서 시작해서 어디에서 끝난다고? 메인 메소드^^ 기억하고 있는지 모르겠다. 그럼 메인메소드를 보자. 처음은 new를 이용해 Salary 클래스의 객체를 만들면서 시작한다. 그리고 변수에 해당 수치를 집어넣고 calculation 메소드를 작동시켜 월급을 출력하는 예제이다. 주석을 상세히 달아놓았으니 별다른 설명이 필요없을 것이다.

calculation 메소드를 보면 void가 앞에 있는데 계산하고 전해주는 값이 없다는거다. 모두 기억하고 있으리라 기대(?)하지만 반신반의하면서 다시 한번 설명하겠다.ㅎㅎ 여기서는 메소드를 이용하면 그 메소드안에서 계산하고 출력까지 다 하라고 만든 예제다. 그렇다면 메인 메소드에서 calculation 메소드의 값을 넘겨받아 출력할수는 없을까라는 질문이 생길 것이다. 메소드만 조금 손보면 가능하다. 여러분이 직접 메소드를 고치면서 프로그램을 짜보기 바란다. 해봤으면 아래 예제를 통해 어떤 식으로 값을 넘겨받는지 살펴보자.


두 예제 모두 똑같은 결과를 출력한다. 다만 메소드의 구성이 다를 뿐이다. 메소드를 보면 void 대신에 int를 썼는데 예전에 설명한적이 있어서 알아챘겠지만 메소드 실행의 결과를 돌려주는 값이다. 흔히 리턴하는 값이라고 한다. 그래서 calculation 메소드안의 마지막줄에 return이라는 명령어가 있는 것이다. 이렇게 void가 아닌 리턴값이 메소드 앞에 있는 경우는 명령어 return을 이용해 해당 타입의 값을 반드시 돌려주어야 한다. 결과는 위의 두 예제 모두 아래와 같다.

고객님의 한달월급입니다.
1500000

메소드와 그에 따른 변수를 이용해 프로그램을 만드는 과정은 많은 연습을 통해 여러분이 반드시 익숙해져야 하는 부분이다. 필자가 메소드와 매개변수(서로 주고받는 변수, 즉 결과를 얻기위해 메소드를 호출할때 입력해야되는 값, parameter 파라미터라고도 불린다.)를 활용하는 예제를 여러가지 생각해 볼수 있도록 만들었다. 본 예제를 최대한 응용해 보면서 이 단원의 핵심을 깨우치기 바란다. 예제 프로그램은 덧셈과 뺄셈 결과를 알려주는 프로그램이다.


간단한 예제들을 접하면서 클래스와 메소드 그리고 객체의 생성을 통한 다른 클래스의 변수와 메소드에 대한 접근방법을 공부해 보았다. 오늘 강좌와 더불어 예전 시간에 공부한 프로그램의 구성이나 메인 메소드에 대한 강좌를 다시 한번 들여다보면 더 머리에 쏙쏙 들어올 것이다. 예제를 보다시피 결과는 같지만 여러분이 어떤 방법과 어떤 생각을 하느냐에 따라서 프로그램은 항상 달라질수 있다. 필자의 해답에 의존하지 말고 여러분만의 해답을 찾아내는 훌륭한 프로그래머(?)가 되길 희망하면서 오늘은 이만 마치겠다.^^

댓글 5개:

  1. 잘 보았습니다ㅡ 감사합니다.

    답글삭제
  2. 감사합니다... 클래스 객체 메서드 개념 이 뭔가 잡히기 시작했어요~~~

    답글삭제
  3. 다시봐도 쉬운 설명!!
    머리속에 쏙쏙 들어오네요~
    최고에요^^!!

    답글삭제
  4. Howdy, I think your web site could possibly be having
    web browser compatibility issues. Whenever I take a look at your website in
    Safari, it looks fine however, if opening in I.
    E., it's got some overlapping issues. I merely wanted to give you a quick heads up! Apart from that, excellent blog!
    Take a look at my web page ... GFI Norte

    답글삭제
  5. int x,y;
    int total1, total2;
    Scanner scanX=new Scanner(System.in);
    Scanner scanY=new Scanner(System.in);
    x=scanX.nextInt();
    y=scanY.nextInt();
    System.out.println("=====================");
    Addition a=new Addition();
    total1=a.add(x,y);
    Subtraction b=new Subtraction();
    total2=b.sub(x,y);
    System.out.println(total1);
    System.out.println(total2);

    예제를 이것저것 제 입맛에 맛게 바꿔보는 것도 재밌네요.

    답글삭제