끄적모음

자바 공부 5

taehyon 2025. 4. 11. 17:41

📗 배울 내용

  1. 메서드 시작
  2. 메서드 사용
  3. 메서드 정의
  4. 반환 타입
  5. 메서드 호출과 값 전달
  6. 메서드와 형변환
  7. 메서드 오버로드
  8. 문제 풀이
  9. 흑흑흑 요약 정리

1. 메서드 시작

필요할 때마다 호출해서 사용할 수 있는 함수


2. 메서드 사용

package method;

public class Method1Ref {

    public static void main(String[] args) {
        int sum1 = add(5, 10); // 호출
        System.out.println("sum1 = " + sum1);


        int sum2 = add(15, 20);
        System.out.println("sum2 = " + sum2);
    }
    // add  메서드
    public static int add(int a, int b) { // 메서드 정의
        System.out.println(a + "+" + b + " 연산수행");
        int sum = a + b;
        return sum;
    }
}

 

add 라는 메서드 함수를 만들어 사용한 것을 알 수 있다.

 

메서드 사용 방법은

 

함수를 정의하는것처럼 메서드를 정의한다

 

메서드는 크게 메서드 선언과 메서드 본문으로 나눌수있다.

메서드의 선언 부분으로, 메서드 이름 : add, 반환타임 : int, 매개변수(파라미터) 목록 : int a, int b 을 포함한다.

인수 ( Argument) :  add( 5, 10) 여기서 5,10처럼 넘기는 값을 영어로 아규먼트라고 한다, 
한글로는 인수 또는 인자 라고 한다.

매개변수 ( Parameter ) : 메서드를 정의할 때 선언한 변수인 int a 를 매개변수(파라미터)라고 한다. 
메서드를 호출할 때 인수를 넘기면 그 인수가 매개변수에 대입된다.

 


3. 메서드 정의

public static int add(int a, int b) {

}


제어자 : public, static 과 같은 부분

반환타입 : 메서드가 실행 된 후 반환하는 데이터의 타입을 지정(메서드 값을 반환하지 않는경우 void를 사용)
       반환 타입이 없는 경우 void로 정의해야한다.
반환값이 없는데 반환값을 받으면 컴파일 오류가 난다.

메서드 이름 : 메서드의 이름으로 호출하는데 사용

매개변수 : 입력 값으로, 메서드 내부에서 사용할 수 있는 변수이다. 매개변수는 옵션이다.(입력값이 필요없는 메서드는 매개변수를 지정하지 않아도 된다.

메서드 본문 실제 메서드의 코드가 위치한다. { } 사이에 코드를 작성

모든 메서드는 항상 return으로 호출해야한다. 

 

다만, 반환 타입 void의 경우에는 예외로 생략해도 된다.


자바 컴파일러가 반환 타입이 없는경우 return을 마지막줄에 넣어준다. 


참고로 return을 만나면 해당 메서드는 종료된다.

 

 


4. 반환 타입

public class MethodReturn1 {

    public static void main(String[] args) {
        boolean result = odd(2);
        System.out.println("result = " + result);
    }

    public static boolean odd(int i) {
        if (i % 2 == 1) {
            return true;  // true를 반환한다.
        } else {
            return false; // falsel를 반환한다.
        }
    }
}
public class MethodReturn2 {
    public static void main(String[] args) {
        checkAge(100);
    }

    public static void checkAge(int age) {
        if (age < 18) {
            System.out.println(age + "살, 미성년자는 출입이 불가능합니다.");
            return; // 종료
        }
        System.out.println(age + "살, 입장하세요");
    }
}

5. 메서드 호출과 값 전달

메서드 호출과 값 전달에 대해서 알기 위해 예시를 하나 볼껀데,

 

예시 코드를 보기 전에 가장 중요한 내용을 먼저 집고 가야한다.

 

자바에서 가장 중요한 대원칙 하나

 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 엄청 중요 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
자바는 항상 변수의 값을 복사해서 대입한다. ( 복사해서 전달 )
이 대원칙을 반드시 이해해야한다.

 

이것이 왜 엄청 대원칙이냐 할 수 있는데

 

예시를 통해서 이해해 보자

 

이 코드는 number = 5 를 메서드에 넣으면 2배가 되어서 돌아와 출력되는 문제이다 

 

package method;

public class MethodValue2 {

    public static void main(String[] args) {
        int number = 5;
        System.out.println("1. changeNumber 호출 전, number : " + number);
        changeNumber(number);
        System.out.println("4. changeNumber 호출 후, number : " + number);
    }

    public static void changeNumber(int number) {
        System.out.println("2. changeNumber 변경 전, number : " + number);
        number = number *2;
        System.out.println("3. changeNumber 변경 후, number : " + number);
    }
}

 

 그런데 잠깐!!!

 

이 코드에서 4번은 어떤 결과 값을 출력할지 먼저 생각해 보자

 

 

혹시 10인가? 했던 사람들은 코드를 직접 실행해보자

 

직접 실행해 보면 5가 출력 되는것을 알 수 가 있다.

 

public class MethodValue2 {

    public static void main(String[] args) {
        int number = 5;
        System.out.println("1. changeNumber 호출 전, number : " + number); // 5
        changeNumber(number);
        System.out.println("4. changeNumber 호출 후, number : " + number); // 5
    }

    public static void changeNumber(int number) {
        System.out.println("2. changeNumber 변경 전, number : " + number); //5
        number = number *2;
        System.out.println("3. changeNumber 변경 후, number : " + number); // 10
    }
}

 

왜 5가 출력이 되는지에 대해서 설명을 할려면

 

아까 위에서 설명했듯이

 

변수의 값을 복사 해서 대입한다고 했는데

 

이때 복사 라는 말을 잘 생각해보면 된다

 

number라고 쓰여있으면 헷갈리니까

 

변수를 잠깐 바꿔서 설명해 보겠다.

 

public class MethodValue1 {

    public static void main(String[] args) {
        int num1 = 5;
        System.out.println("1. changeNumber 호출 전, num1 : " + num1);
        changeNumber(num1);
        System.out.println("4. changeNumber 호출 후, num1 : " + num1); // 5가 출력된다.
        
        // 5가 출력되는거는 num1의 값을 num2에 복사해서 넣어두었기에 num2의 값이 변경된다고 해도 
        // num1의 값은 변경되지 않는다
    }

    public static void changeNumber(int num2) {
        System.out.println("2. changeNumber 변경 전, num2 : " + num2);
        num2 = num2 *2;
        System.out.println("3. changeNumber 변경 후, num2 : " + num2);
    }
}

 

변수를 변경했다고 해도 아까 number일때와 같은 결과 같이 나오는데

 

어떻게 해서 이러한 상황이 되었는지 설명해 보자면

 

changeNumber(int num2) 가 num1의 값을 복사해서 대입하게 된다.

 

그럼 changeNumber(5)가 된다 즉 num2의 값이 5가 된다

 

여기까지는 알고 있는 내용이다 그냥 값이 대입된거니까

 

그런데 여기서 num2가 2배가 되고 다시 num2에 저장되는데

 

이러한 과정에서 num2의 변경은 num1에 영향을 주지 않는다

 

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

 

그러면 이러한 문제를 해결하기 위해서는 어떻게 해야할까?

 

public class MethodValue3 {

    public static void main(String[] args) {
        int num1 = 5;
        System.out.println("changeNumber 호출 전, num1 : " + num1);
        num1 = changeNumber(num1);
        System.out.println("changeNumber 호출 후, num1 : " + num1); // 반환값으로 해결하면된다.
    }

    public static int changeNumber(int num2) {
        num2 = num2*2;
        return num2;
    }
}

// num2 를 반환해서 그 반환된 값을 다시 num1로 저장하고 출력하게 하면 된다.

 

이번에는 10으로 출력 되는것을 알 수 있는데

 

여기서 num2를 반환을 하고

 

반환된 값을 다시 num1에 복사하고 대입한 다음에 출력을 했기 때문에

 

다른 결과 값을 나오게 한것이다.


6. 메서드와 형변환

메서드를 호출하는데 인자와 매개변수의 타입이 맞지 않다면 어떻게 해야할까??

 

이건 저번에 형변환에서 한것과 같다.

 

메서드를 호출 할때도 형변호나이 적용이 된다.

 

메서드 호출과 명시적 형변환, 자동 형변환에 대해 예시를 통해 알아보자

 

public class MethodCasting1 {
    //명시적 형변환
    public static void main(String[] args) {
        double number = 1.5;
        printNumber(number);  // 큰 곳에서 작은곳으로 넣을수가 없다
        printNumber((int)number);

    }

    public static void printNumber(int n){
        System.out.println("숫자 = " + n);
    }
}

저 두게의 코드가 있는데 그중 주석이 달린곳을 보면
double로 값이 선언이 되었는데 메서드는 int 값을 받게 된다
그렇게 되면 오류로 인해 실행을 할 수 없게 된다.

 

 

하지만 반대의 경우도 있다.

 

public class MethodCasting2 {
    //자동 형변환
    public static void main(String[] args) {
        int number = 100;
        printNumber(number);

    }

    public static void printNumber(double n){
        System.out.println("숫자 = " + n);
    }
}

 

int 형으로 선언된 숫자가 double형의 n으로 들어가게 되는데

 

이때는 자동 형변환으로 인해서 double 형으로 출력이 된다.


7. 메서드 오버로드

메서드 오버로딩 : 메서드를 여러개 정의하는 것을 메서드 오버로딩이라고 한다.

메서드의 이름 뿐만 아니라 매개변수 정보를 함께 사용해서 메서드를 구분한다. 


따라서 다음과 같이 이름이 같고, 매개 변수가 다른 메서드를 정의할 수 있다.


add(int a, int b)
add(int a, int b, int c)
add(double a, double b)

 

 

그러나 이건 안된다....

int add(int a, int b)

int add(int c, int d) 

// 이것도 안됨 (타입을 통해서 구별함)
// 메서드 시그니처가 다름(이름이 같아도)

규칙!  메서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩을 할 수 있다 
(참고로 변환 타입은 인정하지 않는다 )


다음 케이스는 메서드  이름과 매개변수의 타입이 같으므로 컴파일 오류가 발생한다


int add(int a, int b)
double add(int a, int b)
//반환 타입은 시그니처에 들어가지 않는다

메서드 시그니처 : 메서드 이름 + 매개변수 타입(순서)
메서드 시그니처는 자바에서 메서드를 구분 할 수 있는 고유한 식별자나 서명을 뜻함
메서드의 이름과 매개변수타입 으로 구성되어 있다. 쉽게 말해 메서드를 구분할 수 있는 기준이다.
각각의 메서드는 고유하게 구분할 수 있어야한다.


8. 문제 풀이

메서드를 이용하면 어떤 점이 좋은지 비교가 되는 예제들을 한번 가져와 봤다

 

public class MethodEx3 {
    public static void main(String[] args) {
        int balance = 10000;

        // 입금 1000
        int depositAmount = 1000;
        balance += depositAmount;
        System.out.println(depositAmount + "원을 입금하였습니다. 현재 잔액: " + balance + "원");

        // 출금 2000
        int withdrawAmount = 2000;
        if (balance >= withdrawAmount) {
            balance -= withdrawAmount;
            System.out.println(withdrawAmount + "원을 출금하였습니다. 현재 잔액: " + balance + "원");
        } else {
            System.out.println(withdrawAmount + "원을 출금하려 했으나 잔액이 부족합니다.");
        }
        
        System.out.println("최종 잔액: " + balance + "원");
    }
}

 

보기 힘든 이 코드를 좀 더 쉽게 파악할 수 있게

 

메서드를 이용한 예제를 한번 보자

 

public class MethodEx3Ref {
    public static void main(String[] args) {
        int balance = 10000;

        balance = deposit(balance,1000); // 입금 1000
        balance = withdraw(balance, 2000); // 출금 2000

        System.out.println("최종 잔액: " + balance + "원");
    }

    public static int deposit(int balance, int amount) {
        balance += amount;
        System.out.println(amount + "원을 입금하였습니다. 현재 잔액: " + balance + "원");
        return balance;
    }

    public static int withdraw(int balance, int amount) {
        if (balance >= amount) {
            balance -= amount;
            System.out.println(amount + "원을 출금하였습니다. 현재 잔액: " + balance + "원");
        } else {
            System.out.println(amount + "원을 출금하려 했으나 잔액이 부족합니다.");
        }
        return balance;
    }
}

 

이렇게 되면 조금 더 보기 편하게 되고 나중에 문제가 생겼을때

 

문제가 생긴곳만 따로 수정을 하면 되기에 간편하다고 할 수 있다.

 


9. 얘도 어렵넹

 

요약 정리

변수명 vs 메서드명

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

이런 차이점 외에는 규칙은 둘다 같다. 
ex) 
변수명 : customerName, totalSum, employeeCount
메서드명 : printReport( ), calculateSum( ), addCustomer( )....

메서드 사용의 장점

코드 재사용 : 메서드는 특정 기능을 캡슐화 하므로 필요할때마다 그 기능을 다시 작성할 필요 없이
  해당 메서드르 호출함으로써 코드를 재사용 할 수 있다.
코드의 가독성 : 이름이 부여된 메서드는 코드가 수행하는 작업을 명확하게 나타내므로, 코드를 읽는 사람에게
추가적인 문맥을 제공한다.
모듈성 : 큰 프로그램을 작은, 관리 가능한 부분으로 나눌 수 있다. 이는 코드의 가독성을 높이고 디벙깅을 쉽게만든다

코드 유지 관리 : 메서드를 사용하면 코드의 특 정 부분에서 문제가 발생하거나 업데이트가 필요한경우 메서드만 수정하면 된다. 이렇게 하면 존체 코드 베이스에 영향을 주지 않고 변경 사항을 적용할 수 있다.

재사용성과 확장성 : 잘 설계된 메서드는 다른 프로그램이나 프로젝트에서도 재사용할 수 있으며, 새로운 기능을 추가하거나 기존 기능을 확장하는데 유용하다.

추상화 : 메서드를 사용하는 곳에서는 메서드의 구현을 몰라도 된다. 프로그램의 다른 부분에서는 복잡한 내부 작업에 대해 알 필요 없이 메서드를 사용할 수 있다.

테스트와 디버깅 용이성 : 개발 메서드는 독립적으로 테스트하고 디버그 할 수 있다. 이는 코드의 문제를 신속하게 찾고 수정하는데 도움이 된다.

따라서, 메서드는 효율적이고 유지 보수가 가능한 코드를 작성하는 데 매우 중요한 도구이다.

'끄적모음' 카테고리의 다른 글

JVM 메모리  (0) 2025.04.15
클래스와 객체  (0) 2025.04.15
요약 정리 - 자바 5  (0) 2025.04.10
요약 정리 - 자바 4  (0) 2025.04.10
요약 정리 - 자바  (0) 2025.04.09