본문 바로가기

국비필기노트/Java

자바(java)_메서드

▶메서드란?

-. java 프로그램이 시작되는 시작점을 의미하는 main은 public, static, void, main(string[] args)라는 키워드 로 구성된 하는의 {..}블록이다.

-. java가 시작하면 맨 처음 main 이라는 메소드를 찾아 Main 메소드안의 소스코드를 위에서 부터 아래로 읽어내간다.

-. public static void main(String[] args)가 main 이라는 메서드이다.

-. f(x) = x + 1을 예시로 들자면, f는 함수이름, x는 매개변수, x+1은 식이다. 이런식으로 함수를 한번 지정하면 언제든지 본인이 필요할 때 함수를 꺼내 x에 다양한 수를 넣어 여러번 활용이 가능한데 이 함수를 프로그래밍화 하면 메서드가 되는것이다. 

 

▶프로그램의 함수 = 메서드

-. 메서드 선언방법

  public static void 메서드 이름(){

   ..수행할 연산식...

    }

 => f(x) = x+1 같은 함수를 프로그래밍 측면으로, 즉, 메서드는 상기와 같은 형식으로 선언한다.

 

-. 메서드 호출방법

정의된 메서드는 다른 메서드를 구성하는 {...} 안에서 다음 형식으로 사용될 수 있으며, 이를 메서드를 호    출한다고 한다.

    메서드이름();

 

▶메서드예시

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Main03 {
    
    public static void main(String[] args) {
       //A
    }
 
    public static void f(){
        int x = 100;
        int y = x + 1;
        System.out.println(y);
    }
}
cs

 

-. 이 상황에서는 콘솔에는 아무런 출력이 되지않는다.

java는 main 으로 들어와 main의 마지막 "}" 까지 읽고 나가게되는데 위 상황에서는 f라는 메서드를 선언만 시켰을 뿐 main 안에서 f를 호출시키지 않았기 때문이다. java 입장에선 main 안에 아무것도 없으니 출력시킬 것이 없는 것

 

-. 그럼 A라는 자리에 f(); 처럼 F메서드를 호출시킨다면? 

자바는 main 으로 들어와 f()를 발견하고 메서드 호출식인걸 인지, f메서드가 존재하는지를 확인하고 그 결과값을 가져오는 행동을 한다. 그렇게 101이 출력된다.

 

-. f()는 몇개든 사용이 가능하다. f(); 를 밑에 20개를 붙혀넣기 한다면 101은 20번 출력될 것이다 .

 

 

▶메서드 파라미터

-. java 프로그램의 메서드는 자신이 실행되는데 필요한 조건값을 메서드 이름 뒤의 괄호안에서 변수 현태로 선언한다. 이를 메서드 파라미터{=()안의변수명,변수이름}라 칭한다. 

   Public static void 메서드이름( 변수명 변수이름 ){}

 

▶다중 파라미터

-. 파라미터를 2개 이상 받아올 때

-. 메서드가 연산을 수행하는데 두 개 이상의 파라미터가 필요하다면 콤마(,)로 구분하여 선언할 수 있다.

    Public static void 메서드이름( 변수형 변수이름, 변수형 변수이름, 변수형 변수이름, ...){

}

-. 파라미터 갯수는 MAX 3개정도를 권고한다. 3개 이상일 경우, 메서드에 대한 이해가 복잡할 수 있어 3개 초과일 경우 차라리 메서드를 2개 설정한다.

 

▶파라미터를 갖는 메서드의 호출

-. 메서드를 정의하면서 파라미터가 명시되어 있다면 해당 메서드를 호출하면서 파라미터를 전달해 주어야 한다.

    메서드이름( 값1, 값2, 값3 );

이 때, 가져오려는 메서드의 변수의 데이터타입, 파라미터의 갯수 모두 가져와야한다.

 

▶파라미터를 갖는 메서드의 예시

 

1
2
3
4
5
6
7
8
9
10
public class main04 {
    public static void main(String[] args) {
        f1(100); 
    }
 
    public static void f1( int x) {
        System.out.println(x);
    }
 
}
cs

 

-. x라는 메서드의 변수의 데이터타입은 int임으로 f1()에 정수 100을 입력해준다. 

그럼 f1의 메서드 x에는 100이 담기고 다시 syso의 x가 main으로 호출되어 100이 출력되게된다.

 

1
2
3
4
5
6
7
8
9
10
11
public class main04 {
    public static void main(String[] args) {
        plus(2,5);
    }
 
    public static void plus (int x, int y){
        System.out.println(x + y);
 
    }
}
 
cs

 

-. 다중 파라미터의 경우, 메서드의 선언에도 2개, 값에도 꼭 2개를 넣어줘야한다. x와 y자리에 맞춰서 값을 넣으면 자연스럽게 자리에 따라 x와 y값을 나누게 되고 plus 메서드안의 syso안의 연산식에 넣고 syso를 실행시켜 출력한다.

 

즉, 메서드 선언부에는 메서드에 값을 제외한 데이터 타입, 연산, 함수 등 모든걸 넣어주고 main함수에서는 값만 넣어준다고 생각한다.

 

▶메서드의 기본값

-. 메서드가 연산결과를 자신이 호출된 위치에 반환하는 것을 "리턴" 이라고 하며, 반환되는 값을 "리턴 값"이라고 한다.

-. 메서드 안에서 값을 리턴하기 위해서는 "return"이라는 키워드가 사용된다.

-. 값을 리턴하는 메서드는 선언시에 "void"키워드 대신, 리턴하는 값에 대한 변수형이 명시된다. void는 리턴값이 없다는 의미이다. 

    public static 리턴형 메서드이름(변수형 파라미터, ...){

                   return 리턴값; 

}        

=> 리턴일 경우에는 void키워드를 쓰지 않는다.

=> 리턴형이란 리턴되는 값이 예를들어 int타입이면 리턴형을 int로 작성한다.

 

▶메서드의 리턴 예시

1
2
3
4
5
6
7
8
9
10
11
12
public class Main05 {
    public static void main(String[] args) {
        int z = f1(5);
        System.out.println(z);
    }
 
    public static int f1( int x ){
        int y = x + 1;
        return y;
    }
 
cs

 

 

-. f1함수에 값 5를 넣어 x에 대입시킨다. x는 y에 대입이 되고 f1함수는 x값을 보낸 f1(5)에 y라는 값을 return 시켜준다. 그 y는 z에 담기게되고 결국 6이라는 숫자가 z에 담겨 출력되게된다.

 

-. return은 쉽게말해서 f1의 함수는 들어올 땐 X였지만 어떤 연산식에 의해서 결과값이 Y가 나오게 된다. f1(5)친구는 f1에 값을 5를 넣고싶어 들어가는 입구 x를 통해 들어가면 y가 되어버리는 것. 그리고 그 y의 값을 f1(5)에 강제로 넣어버리는 것이 return이다. f1();이 y값도 지정을 해놨으면 return을 할 이유가 없다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package day06.Method;
 
public class Main05 {
    public static void main(String[] args) {
 
        boolean result = f2(10);
        System.out.println( result );
        System.out.println( f2(2));
    }
 
    public static boolean f2(int x){
        if(x>5){
            return true;
        } else { 
            return false;
        }
    }
 
cs

 

-. f2에 10이라는 값을 집어넣으면 x 파라미터를 통해 f2의 함수로 들어간다. x는 10보다 크니까 true값을 return 받게되고 그 값은 그대로 main에 있는 f2(10)에 들어가게 되는데 이는 reruslt 값에 넣어져 Syso(result)는 true값을 출력하게된다.

-. Syso()안에서 바로 메서드 함수의 값을 바로 출력 가능하므로 f2(2)가 fasle를 출력하는것에 아무런 오류가 없다.

 

▶return을 사용하는 경우와 아닌경우의 구분예시

-. return을 사용하지 않는 경우

사칙연산계산기의 결과값을 그냥 출력만 원할 경우엔 return을 사용하지 않아도 된다.

 

-. return을 사용하는 경우

키가 160이상인 사람만 열차를 탈 수 있다고 가정하였을 때 많은 사람들이 키를 측정해야하니 측정공식을 매서드로 입력을 하고 그 키를 매개변수(파라미터)로 넘긴다. 그리고 그 공식에서 값을 true, flase로 넘겨줘야 키 160여부를 알 수 있는데 이 때 결과값을 return 받을 필요가 명확하게 생긴다.

 

▶두 개의 함수를 연립하여 사용하기

-. f1(x) = x + 1

   f2(y) = f1(y) + 10 

   => 이처럼 f2안에 f1의 함수를 넣어 연립해서 사용 가능하다.

  

▶메서드 간의 상호 호출

-. java의 메서드 역시 서로 호출하는 것이 가능하다. 호출된 메서드가 값을 리턴하는 경우, 리턴받은 값을 다른 연산에 사용할 수도 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package day06.Method;
 
public class Main06 {
    
    public static void main(String[] args) {
        System.out.println(f2(100));
    }
 
    public static int f1( int x) { //return이 있구나 그럼 int형으로 return이 되는구나
        return x + 1;  //연산의 결과를 바로 return 해줄 수 있다.
    }
 
    public static int f2( int x ){
        return f1(x) + 1// 다른 메서드를 호출 
    }
}
cs

 

-. 전혀 다른 f1과 f2의 메서드가 존재할 때 이 둘은 연립하여 사용이 가능하다.

-. f2 메서드 안에는 f1메서드 호출식이 존재한다.

-. main함수에서 100의 값을 f2에 대입했을 때, f2의 x로 100의 값이 들어가나 거기엔 f1(x)가 존재한다. 그럼 java는 다시 f1(x)로 들어가 f1의 함수에서 x에 100을 넣고 101의 결과값을 출력한 후 다시 f2로 들고와 f1(x)의 자리에 101을 대입시키고 최종적으로 102라는 값을 return시켜 f2(100)에 넣어 102라는 값을 출력시킨다.