JavaSE

14일차_메소드

알 수 없는 사용자 2015. 6. 21. 07:14

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


9. 프로그램 내부에서 반복적으로 동일한 코드가 실행되어야 하는 경우는 메소드를 정의해서 그 안에 실행 코드를 작성하는 것이 좋은 방법이다. 코드의 중복을 제거하는 과정이다. 실행시 메소드 반복 호출을 통해서 두 번 이상 같은 코드가 실행되도록 할 수 있다.

 

10. 메소드는 인스턴스 메소드와 static 메소드(클래스 메소드)를 구분된다. static 메소드는 메소드 정의시 static 키워드를 사용해야 한다. 인스턴스 메소드는 객체와 같은 상태를 유지한다. 객체가 생성될때 각각의 객체마다 고유의 메소드가 존재하게 된다.  static 메소드는 클래스와 같은 상태를 유지한다. 클래스 하나당 하나의 메소드만 존재하게 된다. static 메소드는 객체 생성 과정과 관계 없이 호출이 가능하다. static 메소드는 모든 객체가 동일하게 사용(공유)해야 하는 메소드를 정의할 때 사용한다.

인스턴스 메소드 정의 예
public 반환자료형 메소드이름(매개변수) {
}

static 메소드 정의 예
public
반환자료형 메소드이름(매개변수) {
}

 

 

//ArrayPrint.java
package com.test;

public class ArrayPrint {
 
 //정수형 배열의 값을 (콘솔)출력하는 메소드
 public void arrayPrint(int[] array) {
  for (int i=0; i<array.length; ++i) {
   System.out.printf(" %d", array[i]);
  }
  System.out.println();
 }

}

 


//StaticArrayPrint.java
package com.test;

public class StaticArrayPrint {
 
 //정수형 배열의 값을 (콘솔)출력하는 메소드
 //->static 키워드 추가
 public static void arrayPrint(int[] array) {
  for (int i=0; i<array.length; ++i) {
   System.out.printf(" %d", array[i]);
  }
  System.out.println();
 }

}

 

 

//Sample75.java
package com.test;

public class Sample75 {

 public static void main(String[] args) {
  
  int[] a = {6, 5, 8, 1, 2, 9, 3, 4, 7, 0};
  
  int temp = a[0];
  for (int b=1; b<a.length; ++b) {
   if (temp < a[b]) {
    temp = a[b];
   }
  }
  
  //배열 요소 출력 과정 추가
  //for문 이용하는 경우
  /*
  for (int i=0; i<a.length; ++i){
   System.out.printf("%d ", a[i]);
  }
  System.out.println();
  */
  //전용 메소드 호출하는 경우->인스턴스 메소드
  /*
  ArrayPrint ap = new ArrayPrint();
  ap.arrayPrint(a);
  */

  //전용 메소드 호출하는 경우->static 메소드
  StaticArrayPrint.arrayPrint(a);
  
  System.out.printf("max:%d %n", temp);
  
 }
 
}

 

 

//Sample76.java
package com.test;

import java.util.*;

public class Sample76 {

 public static void main(String[] args) {
  
  //배열 요소 정렬 과정
  int[] a = {6, 5, 8, 1, 2, 9, 3, 4, 7, 0};

  System.out.print("정렬전:");
  StaticArrayPrint.arrayPrint(a);

  //정렬 과정 추가
  //Arrays 클래스의 sort() 메소드 사용
  Arrays.sort(a);
  
  System.out.print("정렬후:");
  StaticArrayPrint.arrayPrint(a);
 
 }

}

 

 

11. (인스턴스)메소드 호출은 클래스 내부, 클래스 외부에 따라서 다른 호출 방법을 사용한다. 같은 클래스의 다른 인스턴스 메소드 호출시에는 메소드이름만으로 호출이 가능하다.  다른 클래스의 인스턴스 메소드 호출하는 경우는 해당 클래스의 객체 생성 과정과 객체를 저장한 참조변수가 존재해야 한다.

클래스 내부인 경우
메소드이름();
this.메소드이름();

클래스 외부인 경우
참조변수명.메소드이름();


12. (static)메소드 호출은 클래스 내부, 클래스 외부, 다른 패키지에 따라서 다른 호출 방법을 사용한다.

클래스 내부인 경우
메소드이름();

클래스 외부인 경우
클래스명.메소드이름();

다른 패키지인 경우 (패키지명을 생략하려면 import 구문 사용)
패키지명.클래스명.메소드이름();

 

//MemberTest.java
package com.test;

public class MemberTest {
 
 //인스턴스 멤버
 //-> 현재 클래스가 객체 생성된 후에만 접근 가능
 //-> 같은 객체의 다른 인스턴스 멤버 접근 가능
 //-> 다른 객체의 다른 인스턴스 멤버 접근 가능
 public void method1() {
  
 }
 
 public void method3() {
  //같은 객체의 다른 인스턴스 멤버가
  //method1() 메소드 접근시
  method1();
  this.method1();
  //같은 클래스의 다른 인스턴스 멤버가
  //method2() 메소드 접근시
  method2();
  MemberTest.method2();
 }
 
 //static 멤버(클래스 멤버)
 //-> 현재 클래스가 객체 생성 유무와 관계 없이 접근 가능
 //-> 인스턴스 멤버, static 멤버 접근 가능
 public static void method2() {
  
 }
 
 public static void method4() {
  //같은 클래스의 다른 static 멤버가
  //method2() 메소드 접근시
  method2();
  MemberTest.method2();
 }
 
 
}

 

 

//Sample77.java
package com.test;

public class Sample77 {

 public static void main(String[] args) {

  //MemberTest 클래스(객체)의 인스턴스 멤버 접근
  //->method1()
  MemberTest mt = new MemberTest();
  mt.method1();
  
  //MemberTest 클래스(객체)의 static 멤버 접근
  //->method2()
  MemberTest.method2();
  
 }

}

 

 

 

----------------------------
가위, 바위, 보 게임에 대한 조건문
가위를 1, 바위를 2, 보를 3로 표현한 경우
승패 규칙은 다음과 같다.

모든 경우의 수
user1  -  user2  -> 승
  1         2        2
  1         3        1
  2         1        2  (중복)
  2         3        3
  3         1        1  (중복)
  3         2        3  (중복)

중복을 제거한 경우의 수
user1  -  user2  -> 승
  1         2        2
  1         3        1
  2         3        3

승과 관련한 수학적 수식
user1    -   user2        -> 승
 1%3->1  !=  (2+1)%3->0     user2
 1%3->1  ==  (3+1)%3->1     user1
 2%3->2  !=  (3+1)%3->1     user2

 

//RockPaperScissors.java
package com.test;

public class RockPaperScissors {
 
 //a~b 사이의 난수 발생 메소드
 //->static 키워드 추가
 public static int randomFromAtoB(int a, int b) {
  int result = 0;
  if (a<b) {
   result = ((int)(Math.random()*b))+a;
  }
  return result;
 }
 
 //판정 메소드
 //->static 키워드 추가
 public static 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) 게임
  int user = 0;
  int comp = 0;

  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;
   }
   //static 멤버 호출은 '클래스명.멤버' 형식으로 호출한다.
   comp = RockPaperScissors.randomFromAtoB(1, 3);
   
   //출력 과정
   System.out.printf("사용자:%s, 컴퓨터:%s %n"
     , rpsMsg[user-1], rpsMsg[comp-1]);
   System.out.println(msg[RockPaperScissors.judgment(user, comp)]);
  }while(true);
  
  sc.close();
  
  
 }

}

 

 

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

1. 메소드 정의
- 중복된 요소
- 복잡한 코드 (캡슐화)
- 반환자료형, 매개변수, 메소드이름

2. 메소드 유형
- 인스턴스 : 객체 고유 메소드
- static : 객체 공유 메소드

3. 메소드 호출
- 인스턴스 : 객체 생성 과정 필요
- static : 클래스이름
- 반환자료형, 매개변수

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