메소드에 대한 이해와 메소드 정의

황상익·2023년 12월 15일

열혈 자바

목록 보기
5/30

메소드에 대한 이해와 메소드의 정의

Main 메소드에 대하여
이 메소드는 클래스의 내부에 존재
메소드의 이름은 – main
중괄호 내에 존재하는 문장들이 위에서 아래로 순차적 접근

다른 이름의 메소드
자바 프로그램은 main이라는 이름의 메소드에서부터 시작

public class Main1 {
    public static void main(String[] args) {
        System.out.println("프로그램 시작");
        hiEveryOne(12);
        hiEveryOne(14);
        System.out.println("프로그램 끝");
    }

    public static void hiEveryOne(int age){
        System.out.println("좋은 아침입니다");
        System.out.println("제 나이는" + age + "입니다");
    }
}

위 코드 내용은 메소드의 정의라고 한다.
오른쪽 소괄호 쪽에 보면 변수 age 설정 되어 있다.
메소드를 실행을 명령하는 문장을 가리켜 메소드 호출문 이라고 한다.
숫자는 변수 age에 전달 된다.
메소드 호출 시 전달되는 값을 받기 위해 선언된 변수를 매개변수 라고 한다.
메소드 호출 시 선언되어 전달 되는 값을 저장
매개변수가 선언된 메소드 내에서만 유효한 변수
정의된 메소드는 여러 번 호출 가능, 메소드의 정의 위치는 프로그램에 영향 X

public class Main2 {
    public static void main(String[] args) {
        double weight = 85.6;
        hi(12, 12.5);
        hi(13, weight);
        Hi();
    }

    public static void hi(int age , double weight){
        System.out.println("제 나이는" + age + "입니다");
        System.out.println("제 몸무게는" + weight + "입니다");
    }

    public static void Hi(){
        System.out.println("담에 뵙겠습니다");
    }
}

위 코드는 매개변수가 2개
메소드 호출문은 매개변수의 수와 자료형이 일치하는 값을 전달
전달이 불필요 할 경우, 생략 가능

<문제>

1.
public class Main3 {
    public static void main(String[] args) {
        Cal(7, 3);

    }

    public static void Cal(int a, int b) {
        System.out.println(a + b);
        System.out.println(a / b);
        System.out.println(a % b);
    }
}

2.
public class Main4 {
    public static void main(String[] args) {
        Cal(3, 7);
    }

    public static void Cal(int a, int b) {
        if (a < b) {
            System.out.println(Math.abs(a - b));
        }
    }
}

값을 반환하는 메소드
메소드 내에서 메소드를 호출한 영역으로 값을 전달 할 수 있다. 이를 값의 반환이라고 하는데

public class Main5 {
    public static void main(String[] args) {
        int result;
        result = adder(4, 5);
        System.out.println(result);
        System.out.println(square(3.5));
    }

    public static int adder(int num1, int num2) {
        int addResult = num1 + num2;
        return addResult;
    }

    public static double square(double num) {
        return num * num;
    }
}

main 왼편에는 void가 있는데 이는 값을 반환하지 않는다.
메소드의 이름 왼편에는 메소드가 반환하는 값의 자료형 정보를 삽입
& 메소드 반환 하는 값 x = void
Adder 메소드는 메소드 2군대 강조 중 -> 하나는 반환형, 다른 하나는 메소드 내에 존재하는 return 키워드
 값을 반환, addResult에 저장된 값을 반환

키워드 return이 지닌 두가지 의미
retrun문이 실행되면 메소드가 종료되어 값을 반환
메소드를 호출한 영역으로 값을 반환
메소드의 종료
즉) return문이 실행되면 값이 반환되면서 메소드의 실행은 종료
반환형이 void로 선언된 메소드 내에서도 값의 반환이 아닌 메소드의 종료 목적으로 return문을 사용 가능

public class Main7 {
    public static void main(String[] args) {
        divide(4,2);
        divide(6,2);
        divide(9,0);
    }

    public static void divide(int num1, int num2) {
        if (num2 == 0) {
            System.out.println("0으로 나눌 수 없습니다.");
            return;
        }

        System.out.println("나눗샘의 결과 :" + (num1 / num2));
    }
}
<문제> 
1.
public class Main8 {
    public static void main(String[] args) {
        System.out.println(r(3));
        System.out.println(size(9));
    }

    public static double r(int a) {
        double round = 0;
        round = 2 * a * 3.14;
        return round;
    }

    public static double size(int a) {
        double doubleSize = 0;
        doubleSize = a * a * 3.14;
        return doubleSize;
    }
}

변수의 scope
임의의 변수에 대한 변수의 접근 가능 영역 or 변수가 소멸되지 않고 존재 할 수 있는 영역
가시성
중괄호 사용 { … }
 If문 또는 if ~ else 문 사용
 Switch문
 메소드 몸체 부분을 감싸는 용도
중괄호 특정 영역을 감싸면 해당 영역은 변수에 대한 별도의 스코프를 형성

public class Main9 {
    public static void main(String[] args) {
        boolean ste = true;
        int num1 = 11;

        if (ste) {
            //int num1 = 22;
            num1++;
            System.out.println(num1);
        }
        {
            int num2 = 33;
            num2++;
            System.out.println(num2);
        }
        //System.out.println(num2);
    }
}

num 변수는 중괄호 내에서만 접근이 가능, 중괄호 벗어나는 순간 소멸되어 접근 불가능
num1은 main 메소드의 중괄호 영역
num1은 main 메소드 이후로 따로 선언 할 수 없다.
중괄호를 이용해서 별도의 영역을 형성 가능 -> num2는 이 영역에서만 접근 가능

for (int num = 0; num < 5; num++) {

}
public static void myFunc(int num){

}
중괄호 내에 선언된 변수들을 가리켜 지역변수라고 한다. 그리고 for문의 초기화 부분에 선언되는 변수와 매개변수 까지도 지역변수 범주 내에 포함된다.
즉) 지역변수는 선언된 지역을 벗어나면 소멸 된다고 본다. => 메모리 내에서 삭제
메소드의 재귀호출
재귀는 Recursion이라고 한다.

public class Main10 {
    public static void main(String[] args) {
        System.out.println("3 factorial =" + factorial(3));
    }

    public static int factorial(int n){
        if (n==1)
            return 1;
        else
            return n * factorial(n-1);
    }
}

f(n) = -> 1 (n = 1)
if (n==1)
return 1;

f(n) = -> n f (n – 1) (n >=2)
else
return n
factorial(n-1);
}
n이 1이 될 때까지 반복적으로 호출
다시 말하자면 factorial이 다시 호출되면 하나의 복사본이 생기고 다시 또 생기고 n =1 이 될 때 까지 반복된다.
 바이트 코드 복사본
메소드 호출시 해당 메소드의 바이트 코드 전체에 대한 복사본이 만들어지는 것은 아니다. 그러나 메모리 공간에 저장된 메소드의 바이트 코드가 부분적으로 복사되어 이동되는 것은 사실
재귀 메소드의 호출을 이해하는 과정에서는 메소드의 복사본이 생성된다고 봐도 괜찮다.

잘못된 재귀 메소드의 정의 (종료 조건이 없음)
 스스로 종료 할 수 없음 (Ctrl + C을 입력하면 종료 가능)

<문제>
1.
public class Main12 {
    public static void main(String[] args) {
        for (int i = 1; i < 101; i++) {
            if (PrimeNum(i)){
                System.out.println("i = " + i);
            }
        }
    }

    public static boolean PrimeNum(int num) {
        if (num == 1){
            return false;
        }

        for (int i = 2; i < num; i++) {
            if (num % i == 0){
                return false;
            }
        }
        return true;
    }
}

2.
public class Main13 {
    public static void main(String[] args) {
        System.out.print(change(51));
    }

    public static int change(int n) {
        if (n > 0) {
            int bin = n % 2; //값이 1또는 0
            n /= 2;

            change(n); //다시 n을 2로 나누는 과정을 반복, 몫이 0이 될떄까지
            System.out.print(bin);
        }
        return 0;
    }
}
profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글