[Java 기초] 9. 자바의 메서드(Method)와 스코프(Scope)

Kyung Jae, Cheong·2024년 8월 12일
0
post-thumbnail
  • 최대한 기초가 거의 없는 분들의 입장에서 정리해본 내용이므로, 어려운 개념들은 가급적 포함시키지 않거나 최대한 간단하게만 표현하였습니다.
  • Java 세팅 및 실습은 Windows 환경에서 IntelliJ를 통해 진행되었습니다.
  • (참고) IntelliJ 코드 실행 단축키
    • Windows, Linux : Shift+F10
    • MacOS : Ctrl+R

9. 자바의 메서드(Method)와 스코프(Scope)

  • 자바의 메서드는 코드의 재사용성과 가독성을 높이는 중요한 구조입니다.
  • 또한, 메서드 내에서 사용되는 변수의 스코프(scope)는 메서드의 동작에 큰 영향을 미칩니다.
  • 이번에는 자바의 메서드와 변수의 스코프에 대해 정리하겠습니다.

9-1. 메서드(Method)

  • 메서드는 특정 작업을 수행하는 코드 블럭(block)을 의미입니다.
    • 메서드를 정의하고 호출함으로써 반복적인 작업을 보다 효율적으로 처리할 수 있습니다.
  • 자바에서 모든 메서드는 클래스 내에 정의되며, 객체의 행동을 정의하거나 유틸리티 기능을 제공합니다.
    • 클래스에 관해선 내용이 상당하고 어려워서 기초가 아닌 중급 과정에서 다루어볼 예정입니다. 아무튼 클래스의 블럭 안에서 메서드가 정의된다고 생각하시면 됩니다.
  • 다른 프로그래밍 언어나 수학에서는 이를 함수(function)이라 하는데, 자바에서는 이를 메서드(Method)라 부릅니다. (사실 혼용해서 쓰이기도 합니다..)

9-1-1. 메서드의 정의

  • 메서드는 다음과 같은 형식으로 정의하게 됩니다.
[접근 제어자] [반환 타입] 메서드 이름([매개 변수]) {
    // 메서드의 실행 코드
    [return 반환 값]; // 반환 타입이 void가 아닐 경우 반환 값 필요
}
  • 여기서 접근 제어자는 나중에 따로 다뤄야할 내용이라서 이런게 있구나 생각하시면 되고, 지금 단계에서는 public static 혹은 public으로 앞에 붙여주시면 됩니다.
  • 정말 중요한건 반환 타입메서드 이름, 그리고 매개 변수입니다.
    • 특히 밑에서 다시 다루겠지만, 메서드 이름매개 변수는 메서드 시그니처(Method Signature)라 해서 메서드를 구분하는 고유한 이름으로 동작하기 때문에, 매우 중요합니다.

메서드 정의 예시

public class Example {
    
    // 반환 타입이 없는 메서드 (void)
    public void greet() {
        System.out.println("Hello, World!");
    }

    // 반환 타입이 있는 메서드 (int)
    public int add(int a, int b) {
        return a + b;
    }
}
  • 여기서 반환타입은 두가지로 분류할 수 있습니다.
    • void : 반환 타입이 없는 메서드입니다. 이렇게 정의한 메서드는 아무런 타입을 반환하지 않아야하기 때문에, return구문을 붙이지 않거나 return;로 문장을 마무리해주셔야합니다. (생략이 가능하다는 의미입니다 !)
    • Type : int, double, String, 등 메서드를 통해 반환할 타입을 명시하는 경우입니다. 이렇게 정의한 메서드에서는 반드시 지정한 형식에 맞는 return 구문을 명시해주어야합니다. (생략하시면 안됩니다 !)
      • 물론 자동 형변환이 가능한 경우엔 오류가 발생하지는 않습니다.

9-1-2. 메서드 호출

  • 정의한 메서드를 다른 곳에서 호출할 때는 메서드 이름과 함께 괄호()를 사용하여 호출합니다.
메서드이름([인수])
  • 정의할때는 괄호 안에 들어가는 변수를 매개변수(Parameter)라하고, 이를 호출할때는 인수(Argument)라 부릅니다.
    • 매개변수의 타입과 인수의 타입은 자동형변환이 되는 경우를 제외하고 서로 동일해야합니다.

메서드 호출 예시

public class Main {
    public static void main(String[] args) {
        Example example = new Example(); // 객체 생성
        example.greet();                 // 메서드 호출
        int sum = example.add(5, 10);    // 메서드 호출과 반환 값 사용
        System.out.println("Sum: " + sum);
    }
}

9-1-3. 메서드의 구성 요소 정리

  • 접근 제어자: 메서드의 접근 범위를 결정합니다. (예: public, private, protected, default(명시적 키워드 없음))
    • 지금 단계에선 이런게 있구나 정도로 넘어가시면 됩니다.
  • 반환 타입: 메서드가 반환하는 값의 타입입니다.
    • 반환할 값이 없으면 void를 사용합니다.
  • 메서드 이름: 메서드를 호출할 때 사용하는 이름입니다.
    • 관례적으로 일반적인 변수와 마찬가지로 소문자로 시작하며, 카멜 표기법(camelCase)을 사용합니다.
  • 매개 변수(Parameter): 메서드가 호출될 때 전달받는 입력값입니다.
    • 필요에 따라 여러 개의 매개 변수를 가질 수 있습니다.
  • return 문: 메서드가 실행된 결과를 반환합니다.
    • 반환 타입이 void가 아닌 경우 필수적으로 사용됩니다.
  • 인수(Argument): 메서드를 호출할 때 메서드에 전달해줄 입력값입니다.
    • 자동형변환이 되는 경우를 제외하고 매개변수와 서로 타입이 동일해야합니다

9-1-4. 메서드 오버로딩(Method Overloading)

  • 메서드 오버로딩은 같은 이름의 메서드를 여러 개 정의할 수 있는 기능입니다. 단, 매개 변수의 타입이나 개수가 달라야 합니다.
    • 앞서 설명한대로 메서드 이름이 같아도 매개 변수의 타입이나 개수가 다르면, 다른 메서드로 인식하게 됩니다.
    • 이러한 기능을 이용해서 같은 이름의 메서드를 여러 개 정의할 수 있게 됩니다.

메서드 오버로딩 예시

public class Example {

    // 매개변수의 타입이 다름
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    // 매개변수의 개수가 다름
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}
  • 이때 반환 타입은 메서드 구분에 포함되지 않습니다.
    • 오직 메서드 이름메서드 매개변수로 구분됩니다!

9-1-참고. 재귀 메서드(Recursive Method)

  • 메서드가 자기 자신을 호출하는 방식을 재귀(Recursion)라고 합니다.
    • 재귀는 문제를 작게 나누어 처리할 때 유용하지만, 잘못 사용하면 무한 루프에 빠질 수 있습니다.
    • 그래서 지금 단계에선 이런게 있구나 정도로 넘어가시면 될듯 합니다.

재귀 예시

public class Example {

    // 재귀 메서드 - 팩토리얼 계산
    public int factorial(int n) {
        if (n <= 1) {
            return 1;
        } else {
            return n * factorial(n - 1);
        }
    }
}

9-2. 메서드와 변수의 스코프(Scope)

  • 메서드 내에서 사용되는 변수의 사용 가능 범위는 변수의 선언 위치에 따라 결정되는데, 이때 변수가 유효한 범위를 변수의 스코프(Scope)라고 합니다.
    • 쉽게 말하면, 선언된 변수의 생존 가능 범위라고 볼수 있습니다.
  • 자바에서 변수의 스코프는 사용 가능 범위에 따라 네 가지로 나누어 볼 수 있습니다:
    • 지역 변수(Local Variables)
    • 매개 변수(Parameters)
    • 인스턴스 변수(Instance Variables)
    • 클래스 변수(Class Variables).

9-2-1. 지역 변수(Local Variables)

  • 메서드 내부에서 선언된 변수입니다.
    • 해당 메서드 내에서만 접근 가능하며, 메서드가 종료되면 메모리에서 사라집니다.
  • 스코프(Scope) : 변수가 선언된 블록 내.

지역변수 예시

public void exampleMethod() {
    int localVariable = 10; // 지역 변수(Local Variables)
    System.out.println(localVariable); // 메서드 내에서 사용 가능
}
// 여기서는 localVariable을 사용할 수 없음

9-2-2. 매개 변수(Parameters)

  • 지역변수와 유사하지만, 메서드의 입력값으로 전달되는 변수를 의미합니다.
    • 메서드 내부에서만 사용 가능하며, 메서드가 종료되면 사라집니다.
  • 스코프(Scope) : 메서드 내부

매개변수 예시

public int add(int a, int b) { // a, b는 매개 변수
    return a + b; // 메서드 내부에서만 사용 가능
}
  • 메서드를 호출하여 전달하는 경우엔, 인수(Argument)라 부릅니다.

9-2-3. 인스턴스 변수(Instance Variables)

  • 클래스에 선언된 변수로, 클래스의 인스턴스가 생성될 때마다 할당됩니다.
    • 클래스 내의 모든 메서드에서 접근 가능하며, 객체가 존재하는 동안 유효합니다.
  • 지금 단계에서는 이런게 있구나 정도로 넘어가시면 됩니다.
  • 스코프(Scope) : 클래스 내에서 사용 가능

인스턴스 변수 예시

public class Example {
    int instanceVariable; // 인스턴스 변수

    public void setVariable(int value) {
        instanceVariable = value; // 클래스 내 모든 메서드에서 사용 가능
    }

    public int getVariable() {
        return instanceVariable; // 클래스 내 모든 메서드에서 사용 가능
    }
}

9-2-4. 클래스 변수(Class Variables)

  • static 키워드를 사용하여 선언된 변수입니다.
    • 클래스 로드 시점에 한 번만 생성되며, 모든 인스턴스가 공유합니다.
    • 프로그램이 종료될 때까지 유지됩니다.
  • 지금 단계에서는 이런게 있구나 정도로 넘어가시면 됩니다.
  • 스코프(Scope) : 클래스 내에서 사용 가능

클래스 변수 예시

public class Example {
    static int classVariable; // 클래스 변수

    public static void setVariable(int value) {
        classVariable = value; // 클래스 내 모든 메서드에서 사용 가능
    }

    public static int getVariable() {
        return classVariable; // 클래스 내 모든 메서드에서 사용 가능
    }
}

9-3. 메서드의 스코프와 변수의 유효 범위

  • 메서드 내부의 지역 변수 스코프
    • 지역 변수는 메서드 내에서만 유효합니다. 메서드가 종료되면 지역 변수는 더 이상 사용할 수 없습니다.
    • 지역 변수는 메서드 호출 시마다 새로 생성되며, 호출이 끝나면 메모리에서 해제됩니다.
  • 메서드와 인스턴스 변수의 상호작용
    • 메서드는 인스턴스 변수에 접근하고 이를 수정할 수 있습니다. 인스턴스 변수는 메서드 외부에서도 접근 가능하며, 객체가 존재하는 동안 유지됩니다.
  • 클래스 변수와 메서드
    • 클래스 변수는 static 키워드를 사용하여 선언되며, 클래스 자체에 속합니다. 클래스 변수는 모든 객체에서 공유되며, 클래스가 로드된 시점부터 프로그램이 종료될 때까지 유지됩니다.
    • static 메서드는 클래스 변수에 직접 접근할 수 있으며, 인스턴스 변수에는 접근할 수 없습니다.
  • 지금 단계에선 이해가 어려운 개념들입니다. 추후에 다시 정리해볼 예정입니다.

마무리

  • 본 포스팅까지해서 자바의 기초적인 개념들과 예제들을 정리해보았습니다.
    • 이해가 되지 않는 개념들이 많이 있더라도, 추후에 더 상위 개념들도 배워서 다시 복습하거나 다양한 코드들을 작성하시다보면 자연스럽게 이해가 되실 수 있으실 거라 봅니다.
  • 자바를 처음 접하시는 분들에게 저의 글들이 많은 도움이 되셨길 바라며, 이후의 포스팅에서는 자바의 클래스(Class)에 대해서 방대한 내용들을 정리하고 올릴 수 있도록 하겠습니다.
    • 언제나 포기하지 마시고 화이팅 하시길 바랍니다 !
profile
일 때문에 포스팅은 잠시 쉬어요 ㅠ 바쁘다 바빠 모두들 화이팅! // Machine Learning (AI) Engineer & BackEnd Engineer (Entry)

0개의 댓글