Method 01
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);
}
}
}