TIL/JAVA

[JAVA] 메서드 Method 1/2

아람2 2024. 11. 12. 13:06
반응형

듣고 있는 인터넷 강의 

 

메서드 Method 를 사용하는 이유

프로그램의 여러 곳에서 같은 계산을 반복해야 할 때 함수를 만들어 두고

필요한 입력 값을 넣어서 해당 함수를 호출하면 코드를 여러 번 작성할 필요가 없다 

 

add(a, b) = a + b 라는 add 함수를 만들어 두면, 여러 곳에서 입력 값만 바꾸어서 호출하면 된다 

필요한 기능을 미리 정의해두고 필요할 때마다 호출해서 사용할 수 있다 

자바에서는 이러한 함수를, 메서드 Method 라고 한다 

🐣 Method 도 함수의 한 종류이지만, 지금 거기까지는 생각하지 않아도 된다 🐣

메서드 정의 

    /* int 형을 반환하는 add Method */
    public static int add(int a, int b){ /* 메서드 선언 부분 */
	    /* 이하는 메서드 본문 부분 */
        System.out.println(a+ "+" +b+ " 연산 수행 "); 
        int sum = a + b;
        return sum; /* sum 반환 */
    }
}

메서드 선언

    public static int add(int a, int b)

public static

public : 다른 클래스에서 호출할 수 있는 메서드라는 뜻 (접근 제어에서 학습 예정)
static : 객체를 생성하지 않고 호출할 수 있는 정적 메서드 (자세한 내용은 추후 학습)

int add(int a, int b)

int : 반환 타입, 메서드의 실행 결과를 반환할 때 사용할 반환 타입 지정
add : 메서드 이름, 이 이름으로 메서드 호출 
(int a, int b) : 메서드를 호출할 때 전달하는 입력 값 정의. 이 변수들은 해당 메서드 안에서만 사용되며

   이렇게 메서드 선언에 사용되는 변수를 Parameter, 매개변수 라고 한다 

변수명 vs 메서드명

변수 이름은 일반적으로 명사를 사용하고, 메서드는 무언가 동작하는데 사용하기 때문에 일반적으로 동사로 시작한다 

변수명 예) custormerName, totalSum, employeeCount 

메서드명 예) printReport(), calculateSum(), addCustomer() 

메서드 호출

 int sum1 = add(5, 10);

메서드 호출이 끝나면 메서드 정의에 사용한 파라미터 변수인 

int a, int b 는 물론이고, 그 안에서 정의한 int sum 도 모두 제거된다 

🐣 다른 곳에서 add 가 호출되면, 다시 a, b, sum 에 대한 공간을 할당하고 사용한 이후에 다시 제거된다

메서드를 호출할 때마다 생성되고 호출이 끝나면 제거된다 🐣

메서드 호출과 용어 정리 

메서드를 호출할 때는 메서드에 넘기는 값과 파라미터 타입이 맞아야 하고

넘기는 값과 파라미터 순서와 개수도 맞아야 한다 

호출: call("hello", 20)
메서드 정의: int call(String str, int age)

인수 Argument

'인'과 '수'의 합성어로, '들어가는 수' 라는 의미, 즉, 메서드 내부로 들어가는 값 

"hello", 20 처럼 넘기는 값을 Argument, 인수/ 인자 라고 한다

매개변수 Parameter 

'매개'와 '변수'의 합성어로, '중간에서 전달하는 변수'라는 의미

즉, 메서드 호출부와 메서드 내부 사이에서 값을 전달하는 역할을 하는 변수 

메서드를 정의할 때 선언한 변수인 String str, int age 를 Parameter 매개변수 라고 한다 

메서드를 호출할 때 인수를 넘기면, 그 변수가 매개변수에 대입된다 

메서드 정의 

public static int add (int a, int b) {
	/* 메서드 본문, 실행 코드 */
}

제어자 반환타입 메서드이름 (매개변수 목록) {
	/* 메서드 본문 */
}

제어자 Modifier public, static 과 같은 부분
반환 타입 Return Type 메서드가 실행된 후 반환하는 데이터의 타입을 지정한다 

    메서드가 값을 반환하지 않는 경우, 없다는 뜻의 void 를 사용해야 한다 ex) void print(String str)

    반대로 반환 타입이 있는 메서드는 반드시 return 을 사용해서 값을 반환해야 한다 

메서드 이름 Method Name 메서드의 이름, 이름은 메서드를 호출하는 데 사용된다. 

매개변수 Parameter 입력 값, 메서드 내부에서 사용할 수 있는 변수 

    입력 값이 필요 없는 메서드는 매개변수를 지정하지 않아도 된다 ex. add() 

메서드 본문 Method Body 실제 메서드의 코드, 중괄호 {} 사이에 코드를 작성한다 

반환 타입 

반환 타입이 있는 메서드는 반드시 return 을 사용해서 값을 반환해야 한다 

그리고 return 문을 만나면 그 즉시 해당 메서드를 빠져나간다 

메서드 호출과 값 전달 1

자바는 항상 변수의 값을 복사해서 대입한다 < 왕 중요 🐣🐣🐣🐣🐣

 

int num = 5; // num1 의 값은 5 이다 num1 (5) 
int num2 = num1; // num2 변수에 대입하기 전에 num1 의 값 5 를 읽는다 - num1 5 num2 5 
num2 = 10; // num2 에 10 을 대입한다 - num1 5 num2 10


위와 같은 예시가 있을 때, int num2 = num1; 부분은 num1 에 있는 값 5 를 복사해서 num2 에 넣는 것이다 

num1 이라는 변수 자체가 num2 에 들어가는 것이 아니고 num1 에 들어있는 값을 읽고 복사해서 num2 에 넣는 것이다 

간단하게는 num1 에 있는 값을 num2 에 대입한다고 표현하지만, 실제로는 그 값을 복사해서 대입하는 것이다 

변수의 값을 복사해서 전달하는 함수 예시 

package method;

public class MethodValue1 {
    public static void main(String[] args) {
        int num1 = 5;
        System.out.println("1. ChangeNumber 호출 전 "+num1);
        changeNumber(num1);

        /* 4. num1 가 뭐가 나올까? */
        System.out.println("4. ChangeNumber 호출 후 "+num1);
    }

    /* 변수의 값을 복사해서 연산을 수행하는 함수 */
    public static void changeNumber(int num2){
        System.out.println("2. ChangeNumber 변경 전 "+num2);
        num2 *= 2;
        System.out.println("3. ChangeNumber 변경 후 "+num2);
    }
}

 

여기에서 4번의 num1 은 10 이 아니고 5 가 나온다 - num2 의 변경은 num1 에 영향을 주지 않는다 

왜냐하면 값을 복사해서 전달했기 때문이다 

 

메서드 호출과 값 전달 2

아까와 같은 문제를 호출자의 변수 이름과 매개변수의 이름을 같게 해서 한 번 더 풀어보면 아래와 같다 

package method;

public class MethodValue2 {
    public static void main(String[] args) {
        int number = 5;
        System.out.println("1. ChangeNumber 호출 전 "+number);
        changeNumber(number);

        /* 4. number 가 뭐가 나올까? */
        System.out.println("4. ChangeNumber 호출 후 "+number);
    }

    /* 변수의 값을 복사해서 연산을 수행하는 함수 */
    /* main 과 number 이름은 같지만 둘이 완전히 다른 변수이다 */
    public static void changeNumber(int number){
        System.out.println("2. ChangeNumber 변경 전 "+number);
        number *= 2;
        System.out.println("3. ChangeNumber 변경 후 "+number);
    }
}

 main() 안의 number 와 changeNumber() 의 number 의 이름은 같지만 완전히 다른 변수이다 

서로 다른 매개변수 (파라미터) 이기 때문에 아까와 동일한 결과가 출력된다 

 

그런데 이 두 개의 함수는, 함수를 호출해도 변경된 값을 main() 메서드에 전달해 주지 않는다 

 

메서드 함수와 값 반환 받기 

메서드에서 변경한 값을 다른 메서드에서 사용하기 위해서는, 메서드의 호출 결과를 받아서 사용하면 된다 

package method;

public class MethodValue3 {
    public static void main(String[] args) {
        int num1 = 5;
        System.out.println("ChangeNumber 호출 전 "+num1);
        num1 = changeNumber(num1);
 
        /* 4. num1 가 뭐가 나올까? */
        System.out.println("ChangeNumber 호출 후 "+num1);
    }

    /* 변수의 값을 복사해서 연산을 수행해서 반환하는 함수 */
    public static int changeNumber(int num2){
        num2 *= 2; /* num2 x2 연산 수행 */
        return num2; /* num2 반환 */
    }
}

이렇게 changeNumber() 의 return 값을 main() 에서 num1 변수로 받을 수 있다 

 

자바는 항상 변수의 값을 복사해서 대입하는 것을 기억합시다 

반응형

'TIL > JAVA' 카테고리의 다른 글

[JAVA] 변수와 초기화  (0) 2024.12.02
[JAVA] 기본형과 참조형  (2) 2024.11.26
[JAVA][기본] 클래스 Class  (4) 2024.11.16
[JAVA] 메서드 Method 2/2  (0) 2024.11.13
[JAVA] 배열 Array  (0) 2024.11.08