본문 바로가기
Programming/Java

Java 메소드와 변수의 스코프

by Tarake 2024. 8. 1.

메소드 혹은 함수


메소드란?


public static void myFunc1(String name, int age) {
    System.out.println("안녕하세요 제 이름은 " + name + " 입니다.);
    System.out.println(age + "살 입니다.");
}

public static void main(String[] args) {
    myFunc1("hyun", 20);
    myFunc1("kim", 25);
    
    System.out.println(myFunc2(10));
}

public static int myFunc2(int age) {
    return age * 10;
}

메소드는 C언어에서는 함수라고 불리며 자바에서는 메소드라 불립니다.

  • 메소드를 작성하는 것을 메소드 정의라고 합니다.
  • main 에 존재하는 myFunc("hyun")은 메소드를 실행을 명령하는 문장으로 이를 메소드 호출문이라고 합니다.
  • 소괄호에는 "hyun"이라는 문자열이 존재하는데 이렇게 메소드를 호출할 때 값을 전달하는 것을 매개변수라고 합니다.

메소드는 클래스 내부에 정의된 함수로, 객체의 행동을 정의합니다. 메드는 특정 작업을 수행하며, 입력값(매개변수)을 받아 결과를 반환할 수 있습니다.

그리고 메소드는 여러 번 호출이 가능하며 메소드의 위치는 어디에 작성하나 프로그램에는 큰 영향은 없습니다.

그리고 매개변수는 여러 개로 정의할 수 있습니다. 매개변수는 자료형이 일치하는 값을 전달해야합니다.

메소드는 값을 반환할 수 있습니다.


public static int myFunc2(int age) {
    return age * 10;
}

public static void main(String[] args) {
    myFunc1("hyun", 20);
    myFunc1("kim", 25);
    
    System.out.println(myFunc2(10));
}

 

메소드는 값을 반환할 수 있습니다. 반환하는 자료형에 맞게 void 위치에 자료형을 작성하고 반환시 return문을 작성하면 됩니다.

  • void는 값을 반환하지 않겠다는 뜻으로 이 경우에는 return 문을 쓰지 않아도 됩니다.
  • 값을 반환할 경우에는 String, int, double 등의 자료형을 작성해야 합니다.

RETURN 문의 의미


public static void myFunc1() {
    return;
}

public static int myFunc2() {
    return 10;
}

 

  • 첫 번째 의미는 break문이 반복문을 탈출하듯이 메소드를 탈출 즉 종료하라는 의미입니다.
  • 두 번째 의미는 호출된 메소드에서 값을 반환할 때 사용합니다.

 

변수의 스코프


public static void main(String[] args) {
    int n = 1;
    System.out.println(n);
    {
        int m = 2;
        System.out.println(m);
        System.out.println(n);
    }
    // System.out.println(m); 오류 발생
}

변수를 선언한 위치에 따라 총 4가지로 불립니다.

  1. 클래스 변수 (static variable)
  2. 인스턴스 변수 (instance variable)
  3. 지역 변수(local variable)
  4. 매개 변수(parameters)

클래스 변수


class Main {
    static int a = 4;
}
  • 정의 : 클래스 수준에서 공유됩니다. 모든 객체가 같은 클래스 변수를 공유합니다.
  • 스코프 : 클래스 내부 어디서나 접근할 수 있으며, 클래스의 모든 인스턴스에서 동일한 값을 유지합니다. 클래스가 메모리에 로드될 때 생성되고 프로그램 종료 시까지 존재합니다.

인스턴스 변수


class Main {
    int a = 4;
}
  • 정의 : static 키워드 없이 클래스 내에서 선언된 변수로, 클래스의 각 인스턴스에 대해 고유한 값을 가집니다.
  • 스코프 : 클래스 내 모든 메소드에서 접근할 수 있으며, 객체가 생성될 때 생성되고, 객체가 더 이상 참조되지 않을 때 가비지 컬렉션에 의해 제거됩니다.

 

지역 변수


class Main {
    public static void main(String] args) {
        int a = 4;
    }
}
  • 정의 : 지역 변수는 메소드 내에서 선언된 변수로, 해당 메드 내에서만 접근할 수 있습니다.
  • 스코프 : 변수가 선언된 블록(중괄호 {}) 내에서만 유효하며, 블록이 끝나면 제거됩니다.

매개 변수


class Main {
    public void myFunc(int n){
        System.out.println(n);
    }
}
  • 정의 :  매개변수는 메소드 선언 시 정의되는 변수로, 메소드 호출 시 전달되는 인자를 받습니다.
  • 스코프 : 메소드 내에서만 유효하며, 메소드가 호출될 때 초기화되고 메드 실행이 끝나면 제거됩니다.

변수 스코프의 주의 사항


public class MyClass {
    int x = 10; // 인스턴스 변수

    public void setX(int x) { // 지역 변수
        this.x = x; // 인스턴스 변수 x에 지역 변수 x의 값을 할당
    }
}

지역 변수의 이름이 인스턴스 변수와 같은 경우, 지역 변수가 우선합니다. 이럴 때는 this 키워드를 사용하여 인스턴스 변수를 참조할 수 있습니다.

 

메소드 재귀호출


팩토리얼


public class Factorial {
    // 재귀를 이용한 팩토리얼 계산
    public static int factorial(int n) {
        if (n == 0) {
            return 1; // 기본 사례
        } else {
            return n * factorial(n - 1); // 재귀 사례
        }
    }

    public static void main(String[] args) {
        int number = 5;
        int result = factorial(number);
        System.out.println(number + "! = " + result); // 5! = 120
    }
}

재귀 호출은 함수(또는 메드)가 자기 자신을 호출하여 반복적으로 작업을 수행하는 프로그래밍 기법입니다.

재귀호출의 작동방식은

  • 기본 사례(Base Case): 재귀 호출을 멈추는 조건을 정의합니다. 기본 사례가 없다면, 함수는 무한히 자기 자신을 호출하여 결국 스택 오버플로(stack overflow) 에러가 발생할 수 있습니다.
  • 재귀 사례(Recursive Case): 함수가 자기 자신을 호출하는 부분입니다. 이 부분에서는 문제를 점점 더 작게 나누어 기본 사례에 도달하게 만듭니다.

실행이 완료되지 않은 메소드를 다시 호출 가능한 이유는 메소드의 복사본을 생성해서 실행하기 때문입니다.

 

출처

W3school

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

'Programming > Java' 카테고리의 다른 글

정보 은닉과 캡슐화  (1) 2024.08.02
클래스와 생성자  (0) 2024.08.02
실행 흐름의 컨트롤  (0) 2024.08.01
연산자(Operators)  (0) 2024.08.01
Java 변수의 형변환  (0) 2024.07.28