13일차_메소드

JavaSE 2015. 6. 21. 07:14

--------------------------------------
메소드

1. 메소드는 실행 코드 액션 내용을 작성하는 부분. 클래스 멤버의 한 종류.


2. 기본 형식

접근지정자(접근제어자) 리턴자료형 메소드이름(매개변수) {
 //실행 코드
 //return 반환값;
}


3. 접근지정자(접근제어자)는 주로 public 지정. 외부에서 해당 메소드를 어떤 위치(클래스 내부, 클래스 외부, 패키지 내부, 패키지 외부)에서든지 접근 가능하다는 것을 지정하는 키워드.


//Sample73.java
package com.test;

public class Sample73 {
 
 //클래스 멤버
 //-> 멤버변수, 메소드
 
 //메소드 원형
 /*
 접근제어자 반환자료형 메소드이름(매개변수) {
   실행코드;
 }
 */
 public void method1() {

 }
 
 void method2() {
  
 }
 
 private void method3() {
  
 }
 
}

 


//Main73.java -> 같은 패키지
package com.test;

public class Main73 {

 public static void main(String[] args) {
  
  //Sample73 클래스의 객체 생성
  Sample73 sample = new Sample73();
  
  //Sample73 객체의 하위 멤버인 메소드 접근
  sample.method1(); //O
  sample.method2(); //O
  //sample.method3(); //X ->private 멤버

 }

}

 

//Main73.java -> 다른 패키지
package com.sist;

import com.test.*;

public class Main73 {

 public static void main(String[] args) {

  //Sample73 클래스의 객체 생성
  Sample73 sample = new Sample73();
  
  //Sample73 객체의 하위 멤버인 메소드 접근
  sample.method1(); //O
  //sample.method2(); //X ->default 멤버
  //sample.method3(); //X ->private 멤버
  
 }

}

 

 

4. 반환자료형은 기본자료형, 참조자료형 모두 사용할 수 있다. 그외에 void라는 키워드를 사용할 수 있다. 기본자료형, 참조자료형을 사용하는 경우는 메소드 실행의 결과값을 반환할 때 사용될 자료형으로 지정된다. 외부에서 메소드 호출시 반환되는 값을 미리 예상할 수 있도록 하는 역할. void는 반환값이 없는 메소드를 작성할 때 사용한다.


//Sample11.java
package com.test;

public class Sample11 {
 
 public void method1() {
  //반환자료형이 void인 경우는 return 구문이 없다.
 }
 
 public int method2() {
  
  //반환자료형이 기본자료형이면 반환값은 기본자료형의 값이 된다.
  return 0;
 }
 
 public int add(int a, int b) {
  int result = 0;
  
  result = a + b;
  
  return result;
 }

 public Sample09 method3() {
  Sample09 result = null; 
  
  result = new Sample09();
  
  //반환자료형이 클래스이면 반환값은 해당 클래스의 객체가 된다.
  return result;
 }

}

 

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample11 s11 = new Sample11();

  //void는 반환자료형이 아니기 때문에
  //반환값이 없는 상태를 의미한다.
  //void a= s11.method1();
  s11.method1();
  
  //반환자료형이 기본자료형인 경우는
  //기본자료형을 가진 변수에 반환값을 저장할 수 있다.
  int b = s11.method2();
  
  //반환자료형이 참조자료형인 경우는
  //참조자료형을 가진 변수에 반환값을 저장할 수 있다.
  Sample09 c = s11.method3();
  c.method1();

 }

}

 

 

5. 반환값이 있는 메소드인 경우는 메소드의 마지막 문장으로 return 반환값; 구문이 존재해야 한다.

예를 들어, 반환값이 없는 경우
public void 메소드이름(매개변수) {
}

예를 들어, 반환값이 있는 경우
public int 메소드이름(매개변수) {
 return 정수값;
}
public String 메소드이름(매개변수) {
 return 문자열;
}
public PrivateMember 메소드이름(매개변수) {
 return PrivateMember의객체;
}


6. 메소드이름은 식별자 작성규칙에 맞춰서 작성한다. 가급적이면 메소드 액션 내용을 알 수 있도록 의미있는 단어 사용.

예를 들어,
public int add(int a, int b) {
 //곱셈 연산
}
public int subtract(int a, int b) {
 //뺄셈 연산
}


7. 매개변수는 필요시 사용한다. 외부에서 값을 메소드에 전달하는 경우에만 사용. 자료형 변수명, 자료형 변수명,... 형태로 작성. 매개변수가 사용된 경우는 외부에서 메소드 호출시 매개변수에 값을 전달해야 한다. 매개변수에 값을 전달하는 경우, 순서, 개수, 자료형이 일치해야 한다.

예를 들어, 메소드 호출하는 경우
[참조변수명.]메소드이름(값1, 값2, ...);

해당 메소드 정의는 아래와 같아야 한다.
public 반환자료형 메소드이름(매개변수1, 매개변수2, ...) {
}

 

 

//Calculator.java
package com.test;

public class Calculator {
 
 //10진수 입력(int)시 2진수 반환(String) 메소드 -> bin
 public String bin(int dec) {
  String result = "";
  do {
   result = String.valueOf(dec%2) + result;
   dec /= 2;
  }while(dec>0);
  return result;
 }

 //문제) 2진수(String) 입력시 10진수(int) 반환 메소드
 //->dec
 //-> 2진수 숫자를 자릿수별로 가중치 곱하기한 결과를 모두 더한다.
 public int dec(String bin) {
  int result = 0;
  for (int i=0; i<bin.length(); ++i) {
   int a = Integer.parseInt(String.valueOf(bin.charAt(i)));
   result += a * Math.pow(2, (bin.length()-1)-i);
   //문제) Math.pow() 부분을 for문으로 대체

  }
  return result;
 } 

}

 

 


//Main74.java
package com.test;

import java.util.*;

public class Main74 {

 public static void main(String[] args) {

  //입력 과정
  Scanner sc = new Scanner(System.in);
  System.out.printf("10진수(n)?");
  int dec = sc.nextInt();
  sc.close();
  
  //출력 과정
  Calculator cal = new Calculator();
  String result = cal.bin(dec);
  System.out.printf("10진수 %d => 2진수 %s %n"
    , dec, result);
  
 }

}

 


//Main75.java
package com.test;

import java.util.Scanner;

public class Main75 {

 public static void main(String[] args) {
  
  //입력 과정
  Scanner sc = new Scanner(System.in);
  //1111(2) -> 15(10)
  System.out.print("2진수(n)?");
  String bin = sc.next();
  sc.close();
  
  //출력 과정
  Calculator cal = new Calculator();
  int result = cal.dec(bin);
  System.out.printf("2진수:%s -> 10진수:%d %n"
    , bin, result);

 }

 
}

 

 

 

//Sample12.java
package com.test;

public class Sample12 {
 
 //메소드 호출시 매개변수의 개수와 순서, 자료형을 일치시켜야 한다.
 public int add(int a, int b) {
  int result = 0;
  
  result = a + b;
  
  return result;
 }

 //메소드 호출시 매개변수의 개수와 순서, 자료형을 일치시켜야 한다.
 public double divide(double a, double b) {
  double result = 0;
  
  result = a / b;
  
  return result;
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample12 s12 = new Sample12();
  
  s12.add(10, 20);
  s12.divide(10.0, 20.0);
  s12.divide(10, 20.0); //암시적 형변환 발생

  //문제) add() 메소드 호출 과정에서 오류의 원인을 작성.
  //s12.add();
  //s12.add(10);
  //s12.add(10, 20, 30);
  //s12.add(10, 20.0);
  
 }

}

 

 


//Sample63.java (난수 발생)
package com.test;

public class Sample63 {

 public static void main(String[] args) {

  //난수 발생 (0 이상 ~ 1 미만)
  for (int i=0; i<10; ++i) {
   double random = Math.random();
   System.out.println(random);
  }
  
  //난수 발생 (0 ~ 9)
  for (int i=0; i<10; ++i) {
   int random = (int)(Math.random()*10);
   System.out.println(random);
  }
  
  //난수 발생 (1 ~ 10)
  for (int i=0; i<10; ++i) {
   int random = (int)(Math.random()*10) + 1;
   System.out.println(random);
  }
  
  //난수 발생 (1 ~ 45)
  for (int i=0; i<10; ++i) {
   int random = (int)(Math.random()*45) + 1;
   System.out.println(random);
  }
  
  //난수 발생 (1 ~ 3)
  for (int i=0; i<10; ++i) {
   int random = (int)(Math.random()*3) + 1;
   System.out.println(random);
  }
  
  //범위 지정 (1~큰값)
  //((int)(Math.random()*큰값)) + 1
  for (int i=0; i<10; ++i) {
   System.out.println(((int)(Math.random()*45))+1);
  }  

 }

}

 

 

//RockPaperScissors.java (가위, 바위, 보 게임에 대한 메소드)
package com.test;

public class RockPaperScissors {
 
 //a~b 사이의 난수 발생 메소드
 public int randomFromAtoB(int a, int b) {
  int result = 0;
  if (a<b) {
   result = ((int)(Math.random()*b))+a;
  }
  return result;
 }
 
 //판정 메소드
 public int judgment(int user1, int user2) {
  //비긴 경우(0), user1 승(1), user2 승(2)
  int result = 0;
  if (user1 == user2) {
   result = 0;
  } else {
   result = ( (user1%3) == ((user2+1)%3) )?1:2;
  }
  return result;
 }

}

 

 

//Main77.java
package com.test;

import java.util.Scanner;

public class Main77 {

 public static void main(String[] args) {
  
  //사용자와 컴퓨터(난수)의 가위(1), 바위(2), 보(3) 게임
  //1. 외부에서 사용자가 가위, 바위, 보 게임을 진행
  //2. 가위->1, 바위->2, 보->3
  //3. 컴퓨터->난수 발생 결과(1~3) 저장
  //4. 사용자와 컴퓨터의 숫자를 비교해서 게임 결과 출력
  //5. 0->비긴 경우, 1->사용자 승, 2->컴퓨터 승
  //6. 위 과정을 무한실행으로 반복 진행.

  int user = 0;
  int comp = 0;

  RockPaperScissors rps = new RockPaperScissors();
  Scanner sc = new Scanner(System.in);
  String[] rpsMsg = {"가위","바위","보"};
  String[] msg = {"비겼습니다", "사용자가 이겼습니다", "컴퓨터가 이겼습니다."};

  do {
   //입력 과정
   System.out.print("가위(1), 바위(2), 보(3), exit(0)?");
   user = sc.nextInt();
   if (user == 0) {
    break;
   }
   comp = rps.randomFromAtoB(1, 3);
   
   //출력 과정
   System.out.printf("사용자:%s, 컴퓨터:%s %n"
     , rpsMsg[user-1], rpsMsg[comp-1]);
   System.out.println(msg[rps.judgment(user, comp)]);
  }while(true);
  
  sc.close();
  
  
 }

}

 

 

 

8. 메소드 내부에서 실행 코드는 사용자가 임의로 작성 가능. 외부에서 볼 때 메소드 내부 실행 코드는 감춰진 상태(캡슐화)이다.
외부에서 볼 때 메소드 구성(정의)을 알 수 있지만, 내부 상태는 알 수 없다.

외부에서 알 수 있는 부분
접근지정자(접근제어자) 리턴자료형 메소드이름(매개변수)

외부에서 알 수 없는 부분
{
 실행코드
 return 반환값;
}

 

//Calculator.java
package com.test;

public class Calculator {
 
 //10진수 입력(int)시 2진수 반환(String) 메소드 -> bin
 public String bin(int dec) {
  String result = "";
  do {
   result = String.valueOf(dec%2) + result;
   dec /= 2;
  }while(dec>0);
  return result;
 }
 
 //문제) 2진수(String) 입력시 10진수(int) 반환 메소드
 //->dec
 //-> 2진수 숫자를 자릿수별로 가중치 곱하기한 결과를 모두 더한다.

 public int dec(String bin) {
  int result = 0;
  for (int i=0; i<bin.length(); ++i){
   int a = Integer.parseInt(String.valueOf(bin.charAt(i)));
   //result += a * Math.pow(2, (bin.length()-1)-i);
   //문제) Math.pow() 부분을 사용자 메소드(pow) 대체
   result += a * this.pow(2, (bin.length()-1)-i);
  }
  return result;
 }
 
 
 //사용자 메소드 추가
 //a의 b승 계산하는 과정을 메소드로 작성
 //->private int pow(int a, int b)
 private int pow(int a, int b) {
  int result = 1;
  for (int i=0; i<b; ++i) {
   result *= a;
  }
  return result;
 }
 
}

 

 

//Main78.java
package com.test;

import java.util.Scanner;

public class Main78 {

 public static void main(String[] args) {

  //문제) Calculator 클래스의
  //두 가지 메소드를 선택적으로 호출하는 과정
  /*
  1. 10진수->2진수
  2. 2진수 -> 10진수
  선택(exit 0)?1
  10진수?10
  10진수:10 -> 2진수:1010
  
  1. 10진수->2진수
  2. 2진수 -> 10진수
  선택(exit 0)?2
  2진수?10
  2진수:10 -> 10진수:2
  */
  Calculator cal = new Calculator();
  Scanner sc = new Scanner(System.in);
  do {
   System.out.println();
   System.out.println("1. 10진수->2진수");
   System.out.println("2. 2진수 -> 10진수");
   System.out.printf("선택(exit 0)?");
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   if (m==1) {
    System.out.printf("10진수?");
    int dec = sc.nextInt();
    String result = cal.bin(dec);
    System.out.printf("10진수:%d -> 2진수:%s %n"
      , dec, result);
   }
   if (m==2) {
    System.out.printf("2진수?");
    String bin = sc.next();
    int result = cal.dec(bin);
    System.out.printf("2진수:%s -> 10진수:%d %n"
      , bin, result);
   }
   
  }while(true);
  
  sc.close();  
  
 }

}

 

 


-----------------------------------------------
요약

1. 메소드 : 클래스에서 액션 실행 담당.

2. 기본형식

접근지정자(접근제어자) 리턴자료형 메소드이름(매개변수) {
 //실행 코드
 //return 반환값;
}

3. static 키워드

4. main() 메소드


-------------------------------------------------

 

 


 

블로그 이미지

알 수 없는 사용자

,