- 최대한 기초가 거의 없는 분들의 입장에서 정리해본 내용이므로, 어려운 개념들은 가급적 포함시키지 않거나 최대한 간단하게만 표현하였습니다.
- 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 반환 값];
}
- 여기서 접근 제어자는 나중에 따로 다뤄야할 내용이라서 이런게 있구나 생각하시면 되고, 지금 단계에서는
public static 혹은 public으로 앞에 붙여주시면 됩니다.
- 정말 중요한건
반환 타입과 메서드 이름, 그리고 매개 변수입니다.
- 특히 밑에서 다시 다루겠지만,
메서드 이름과 매개 변수는 메서드 시그니처(Method Signature)라 해서 메서드를 구분하는 고유한 이름으로 동작하기 때문에, 매우 중요합니다.
메서드 정의 예시
public class Example {
public void greet() {
System.out.println("Hello, World!");
}
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(명시적 키워드 없음))
- 지금 단계에선 이런게 있구나 정도로 넘어가시면 됩니다.
반환 타입: 메서드가 반환하는 값의 타입입니다.
메서드 이름: 메서드를 호출할 때 사용하는 이름입니다.
- 관례적으로 일반적인 변수와 마찬가지로 소문자로 시작하며, 카멜 표기법(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;
System.out.println(localVariable);
}
9-2-2. 매개 변수(Parameters)
- 지역변수와 유사하지만, 메서드의 입력값으로 전달되는 변수를 의미합니다.
- 메서드 내부에서만 사용 가능하며, 메서드가 종료되면 사라집니다.
- 스코프(Scope) : 메서드 내부
매개변수 예시
public int add(int a, int 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)에 대해서 방대한 내용들을 정리하고 올릴 수 있도록 하겠습니다.
- 언제나 포기하지 마시고 화이팅 하시길 바랍니다 !