[자바] 기초문법정리(메서드)

brand_mins·2024년 1월 8일

Java

목록 보기
35/47

1. 메서드

  • 아래 코드는 1+2와 10+20에 대한 단순한 계산
  • 하지만, 이 코드는 하나하나씩 수작업을 해야함. 그래서 함수. 즉, 메서드 사용해야 함.
package method;

public class Method1 {

    public static void main(String[] args) {
        //계산1
        int a = 1;
        int b = 2;

        System.out.println(a + "+" + b + " 연산 수행");
        int sum1 = a + b;
        System.out.println("결과1 출력: " + sum1);

        // 계산2

        int x = 10;
        int y = 20;
        System.out.println(x + "+" + y + " 연산 수행");
        int sum2 = x+y;
        System.out.println("결과2 출력: " + sum2);
    }
}

1) 메서드 사용

package method;

public class Method1Ref {

    public static void main(String[] args) {
        //계산1
        int sum1 = add(5,10);
        System.out.println("결과1 출력: " + sum1);

        // 계산2
        int sum2 = add(15,20);
        System.out.println("결과2 출력: " + sum2);
    }
    // add 메서드
    public static int add(int a, int b) {
        System.out.println(a + "+" + b + " 연산 수행");
        int sum = a+b;
        return sum;
    }
}
  • 자바에서는 함수를 메서드라고 함.

(1) 메서드 정의

  • 함수를 정의하는 것과 같이 메서드를 정의함.

1) 메서드 선언

public static int add(int a, int b)
  • 메서드의 선언부분.
  • 메서드 이름(add), 반환타입(int), 매개변수(파라미터) 목록 포함
  • public: 접근제어자이면서 다른 클래스를 호출할 수 있는 메서드
  • static: 객체를 생성하지 않고 호출할 수 있는 정적 메서드

2) 메서드 본문

System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum;
  • 메서드가 수행해야 하는 코드 블록
  • 메서드를 호출하는 곳에서는 메서드 선언은 알지만 본문은 모른다.
  • return sum은 sum 변수에 들어있는 값을 반환

3) 메서드 호출

int sum1 = add(5,10); // add라는 메서드를 숫자 5, 10을 전달하면서 호출
int sum2 = add(15,20); // add라는 메서드를 숫자 15,20을 전달

(2) 메서드 호출과 용어 정리

  • 메서드를 호출할 때 메서드에 넘기는 값과 매개변수(파라미터) 타입이 맞아야 한다. --> 이런 작업들이 나중에 오류발생 가능성 높음.
호출: call("hello", 20)
메서드 정의: int call(String str, int age)

1) 인수(Argument)

  • "hello", 20 처럼 넘기는 값
  • 실무에서는 아규먼트, 인수, 인자라는 용어 모두 사용

2) 매개변수(Parameter)

  • 메서드를 정의할때 선언한 변수인 String str, int age를 매개변수, 파라미터라고 한다.
  • 호출할때 인수를 넘기면 매개변수에 대입
  • 실무에서는 매개변수, 파라미터 용어 모두 사용

2) 메서드 정의

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

제어자 반환타입 메서드 이름(매개변수 목록) {
	메서드 본문
}
  • 제어자: public, static과 같은 부분.
  • 반환타입: 메서드가 실행된 후 반환되는 데이터 타입. 메서드 값을 반환히자 않는 경우는 void 사용

(1) 매개변수가 없거나 반환 타입이 없는 경우

package method;

public class Method2 {

    public static void main(String[] args) {
        printHeader();
        System.out.println("프로그램이 동작합니다.");
        printFooter();
    }

    public static void printHeader() {
        System.out.println("= 프로그램을 시작합니다 =");
        return;
    }
    
    public static void printFooter() {
        System.out.println("= 프로그램을 종료합니다 =");
    }
}
  • 매개변수가 없을 경우
    • 선언: public static void printHeader()와 같이 매개변수 비워두고 정의
    • 호출: printHeader() 와 같이 인수를 비워두고 호출
  • 반환타입이 없을 경우
    • 선언: public static void printHeader()와 같이 반환타입을 void로 정의
    • 호출: printHeader(); 반환타입이 없으므로 메서드만 호출. 반환값 받지않음.
* 주의 *
메서드 본문에 String str = printHeader() 라는 반환타입을 주게 되면 
컴파일 오류 발생

(2) void와 return 생략

  • 모든 메서드는 항상 return 호출.
  • 하지만 반환타입이 void인 경우 예외로 printHeader()와 같이 생략 가능
  • 자바에 반환 타입이 없는 경우에는 return을 마지막 줄에 넣어줌
  • return을 만나면 해당 메서드 종료

3) 반환 타입

  • 반환 타입이 있는 메서드는 반드시 return을 이용해서 값을 반환
package method;

public class MethodReturn1 {

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

    public static boolean odd(int i) {
        if(i % 2 == 1) {
            return true;
        } else {
            return false;
        }
    }
}

(1) return문을 만나면 즉시 메서드 빠져나가는 방식

package method;

public class MethodReturn2 {

    public static void main(String[] args) {
        checkAge(10);
        checkAge(20);
    }

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

        System.out.println(age + "살, 입장하세요");
    }
}
  • if문 조건에 해당하면 미성년자는 출입 불가능을 출력하고 return문 수행
  • 조건에 해당되지 않으면 입장하세요 출력

(2) 반환 값 무시

  • 반환타입이 있는 메서드를 호출해도 반환 값이 필요하다면 사용x
  • 예시
int sum = add(1,2) // 반환된 값을 받아서 sum에 저장
add(1,2) // 반환된 값을 사용하지 않고 버린다.

4) 메서드 호출과 값 전달1

  • 자바는 항상 변수의 값을 복사해서 대입

(1) 변수와 값 복사

package method;

public class MethodValue0 {

    public static void main(String[] args) {
        int num1 = 5;
        int num2 = num1;
        num2 = 10;

        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
}
  • num1의 5가 num2 변수로 이동
  • 새로 변경된 num2값에 10을 대입. 즉, num1= 5, num2=10

(2) 메서드 호출과 값 복사

package method;

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);
    }

    public static void changeNumber(int num2) {
        System.out.println("2. changeNumber 변경 전, num2: " + num2);
        num2 = num2 * 2;
        System.out.println("3. ChangeNumber 변경 후, num2: " + num2);
    }
}
  • 설명
1. int num1 = 5

2. changeNumber 메서드에 매개변수 목록에 int num2라고 적혀있다.

3. changeNumber(num1) 이라는 것은 매개변수 목록인 
int num2에 num1을 대입한다는 것

4. 즉, num2는 5가 되고 2를 곱하였더니 10임.

5) 메서드 호출과 값 전달2

(1) 메서드 호출과 이름이 같은 변수

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);
    }
}
  • main 메서드의 number 변수와 changeNumber 메서드의 number 변수는 이름만 같지 그 안의 변수의 저장소는 다르다.
  • 그래서 호출했을때 number값은 10이 아닌 5가 호출.

(2) 메서드 호출과 값 반환받기

  • 값을 반환하려면 다음과 같은 코드를 작성한다.
package method;

public class MethodValue3 {

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

    public static int changeNumber(int num2) {
        num2 = num2 * 2;
        return num2;
    }
}
  • 즉, 두번째 changeNumber 메서드에 void를 선언하지 않고 반환 타입을 작성하면 main 메서드에서 받아온 파라미터 정보를 num2에 2를 곱한 정보를 리턴.
  • 그리고, 메인 메서드에 changeNumber(num1)값을 메인 메서드 num1에 대입
  • 그렇게하면, 메인 메서드의 num1은 10이 호출된다.
  • 중요
    자바는 항상 변수의 값을 복사해서 대입하자!

6) 메서드와 형변환

(1) 명시적 형변환

package method;

public class MethodCasting1 {

    public static void main(String[] args) {
        double number = 1.5;
        //printNumber(number);
        printNumber((int) number); // 명시적 형변환: double -> int
    }

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

(2) 자동 형변환

package method;

public class MethodCasting2 {

    public static void main(String[] args) {
        int number = 100;
        printNumber(number);

    }

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

정리

- 메서드를 호출할 때 전달하는 인수의 타입과 매개변수 타입이 일치해야함

7) 메서드 오버로딩

  • 메서드 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 오버로딩이라고 한다.
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)

(1) 오버로딩 규칙

  • 메서드 이름이 같아도 매개변수 타입 및 순서가 다르면 오버로딩 가능
  • 단, 반환 타입은 인정하지 않음
int add(int a, int b)
double add(int a, int b)
* 용어 정리 *
메서드 시그니처(Method Signature)
메서드 시그니처 = 메서드 이름 + 매개변수 타입(순서)
- 자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 뜻함.
- 즉, 메서드를 구분할 수 있는 기준
- 메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주함

정리

  • 본인의 타입에 맞는 최대한 맞는 메서드를 찾아 실행
  • 그래도 없다면 형 변환 가능한 타입의 메서드 실행

총 정리

1. 변수명 vs 메서드명
- 변수 이름은 일반적으로 명사로 씀. (Customer)
- 메서드 이름은 동사로 시작함. (addCustomer)

2. 메서드 사용 장단점
- 코드 재사용: 메서드는 특정 기능 캡슐화 가능. 필요할때마다 호출가능

- 코드의 가독성: 이름이 부여된 메서드는 코드가 수행하는 작업 명확하게 나타남

- 모듈성: 큰 프로그램을 작은, 관리 가능한 부분으로 나눌 수 있음.

- 코드유지관리: 메서드를 사용하면 해당 메서드에서만 수정을 할 수 있음.

- 재사용성과 확장성: 잘 설계된 메서드는 다른 프로그램이나 프로젝트에서도 재사용 가능
그리고, 새로운 기능을 추가하거나 기존 기능 확장가능

- 추상화: 메서드를 사용하는 곳에서는 메서드 구현 몰라도됨.

- 테스트와 디버깅 용이성: 개별 메서드는 독립적으로 테스트하고 디버그 가능
profile
IT 개발자가 되기 위한 기록

0개의 댓글