(개인공부) -Java (메서드)

짜스의 하루 ·2024년 1월 24일

메서드의 시작

두 숫자를 입력을 받아서 더하고 출력하는 단순한 기능을 개발

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

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

잘 살펴보면, 같은 연산이 두 번 실행이 되는 것을 볼 수 있다

함수(function)

  • 함수 정의
    add(a,b) = a+b;
    이름이 add고 a,b라는 두 값을 받는 함수이며 a + b 연산을 수행한다.

  • 함수 사용
    add(3,2) 결과 : 5
    add(5,6) 결과 : 11

  • 함수에 값을 입력하면, 함수가 가진 연산을 처리한 다음 결과를 출력, 단순히 a+b라는 연산을 수행
  • 여러번 같은 계산을 해야 한다면 지금처럼 함수를 만들어두고(정의), 필요한 입력 값을 넣어서 해당 함수를 호출하면 된다. 그러면 계산된 결과가 나온다.

메서드 사용

자바에서는 함수를 메서드라고 한다.
int sum 1 = add (5,10);
System.out.println("결과1 출력: " + sum1);

int sum 2 = 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;

메서드의 정의

public static int add(int a, int b);
System.out.println(a +"+" + b + " 연산 수행");
int sum = a + b;
return 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) = 메서드를 호출할 때 전달되는 입력 값을 정의, 이 변수들은 메서드 안에서만 사용, 메서드 안에서 사용되는 변수를 파라미터, 매개변수 라고 함.

메서드 본문

System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum

  • 메서드가 수행해야 하는 코드 블록
  • 메서드를 호출하면 메서드 본문이 순서대로 실행
  • 메서드의 실행 결과를 반환하려면 return문을 사용해야 함. return문 다음 반환할 결과를 적어주면 된다
    즉, return sum: sum 변수에 들어있는 값을 반환한다는 의미

메서드 호출

int sum1 = add (5,10);
int sum2 = add (15,20);

  • 메서도 호출하면 어떻게 실행되는지 순서대로 확인해보자
    int sum1 = add(5,10); // add라는 메서드를 숫자 5,10을 전달하면서 호출
    int sum1 = 15; //add(5, 10)이 실행된다. 실행 결과는 반환 값은 15이다.
    //sum1에 15 값이 저장된다
  • 메서드를 호출하면 메서드는 계산을 끝내고 결과를 반환한다. 쉽게 이야기 하면, 메서드 호출이 끝나면 해당 메서드가 반환한 결과 값으로 치환한다.

메서드 호출과 용어 정리

메서드를 호출할 때, 메서드에 넘기는 값과 매개변수의 타입이 맞아야 된다.
또한 넘기는 값과 파라미터의 순서와 갯수도 맞아야 한다!

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

  • 인수(Argument)
  • 여기서 hello, 20처럼 넘기는 값을 아규먼트, 인수, 인자 라고 한다
  • 매개변수(Parameter)
  • 메서드를 정의할 때 선언한 변수인 String str, int age 를 매개변수, 파라미터라고 한다
  • 매서드를 호출할 때 인수를 넘기면, 그 인수가 매개변수에 대입된다.
  • 용어정리
    인수라는 메서드 내부로 들어가는 값을 의미
    매개변수, parameter는 메서드 호출부와 메서드 내부 사이에서 값을 전달하는 역할을 하는 변수라는 뜻이다

메서드 정의

public static int add(int a, int b){
//메서드 본문, 실행코드
}
제어자 반환타입 메서드 이름 (매개변수 목록){
메서드 본문
}

  • 제어자 : public, static과 같은 부분
  • 반환 타입: 메서드가 실행된 후 반환하는 데이터 타입을 지정, 메서드가 값을 반환하지 않는 경우, void를 사용해야 한다!!
  • 메서드 이름 : 메서드의 이름, 메서드를 호출할 때 사용
  • 매개변수 : 입력 값으로, 메서드 내부에서 사용할 수 있는변수, 매개변수는 옵션이라 입력값이 없는 페서드는 매개변수를 지정하지 않아도 됌
  • 메서드 본문: 실제 메서드의 코드가 위치, 중괄호 {} 사이에 코드를 작성

매개변수가 없건, 반환타입이 없는 경우

printHeader();
printFooter();

public static void printHeader(){
	System.out.println("=프로그램을 시작합니다=");
    return; // void경우 생략 가능
}

public static void printFooter(){
	System.out.println("=프로그램을 종료합니다=");
    return;
  • printHeader(), printFooter() 메서드는 매개변수도 없고, 반환타입도 없다!

  • 매개변수가 없는 경우,

  • 선언: public static void printHeater() 와 같이 매개변수를 비워두고 정의하면 된다.
  • 호출: printHeader(); 와 같이 인수를 비워두고 호출하면 된다
  • 반환타입이 없는 경우
  • 선언 : pubilc static void printHeader()와 같이 반환 타입을 void로 정의하면 된다.
  • 호출: printHeader();와 같이 반환 타입이 없으므로 메서드만 호출하고 반환 값을 받지 않으면 된다.
  • void일 때, return 생략
  • 모든 메서드는 항상 return을 호출해야 한다.
    하지만, 반환 타입이 void의 경우 생략해도 된다!

반환 타입

반환 타입이 있으면, 반드시 값을 반환해야 한다
--> 반환 타입이 있는 메서드는 반드시 return을 사용해서 값을 반환해야 한다.

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;
    }
 }
} 
  • if문을 만족 할 때에는 true가 반환되지만, 만족하지 않을 때에는? return문이 실행되지 않는다!

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

  • 이렇게 수정하면 if 조건을 만족하지 않아도 else를 통해 return문이 실행된다.

return문을 만나면 그 즉시 메서드를 빠져나간다!

  • 메서드를 한 번 만들어보자
  • 18살 미만의 경우 : 미성년자는 출입이 불가능합니다.
  • 18살 이상의 경우 : 입장하세요.
public static void main(String[] args) {
	checkAge(10);
    cheakAge(20);
}

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

	System.out.println(age + "살, 입장하세요);	
    }
}  
  • 18세 미만의 경우 "미성년자는 출입이 불가능합니다"를 출려갛고 바로 return문이 실행, 따라서 다음 로직을 수행하지 않고, 해당 메서드에서 바로 빠져나온다
  • 18세 이상의 겨우, "입자하세요"를 출력하고, 메서드를 종료한다
    --> 반환 타입이 없는 void형이기 때문에 마지막 줄의 return은 생략이 가능하다 !!

메서드 호출과 값 전달 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 = 10

<실행과정>
int num2 = num1; //num1의 값은 5이다. num(5)
int num2 = 5;// num2 변수에 대입하기 전에 num1의 값 5를 읽는다. num1(5), num2(5)
num2 = 10; num2에 10을 대입한다

  • 결과 : num1(5), num2(10)

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

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

<실행결과>
1. changeNumber 호출 전, number: 5
2. changeNumber 변경 전, number: 5
3. changeNumber 변경 후, number: 10
4. changeNumber 호출 후, number: 5

  • main()또한 메서드 이므로, 각각의 메서드 안에서 사용하는 변수는 서로 완전히 분리되는 다른 변수, 이름이 같아도 완전히 다른 변수이다.
  • 따라서 main()의 number와 changeNumber()의 number는 서로 다른 변수이다.

메서드 호출과 값 반환 받기

메서드를 사용해서 값을 변경하려면?

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

	public static int changeNumber (int num2){
		num2 = num2 * 2;
		return num2;
}
  • 실행결과
    changeNumber 호출 전, num1 = 5
    changeNumber 호출 후, num2 = 10

  • 실행 과정
    num1 = changeNumber(num1); //num1(5)
    num1 = changeNumber(5);

//호출 시작:changeNumber()
//num1의 값 5가 num2에 대입된다. num1의 값을 num2에 복사한다. num1(5), num2(5)
int changeNumber(int num2=5)
num2 = num2 * 2; //계산 결과: num1(5), num2(10)
return num2; // num2의 값은 10이다.
return 10;
//호출 끝: changeNumber()
num1 = changeNumber(5);//반환 결과가 10이다.
num1 = 10;//결과: num1(10)

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


메서드와 형변환

명시적 형변환

double number = 1.5;
printNumber(number); //double을 int형에 대입하므로 컴파일 오류
printNumber((int)number); //명시적 형변환을 사용해 double을 int로 변환

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

  • 명시적 형변환
    printNumber((int) number); // 명시적 형변환을 사용해 double을 int로 변환
    printNumber(1); // (double) 1.5 -> (int) 1로 변환
    void printNumber(int n=1) //int형 파라미터 변수 n에 int형 1을 대입

자동 형변환

int < long < double

int number = 100;
printNumber(number)

public static void printNumber(double n){
System.out.println("숫자 : " + n);
}
  • double형 매개변수에 int형 인수를 전달하는데 문제없이 잘 작동함.

  • 실행결과 숫자 : 100.0

  • 자동 형변환
    printNumber(number); // number는 int형 100
    printNumber(100); //메서드를 호출하기 전에 number 변수의 값을 읽음
    void printNumber(double n=100) //double형 파라미터 변수 n에 int형 값 100을 대입
    void printNumber(double n=(double) 100) //double이 더 큰 숫자 범위이므로 자동 형변환 적용
    void printNumber(double n=100.0) //자동 형변환 완료

메서드 오버로딩

  • 두 수를 더하는 메서드
  • 세 수를 더하는 메서드

<오버로딩 성공>
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)

이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 메서드 오버로딩이라고 함.
같은 이름으로 메서드를 여러개 정의했다고 이해하면 됌

오버로딩 규칙

메서드의 이름이 같아도, 매개변슈의 타입 및 순서가 다르면 오버로딩할 수 있다.
단, 반환타입은 인정하지 않는다.

<오버로딩 실패>
int add(int a, int b)
double add(int a, int b)

<오버로딩 실패>
int add(int a, int b)
int add(int c, int d)

메서드 시그니처 = 메서드 이름 + 매개변수 타입(순서)

이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주, 반환타입은 시그니처에 포함되지 않음. 위에 두 메서드를 살펴보면, add(int a, int b)로 메서드 시그니처가 같다. 따라서 메서드의 구분이 불가능하므로 오류 발생

예제 1)
//첫번째 add 메서드 : 두 정수를 받아서 합을 반환한다.
public static int add(int a, intb){
System.out.println("1번 호출");
return a + b;
}
//두번째 add 메서드 : 세 정수를 받아서 합을 반환한다.
//첫번째 메서드와 이름은 같지만, 매개변수 목록이 다르다!
public static int add(int a, int b, int c){
System.out.println("1번 호출");
return a + b+ c;
}

1: 정수 1,2를 호출했으므로 add(int a, int b) 가 호출된다.
2: 정수 1,2,3을 호출했으므로 add(int a, int b, int c) 가 호출된다

예제 2) - 매개변수의 타입이 다른 오버로딩
public static void myMethod(int a, double b){
System.out.println("int a, double b");
}
public static void myMethod(double a, int b){
System.out.println("double a, int b");

1: 정수1, 실수 1.2를 호출했으므로 myMethod(int a, double b) 가 호출된다.
2: 실수 1.2, 정수 2를 호출했으므로 myMethod(double a, int b) 가 호출된다

예제 3)
//첫번째 add 메서드 : 두 정수를 받아서 합을 반환한다.
public static int add(int a, int b){
System.out.println("1번 호출");
return a+b;
}
// 두번째 add 메서드 : 두 실수를 받아서 합을 반환한다.
// 첫번째 메서드와 이름은 같지만, 매개변수 유형이 다르다 !
public static double add(double a, double b){
System.out.println("2번 호출");
return a+b;
}

1: 정수1, 정수 2를 호출했으므로 add(int a, int b) 가 호출된다.
2: 실수 1.2, 실수 1.5를 호출했으므로 add(double a, double b) 가 호출된다.


정리

변수명 vs 메서드명

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

  • 변수명 예) custmorName, totalSum, employeeCount, isAvailavle
  • 메서드 명 예) printReport(),caculateSum(), addCustomer(), getEmployeeCount()

메서드 사용의 장점

  • 코드 재사용: 메서드는 특정 기능을 캡슐화 하므로, 필요할 때마다 그 기능을 다시 작성할 필요가 없이 해당 메서드를 호출함으로써 코드를 재사용할 수 있음
  • 코드의 가독성 : 이름이 부여한 메서드는 코드가 수행하는 작업을 명확하게 나타나므로, 코드를 읽는 사람에게 추가적인 문맥을 제공
  • 모듈성: 큰 프로그램을 작은, 관리 가능한 부분으로 나눌 수 있음 이는 코드의 가독성을 향상시키고, 디버깅을 쉽게 만든다
  • 코드 유지 관리: 메서드를 사용하면, 코드의 특정 부분에서 문제가 발생하거나 업데이트가 필요한 겨우 해당 메서드만 수정하면 됌
  • 재사용성과 확장성: 잘 설계된 메서드는 다른 프로그램이나 프로젝트에서도 재사용할 수 있으며, 새로운 기능을 추가하거나 기존 기능을 확장하는 데 유용
  • 추상화 : 메서드를 사용하는 고세서는 메서드의 구현을 몰라도 됌.
  • 테스트와 디버깅 용이성: 개별 메서드는 독립적으로 테스트하고 디버그할 수 있다. 이는 코드의 문제를 신속하게 찾고 수정하는 데 도움이 됌.
profile
2024. 01. 02 ~ 백앤드 공부 시작, 2024. 04.01 ~ 프론트 공부 시작

0개의 댓글