본문 바로가기

카테고리 없음

클래스 설계 01

다음과 같이 주어진 시나리오를 바탕으로 클래스를 설계해 보세요

시나리오: 숫자 하나를 받아서 구구단을 완성한 후에 반환한다.

시나리오 분석
1. 숫자 하나를 받아서 저장한다.
2. 저장된 숫자를 이용하여 구구단을 완성한 후에 반환한다.


클래스 선언문
class라는 키워드로 시작하고 이어서 공백문자 다음에 클래스 이름을 붙여준다. 그리고 { }를 붙이면 된다. 클래스 이름에는 특수문자는 사용할 수 없으나 _(under score), $문자는 사용할 수가 있다. 그리고 모든 알파벳문자와 숫자, 국제문자 등을 사용할 수 있다. 그리고 클래스의 이름 중에서 맨처음에 숫자는 사용할 수 없다. 클래스의 이름 중에서 첫번째 문자는 대문자를 사용하는 것이 코딩 관례로 되어 있다. 이것은 관례일 뿐 문법으로 규정하고 있지는 않다. 이런 규칙을 지켜서 다음과 같이 선언하면 된다.
class Gugu { }

변수 선언
숫자 하나를 받아서 자장한다는 것은 클래스가 갖게 될 기능으로 생각하여 한개의 메소드로 표현해 줄 수 있다. 여기서 숫자하나는 명사(객체의 속성)에 해당하므로 클래스의 멤버 중에서도 변수로 선언해 줄 수 있다. 그래서 다음과 같은 클래스 선언이 가능하다.
class Gugu {
   int dan;
}

메소드 이름 정하기
자바언어에서 값을 받아서 멤버에 저장하는 메소드는 그 이름을 정할 때 setXXX() 과 같이 하는 것이 일반적이므로 setDan() 으로 해 본다.

파라미터 정하기
setDan()메소드는 실행할 때 숫자하나를 외부로부터 받아서 보관해 두는 기능을 갖게 해 주어야 하므로 setDan(int dan) 과 같이 파라미터 타입을 숫자로 정해 준다.

리턴타입 정하기
메소드는 실행된 후에 가공한 값을 호출한 곳으로 반환할 필요가 있으므로 메소드 이름 왼쪽에 반드시 리턴타입을 정해 주어야 한다. 여기서 setDan(int dan)메소드는 리턴할 값이 없으므로 리턴타입을 void 로 정하여 void setDan(int dan) 으로 된다.

접근제한자 정하기
메소드를 접근할 수 있는 범위를 제한하기 위해서 접근제한자(Access Modifier)를 설정해야 한다. 어떤 곳에서 든지 혹은 어떤 클래스에서든지 이 메소드를 호출할 수 있도록 하기 위해서는 접근제한자는 public 으로 정하여 최종적으로 다음과 같은 메소드 선언문을 도출해 낼 수 있다.

메소드 선언문
public void setDan(int dan)

메소드의 바디 정의하기
숫자를 받아서 클래스 내부에 저장하는 것이 이 메소드의 기능이므로 메소드 바디({ } 사이)에 그 내용을 기술해 준다.
{
   this.dan = dan;
}

현재까지 진행된 클래스의 상태
public class Gugu {
   int dan;
   public void setDan(int dan) {
      this.dan = dan;
   }
}

구구단을 완성하여 반환한다는 것은 클래스의 기능으로 판단되므로 한개의 메소드로 표현해 볼 수 있다.

메소드 이름 정하기
구구단을 반환하므로 외부에서 이 메소드를 호출하면 완성된 구구단을 얻을 수 있다는 것을 의미한다. 메소드의 이름은 그 기능을 암시하도록 정하는 것이 좋으므로 getGugu() 처럼 해 주는 것이 좋겠다.

메소드 파라미터 정하기
이미 받아들여 저장된 수를 이용하여 구구단을 완성하기 때문에 파라미터로 데이터를 받아들일 필요가 없으므로 파라미터 리스트는 비워둔다.
getGugu()

리턴타입 정하기
완성된 구구단은 문자열(String)로 표현하여 리턴해야 하므로 리턴 타입은 String으로 할 수 있다.
String getGugu()

접근제한자 정하기
어떤 클래스에서도 이 메소드를 접근할 수 있도록 하려면 접근제한자는 public 이어야 한다.
public String getGugu() {  }

메소드 바디 정의하기
구구단을 완성하여 문자열 형태로 리턴하는 기능을 메소드의 바디에 기술해 주면 된다.
{
   String str = "";
   for(int i=1;i<=9;i++) {
      str += dan + " x " + i + " = " + (dan*i) + "\n";
   }
   return str;
}


완성된 메소드의 전체 내용
public String getGugu() {
   String str = "";
   for(int i=1;i<=9;i++) {
      str += dan + " x " + i + " = " + (dan*i) + "\n";
   }
   return str;
}

완성된 클래스의 전체 내용
public class Gugu {
   int dan;
   public void setDan(int dan) {
      this.dan = dan;
   }
   public String getGugu() {
      String str = "";
      for(int i=1;i<=9;i++) {
         str += dan + " x " + i + " = " + (dan*i) + "\n";
      }
      return str;
   }
}



완성된 클래스의 테스트
메소드를 호출하여 그 결과가 의도한대로 잘 나오는지 확인해 볼 필요가 있다. 이 클래스에 main메소드를 추가하여 main메소드 안에서 위의 메소드를 호출해 보면 된다.
public static void main(String[] args) {
   Gugu g = new Gugu();
   g.setDan(5);
   String str = g.getGugu();
   System.out.println(str);
}


테스트를 위해 완성된 클래스의 전체 내용
public class Gugu {

   int dan;

   public void setDan(int dan) {
      this.dan = dan;
   }

   public String getGugu() {
      String str = "";
      for(int i=1;i<=9;i++) {
         str += dan + " x " + i + " = " + (dan*i) + "\n";
      }
      return str;
   }

   public static void main(String[] args) {
      Gugu g = new Gugu();
      g.setDan(5);
      String str = g.getGugu();
      System.out.println(str);
   }

}