메서드(Method)
다른 프로그래밍 언어를 사용하면 함수라는 것이 별도로 존재하는 것을 알 수 있다.
하지만 자바의 함수는 따로 존재하지 않고 클래스 내에 존재한다.(클래스를 떠나 존재할 수 없다.)
자바는 이러한 클래스 내의 함수를 메서드라고 한다.
(파이썬같이 메서드랑 함수가 공존하면 구분짓긴 하는데, 자바는 구분해서 언급하진 않는다.
다만, 함수라는 명칭보다 정확한 명칭은 메서드이다.)
클래스도 간단하게 설명하자면 상태(멤버변수)와 동작(메서드)을 가진다고 생각하면 된다.
아래는 메서드 선언 방식이다.
public class 클래스명 {
접근제어자 리턴타입 메소드명() {
// 메소드 기능
}
}
메서드는 보통 이런 경우에 사용한다고 생각하면 편하다.
- 기능을 만들었는데 반복 호출을 하게 될 경우
- 멤버변수와 연계해서 사용할 경우
또한, 메서드는 다음과 같은 순서로 실행된다.
- new 키워드를 사용하여 호출할 메서드가 존재하는 클래스 인스턴스화 (JVM - Heap 영역 적재)
- 호출해서 사용 (생성된 인스턴스는 main() 종료 후 GC(가비지 컬렉션)에 의해 메모리에서 회수 후 소멸)
아래는 간단하게 작성한 사용 예시이다.
public class Hello {
// printHello 메서드
public void printHello() {
System.out.println("Hello~");
}
// 이 부분은 메인 함수(메서드)
public static void main(String[] args) {
// 위에서 얘기했던 호출 메서드가 존재하는 클래스를 인스턴스화 시키는 과정
Hello hello = new Hello();
// 인스턴스화된 클래스와 메서드를 붙여서 사용한다.
hello.printHello();
}
}
// 출력: Hello~
메서드 구성요소
위에서 Hello 클래스를 구성할 때를 살펴보면 아래처럼 확인할 수 있다.
각각 뜻하는 바는 아래와 같다.
- 접근 제어자: 메서드를 호출할 수 있는 범위(public, default, protected, private)
- 리턴타입: 메서드를 실행한 결과의 타입
- 메소드명: 메서드 이름
1. 접근제어자
접근제어자는 메서드와 클래스, 변수에도 적용 가능하다.
public | 모든 클래스에서 접근 가능 다른 패키지에서도 접근 가능 |
protected | 같은 패키지 내의 클래스와 해당 클래스를 상속한 외부 패키지의 클래스에서 접근 가능 |
default | 접근 제어자를 쓰지 않은 경우 기본값 같은 패키지 내의 클래스에서만 접근 가능 |
private | 해당 클래스에서만 접근 가능 |
접근제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
default | O | O | ||
private | O |
그러면 그냥 public만쓰면 되는거 아니냐? 할 수 있는데 다른 접근제어자를 사용하는 이유는 다음과 같다.
- 프로그램을 개발함에 있어서 접근제어자 없이 사용할 경우, 꼭 필요하지 않은 곳에서 참조해 문제가 발생할 수도 있음
- 또한 보안상 문제가 발생할 수도 있기에 이러한 문제를 예방하기 위해 OOP에서는 접근제어자 개념이 포함되어 있음
2. 리턴 타입
메서드를 선언할 때 반드시 리턴 타입을 명시해주어야 한다.
데이터 | 리턴 타입 가능 여부 |
원시형 | 0 |
객체 | 0 |
void | 0 |
클래스 | X |
메소드 | X |
표현식 | X |
void → 리턴 값이 없다는 뜻. 그래서 메서드로부터 전달되는 데이터가 없다.
3. 메서드명
프로그래밍 언어마다 이름 짓는 법이 존재한다.
자바의 경우 카멜케이스(Camel Case)를 사용하며, 소문자 이후 단어 첫글자마다 대문자를 사용한다.
ex) camelCase, isNumber, helloWorld 등
메서드는 객체의 행위를 나타내기 때문에 동사로 짓는 경우가 많다.
4. Static 메서드
static 메서드 : 프로그램이 시작할 때 static 영역에 생성되며, 프로그램이 끝날 때 없어진다.
인스턴스 메서드 : new를 통해 생성 시 heap영역에 생성되며, 해당 메소드의 실행이 끝나면 GC에 의해 없어진다.
즉, static 메서드의 경우 new를 통해 호출할 필요가 없어진다.
(GC(Garbage Collection) 가비지 컬렉션, 간단하게 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해준다.)
매개변수(Parameter)
아까 위에서 메서드를 사용하는 이유 중 멤버변수와 연계한다고 적었다.
매개변수란 메서드를 정의할 때 사용하는 변수이다.
특징은 아래와 같다.
- 매개변수는 일반 변수처럼 반드시 타입을 선언해야 한다.
- 매개변수는 원시 타입 , 참조 타입 등 모든 타입의 변수를 사용할 수 있다.
- 매개변수 선언 시 개수의 제약을 받지 않는다.
- 매개변수 선언 시 메서드를 호출할 때 전달 받은 값 순서대로 선언한다.
Parmeter & Argument 차이
Parameter : 메서드(함수)에서 전달된 값을 받는 변수이며 ‘인수’ 라고도 한다.
ex ) public int plus(int num1, int num2) {…}
Argument : 메서드(함수)를 호출할 때 매개변수로 전달할 값으로 ‘인자’ 라고도 한다.
반드시 매개변수 타입에 맞는 값을 전달해야 한다.
ex ) plus(10,20);
main 메서드
main 메서드는 접근제어자, static 여부, 리턴타입, 메소드명, 매개변수로 구성되어 있다.
- public 고정 : pubilc 선언하지 않으면 JVM에서 접근 불가 → 실행 안됨
- static 고정 : 해당 클래스의 인스턴스를 생성하지 않아도 main 메서드에 접근 가능해야하기 때문
- void 고정 : main은 다른 메서드로 리턴하는 것이 목적이 아니라 다른 클래스의 인스턴스를 생성하여 다른 기능들을 실행하는 코드가 대부분이기 때문에 리턴 값이 필요없다.
- 메서드명 고정 : 자바 프로그램이 실행되면 JVM이 ‘main’ 메서드를 찾기 때문
- String[] args : 위에서 argument 이야기를 했는데, 사실 main 메서드의 args는 그냥 인자 이름이라서 변경이 가능하다.
(참고로 통합 개발환경(IDE)에서 main 메서드 각각 첫 글자를 딴 psvm로 자동완성이 된다.)
조금 더 자세한 내용 : 메서드(Method) - 점프 투 자바
Notion Link : https://solar-textbook-084.notion.site/Method-5c9c367e97844b409c0cbe27f6b176b4