Java SE/Method01

Method 01

Soul-Learner 2008. 5. 19. 11:02

class Method01
{
 // 메소드의 개념
 /*
 *  부서에 부서명이 있는 것처럼 메소드도 이름을 가져야 한다.
 * 이름은 일반문자, 숫자, _, $ 등을 이용해서 작성할 수 있고 숫자가 맨 앞에 올 수는 없다.
  * 메소드 이름이 2개 단어 이상으로 조합되어 작성되는 경우, 뒤의 단어의 첫 문자를 대문자로 하는 것이 관례이다.
  * 메소드 이름은 명사형보다 동사형으로 하는 것을 관례로 하고 있다.

 *  상급부서에서 명령(기초자료포함)을 받아서, 처리(Processing)하고  그 결과를 보고(return)하는 부서에 해당함.
 *  위의 '기초자료'는 메소드의 파라미터로 표현되고,
 *  '처리'는 메소드의 바디에서 구현되며, 자바의 모든 자료형, 제어문, 연산자등이 사용된다.
 *  '보고'는 메소드 바디에서 return문을 이용하여 구현하면 된다.
 *  부서에서 일을 처리한 후에 보고형식을 지정하는 것처럼 메소드는 반환형(return type)을 반드시 선언해야 한다.
 *  리턴타입을 선언했으면 그 형태의 데이터를 리턴해 주어야 한다.
 *  메소드의 선언이 끝났으면 어디선가 그 이름을 불러 호출해 주면 실행된다.
 *  부서를 설립해 놓고 상급부터에서 일 처리 명령을 하달하는 것과 유사한 개념이다.
 *  메소드 바디에서는 일처리 방법론을 구현해 주어야 하며, 이는 부서의 업무처리지침과 유사하다.
 *  우선 가장 단순한 형태의 메소드를 선언하고 호출하는 경우를 연습해 본다.
 *  파라미터와 리턴타입을 갖지않은 형태의 메소드를 선언하고 호출해 본다.
 */
 public static void main(String[] args)
 {
  printName();
  printGugu();
  printGugu(5);

  String str = getGugu(4);
  System.out.println("4단---------");
  System.out.println(str);

  str = str.replace('x', '*');
  System.out.println(str);

  int result = add(10,20);
  System.out.println("10 + 20 = "+result);

  double hyp = getHyp(3,4);
  System.out.println("밑변 3, 높이 4일경우의 사변의 길이: "+ hyp);

  long answer = pow(2, 16);
  System.out.println("2^16 = "+answer);

  selfInvocation(10);

  int count = getCount ("Hello World");
  System.out.println("발견된 문자 'l' 의 수: "+ count);

  StringBuffer sb = new StringBuffer("Hello");
  change(sb);
  System.out.println("sb = " + sb);

  answer = factorial(5);
  System.out.println("factorial(5) = "+answer);

  factorialSelf(5);
 }

 // 이름을 출력하는 메소드를 선언하고 main() 메소드에서 호출하여 실행하는 경우
 static void printName() {
  System.out.println("Hello World");
 }

 // 구구단 8단을 출력하는 메소드를 선언하고 호출하는 경우
 static void printGugu() {
  System.out.println("8단---------");
  int dan = 8;
  for(int i=1;i<=9;i++) {
   System.out.println(dan + " x " + i + " = " + (dan*i));
  }
 }

 // 파라미터로 숫자를 받아서 구구단으로 가공(처리)하는 메소드의 예
 static void printGugu(int dan) {
  System.out.println(dan+"단---------");
  for(int i=1;i<=9;i++) {
   System.out.println(dan + " x " + i + " = " + (dan*i));
  } 
 }

 // 완성된 구구단을 호출부로 반환하는 메소드의 예
 static String getGugu(int dan) {
  String str = "";
  for(int i=1;i<=9;i++) {
   str += dan + " x " + i + " = " + (dan*i) + "\n";
  }
  return str;
 }

 // 숫자 2개를 받아서 덧셈을 한 후에 결과를 반환하는 메소드의 예
 static int add(int a, int b) {
  return a+b;
 }

 // Math클래스의 sqrt()름 참고하여 삼각형의 밑변과 높이를 알면 빗변의 길이를 계산하여 리턴하는 메소드를 작성해 보세요
 static double getHyp(int base, int height) {
  return Math.sqrt(base*base + height*height);
 }

 // 숫자 2개를 받아서 뒤의 숫자를 앞의 숫자의 지수로 하여 제곱승을 계산하여 리턴하는 메소드를 작성해 보세요(for 루프 사용 필수)
 static long pow(int a, int b) {
  long result = 1;
  for(int i=1;i<=b;i++) {
   result  *= a;
  }
  return result;
 }

 // 재귀호출함수를 이용하여 파라미터로 받은 숫자에서 하나씩 감소해서 출력하는 메소드를 작성해 보세요.
 // 반복문을 사용하지 않고 정해진 로직을 반복해서 실행하는 예
 static void selfInvocation(int n) {
  if(n!=0) {
   System.out.print(n--);
   System.out.print(" ");
   selfInvocation(n);
  }
 }

 // 문자열을 파라미터로 받아서 그 문자열("Hello World") 안에 포함되어 있는 특정문자('l')의 수를 리턴하는 메소드를 작성해 보세요.
 static  int getCount(String str) {
  int count = 0;
  for(int i=0;i<str.length();i++) {
   if(str.charAt(i)=='l') count++;
  }
  return count;
 }

 //Call by value
 // 호출하는 측에 선언된 sum, num변수의 값을 복사해서 전달하는 예
 static void change(int sum, int num) {
  sum += num;
 }

 // call by reference
 static void change(StringBuffer sb) {
  sb.append(" World");
 }

 /* 숫자 하나를 받아서 factorial을 계산하여 리턴하는 메소드를 작성해 보세요.*/
 static long factorial(int n) {
  long result = n;
  for(int i=n-1;i>0;i--) {
   result  *= i;
  }
  return result;
 }

 /* 지역변수만으로는 한계가 있음을 알게하고 Field의 필요성을 알게한다
 *  위의 결과와 동일하게 기능할 수 있는 재귀호출 메소드를 선언하고 사용해 보세요. (리턴타입은 void로 한다)
 *  리턴타입을 이용할 수 없는 점 때문에 지역변수만 사용해야 하는데, 지역변수는 메소드가 실행될 때마다,
 *  생성되는 특징이 있기 때문에 계속 변동하는 값을 저장할 수 없다. 그래서 Field 의 도입이 필요하다.
 */
 static long ans = 1; // Field의 선언
 static void factorialSelf(int n) {
  if(n!=0) {
   ans *= n--;
   factorialSelf(n);
  }else {
   System.out.println("5! = " + ans);
  }
 }

}