Java - Method

CYSSSSSSSSS·2024년 3월 1일
0

자바

목록 보기
9/26

Method

Method

시작

  • 1+2 와 10+20을 구하는 프로그램을 작성하시오
package method;

public class Method1 {
    public static void main(String[] args) {
        // 계산 1
        int a = 1;
        int b = 2;
        int sum = a + b;
        System.out.println(a + "+" + b + "=" + sum);

        // 계산 2
        int c = 10;
        int d = 20;
        int sum2 = c+d;
        System.out.println(c+ "+" + d + "=" + sum2);

    }
}
  • 여러 곳에서 같은 코드를 여러번 반복할 때 함수라는 매서드가 필요하다.
  • 계산1과 계산2 처럼 여러번 작성하는 것 유지 보수 하는데도 어려움을 많이 느낀다.

함수

  • 중복된 코드를 하나의 함수로 정의하여 재사용성을 용이하게 만들어야 한다.
  • 수학의 함수 개념과 똑같은 구조이다.

Method

  • 자바에서의 함수를 Method 라고 한다.
  • 위에 함수를 add라는 함수로 만들기
package method;

public class Method1Ref {
    public static void main(String[] args) {
        // 계산 1
        int sum1 = add(5 , 10); // 함수를 호출
        System.out.println("연산 결과: " + sum1);   // 연산 결과 리턴 
        System.out.println("===============================");


        // 계산 2
        int sum2 = add(10,20);
        System.out.println("연산 결과: " + sum2);
        System.out.println("===============================");
    }
    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)
  • 메서드의 선언 부분으로,메서드 이름 , 반환 타입 , 파라미터 목록을 포함한다.
  • 어떤 곳에서든 해당 메서드를 호출할 수 있다.
  • int a, int b은 매개변수(파라미터)라고 부른다.

public static

  • public : 다른 클래스에서 호출할 수 있는 메서드라는 뜻이다. 접근 제어에서 사용한다.
  • static : 객체를 생성하지 않고 호출할 수 있는 정적 메서드라는 뜻이다.

메서드 본문

{
        System.out.println(a + "+" + b + " 연산수행");
        int sum = a + b;
        return sum; // 계산 결과를 리턴
}
  • 메서드를 수행해야 하는 코드 블록
  • 메서드를 호출하면 코드 본문이 순서대로 실행한다.
  • 호출하는 곳에서 선언은 알지만 메서드 본문은 모를ㄴ다.
  • 메서드의 실행 결과를 return문을 사용하여 값을 리턴한다.
  • 메서드 리턴값은 선언시 반환 타입과 일치해야 한다.

메서드 호출 용어 정리

  • 메서드를 호출할 때 메서드에 넘기는 값과 파라미터의 타입이 맞아야 한다.
  • 추가적으로 넘기는 값과 파라미터의 순서와 개수도 맞아야 한다.
int call (String str , int age)
call("hello" , 20)
  • call로 선언한 매개변수는 String , int가 파라미터이다. 이때 call 을 호출할 때도 선언과 똑같은 자료형과 개수를 맞춰야 한다.

변수(Argument)

  • "hello" , 20 처럼 넘기는 값을 Argument 라고 한다.

매개 변수(Parameter)

  • 메서드를 선언할 때 선언한 변수를 말한다.
  • 인수를 매개 변수(파라미터)에 넘긴다.

메서드 정의

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

}

//제어자 반환 타입 메서드 이름(매개변수 목록){
//	메서드 본문 
//}
  • 제어자 : public,static
  • 반환 타입 : 메서드가 실행된 후 반환하는 데이터의 타입을 지정한다. 메서드가 반환되는 값이 없는 경우 void라는 아무것도 없음을 사용해야 한다.
  • 메서드 이름 : 메서드를 호출할 때 사용하는 이름이다.
  • 메서드 본문 : 실제 메서드의 코드들 이다.

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

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("프로그램을 종료합니다.");
    }
}
  • 매개변수가 없는 경우 인수를 비워 두고 선언하면 된다.
  • 매개변수를 호출 할때도 인수를 비워두고 호출하면 된다.
  • 반환 타입이 없는 경우 에는 void를 자료형으로 선언하면 된다.
  • 호출할 때도 반환 타입이 없으므로 메서드만 호출하고 반환 값을 받지 않으면 된다.
  • void일 경우 return문을 생략해도 된다.

반환 타입

  • 반환 타입이 있으면 반드시 값을 반환해야 한다.
  • 반환할 때 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;
        }
        // 만약 홀수가 아닐때 에는 return 자료형이 있기 때문에 오류가 발생한다.
        else{
            return false;
        }
    }
}
  • 만약 odd 함수에서 else 문이 존재하지 않으면 return문이 실행 안되기 때문에 컴파일 오류가 발생 한다.

  • return문을 만나면 반드시 메서드를 빠져 나간다.

  • 18살 미만인 경우: 미성년자 출입을 불가하고 18살 이상일 경우 입장 가능하다는 메서드를 작성하시오.

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; // void 이지만 return문을 만나면 자동으로 함수를 빠져 나온다.
        }else {
            System.out.println(age + "살은 입장하세요");
            return;
        }
    }
}
  • 위의 코드에서 조건문 안에 return을 사용하여 다른 조건을 실행하지 않고 바로 메서드를 빠져 나가는 것을 확인할 수 있다.

메서드 호출과 값 전달1

  • 자바에서 가장 중요한 대원칙중 하나는 "자바는 항상 값을 복사해서 대입"을 하는 구조이다.
package method;

public class MethodValue0 {
    public static void main(String[] args) {
        int num1 = 5;
        int num2 = num1; // 현재 코드에서 num1 = 5 , num2 = 5
        num2 = 10; // num2 = 10으로 변경
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
}
  • num1의 값을 읽어서 num2에 대입을 한다.
  • 이후에 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); // 5
        changeNumber(num1); // 5를 호출하여 넘김
        System.out.println("4.ChangeNumber 호출후 : " + num1); // 5
    }
    public static void changeNumber(int num2){
        System.out.println("2.ChangeNumber 변경전 : " + num2); // 곱하기 전에는 5
        num2 = num2  * 2;   //  곱한 후에는 10
        System.out.println("3.ChangeNumber 변경후 : " + num2);
    }
}
  • 함수를 호출했다고 해서 기존에 있는 변수가 증가하는 것이 아니다.
  • 이것이 값을 복사하여 대입 한다는 대원칙이 성립하는 구조이다.

메서드 호출과 값 전달 2

package method;

public class MethodValue2 {
    public static void main(String[] args) {
        int number = 5;
        System.out.println("1.changeNumber 함수 호출전 :" + number);  // 5
        changeNumber(number);
        System.out.println("4.changeNumber 함수 호출후 : " + number); // 5
    }
    public static void changeNumber(int number){
        System.out.println("2.changeNumber 변경 전 : " + number);  // 5
        number = number  * 2;    // 10
        System.out.println("3.changeNumber 변경 후 : " + number);  // 10

    }
}

값을 사용하기 위해서

  • 함수 호출 후 변경된 값을 return 으로 반환 받아야 한다.
package method;

public class MethodValue3 {
    public static void main(String[] args) {
        int num1 = 5;
        System.out.println("1.changeNumber 함수 호출전 :" + num1);  // 5
        num1 = changeNumber(num1);   // 호출할 때 number의 값을 복사해서 호출할 때 대입한다.
        System.out.println("2.changeNumber 함수 호출후 : " + num1); // 10
    }
    public static int changeNumber(int num2){
        num2 = num2 * 2;
        return num2;
    }
}
  • void 자료형이 아닌 반환 자료형을 지정해줘서 값을 바꿔야 한다.

메서드 형변환

  • 메서드를 호출할 때도 형변환이 적용된다. 메서드 호출과 명시적 형변환 , 자동 형변환 이 있다.

명시적 형변환

  • 메서드를 호출하는데 인자의 매개변수의 타입이 맞지 않을때 사용한다.
  • ex) 함수 매개변수가 int형인데 대입 인자(Argument)가 double형 일때
package method;

public class ModelCasting1 {
    public static void main(String[] args) {
        double number = 1.5;
        System.out.println("함수 호출전 : " + number);
        printNumber((int) number);  // 명시적 형변환 1.5 -> 1
    }
    public static void printNumber(int n){
        System.out.println("숫자 : " + n); //1
    }
}
  • 매개변수의 타입이 안맞을때는 형변환을 통해 처리해야 한다.
  • but 크기가 작은 자료형에서 큰 자료형에 대입 할때는 자동 형변환으로 처리된다.
package method;

public class ModelCasting2 {
    public static void main(String[] args) {
        int number = 100;
        printNumber(number);
    }
    public static void printNumber(double n){
        System.out.println("숫자: " + n);
    }
}
  • int -> double 로 자동 형변환이 진행된다.

메서드 오버로딩

  • 두 수를 더하는 메서드 , 세 수를 더하는 메서드를 만든다고 가정 할때
  • 자바에서는 이름은 같지만 매개 변수가 다른 메서드를 여러개를 정의 하는 것을 오버로딩 이라고 한다.
add(int a , int b) 
add(int x , int y , int z) 
add(double c , double d)  
  • 오버로딩에 한가지 규칙으로 반환 타입이 다른 것은 인정하지 않는다
double add(int a , int b) 
int add(int x , int y)

메서드 시그니처

  • 자바에서 메서드를 구분하는 고유한 식별자나 서명을 뜻하는 용어이다.
  • 메서드 이름 + 매개변수 타입
  • 매개변수 타입에는 매개변수의 선언의 순서도 포함이 된다.

매개 변수의 개수가 다른 오버로딩

package method.overloading;

public class OverLoading1 {
    public static void main(String[] args) {
        System.out.println("1번 함수: " + add(1,2));
        System.out.println("2번 함수: " + add(1,2,3));
    }
    public static int add(int a , int b){
        System.out.println("1번 함수 호출");
        return a + b;
    }
    public static int add(int a , int b , int c){
        System.out.println("2번 함수 호출");
        return a + b + c;
    }
}

매개 변수 타입이 다른 오버로딩

package method.overloading;

public class OverLoading2 {
    public static void main(String[] args) {
        myMethod(1, 1.2);
        myMethod(1.2 , 1);
    }
    public static void myMethod(int a , double b){
        System.out.println("1번 함수 호출 ");
        System.out.println("a: " + a  + " b: " + b);
    }
    public  static void myMethod(double a , int b){
        System.out.println("2번 함수 호출 ");
        System.out.println("a: " + a  + " b: " + b);
    }
}
package method.overloading;

public class OverLoading3 {
    public static void main(String[] args) {
        System.out.println(add(1,2));   // 1번 함수 호출
        System.out.println(add(1.1,2.2)); // 2번 함수 호출 
    }

    public static int add(int a , int b){
        System.out.println("정수형 수 더하기 ");
        return a + b;
    }
    public static double add(double a , double b){
        System.out.println("실수형 수 더하기");
        return a + b;
    }
}
  • 한가지 특징으로는 정수형 더하기 함수를 지운다 해도 같은 이름의 함수가 실행되기 때문에 문제 없이 실행할 수있다.
  • int -> double 이기 때문에 자동 형변환에도 문제가 발생하지 않는다.
profile
개발자 되고 싶어요

0개의 댓글

관련 채용 정보