맨 처음 자바 기본에서 설명했듯이 자바의 기본적인 형태는 클래스와 클래스를 구성하는 메소드와 필드로 구성되어 있다고 했습니다. 오늘은 그중에서 메소드에 대해 공부해보도록 하겠습니다.
메소드는 자바의 기능을 사용하기 위한 명령문들의 집합이라고 할 수 있습니다.
하나의 이름으로 여러 개의 명령을 일괄 처리할 수 있는 모듈이라고 생각하시면 됩니다.
그렇기 때문에 메소드를 잘 이용하면 중복되는 코드가 반복적으로 실행되는 것을 피할 수 있습니다.
메소드의 선언 방법은
접근제한자 메모리영역 리턴타입 메소드명(파라미터) {
명령;
}
이 됩니다.
우리가 지금까지 공부하면서 사용했던 대표적인 메소드를 예를 들면 main메소드가 있죠? 한번 살펴봅시다.
public(접근제한자) static(메모리영역) void(리턴타입) main(메소드이름)(String[] args(파라미터)) {
명령;
}
지금까지는 모르고 사용해왔지만 이렇게 메소드의 선언 방법에 따라 정확하게 나열되는 것을 확인할 수 있습니다.
그럼 각자가 무슨 역할을 하는지 알아봅시다.
접근제한자 : 해당 메소드에 접근할 수 있는 범위를 정해줍니다.
메모리영역 : static과 non-static 영역으로 나뉩니다.
리턴타입 : 메소드가 명령을 수행하고 마지막에 리턴될 값의 타입을 정해줍니다. (리턴 타입이 없을 경우는 void를 사용합니다.)
메소드명 : 말 그대로 메소드의 이름입니다.
파라미터 : 메소드 외부에서 전달된 값을 내부에서 사용하기 위한 변수를 나타냅니다. 매개변수라고도 부릅니다.
간단하게는 이렇게 표현이 되는데 조금 더 자세하게 알아보겠습니다.
접근제한자
public( + ) : 어디서나 접근, 참조 가능
protected( # ) : 상속된 경우 상속된 곳에서, 같은 패키지 내에서 참조 가능
(default)( ~ ) : 같은 패키지 내에서만 참조 가능
private( - ) : 현재 클래스 내에서만 참조 가능
코드를 통해 예시를 살펴보겠습니다.
public class Test {
public static void main(String[] args) {
Test.publicMethod();
Test.protectedMethod();
defaultMethod(); // 같은 클래스 내부에 있는 메소드를 호출할때는
privateMethod(); // class. 생략이 가능하다.
}
public static void publicMethod() {
System.out.println("public");
}
public static void publicMethod() {
System.out.println("public");
}
protected static void protectedMethod() {
System.out.println("protected");
}
//default는 코드에서 생략합니다.
static void defaultMethod() {
System.out.println("default");
}
private static void privateMethod() {
System.out.println("private");
}
}
코드 실행결과
4개다 잘 호출이 됩니다.
그렇다면 같은 패키지의 다른 클래스를 만들어서 써보면 어떻게 될까요?
다른 3개는 호출이 가능하지만 private 메소드에만 에러가 발생한 것을 확인할 수 있습니다.
위에서 설명했듯이 private는 현재 클래스 내에서만 참조가 가능하기 때문에 Test2가 아닌 Test클래스에서만 사용이 가능합니다.
메모리영역
메모리 영역은 static과 non-static으로 구분된다고 설명했는데 우선 이 두 개는 호출 방법부터가 조금 차이가 있습니다.
static은 위에서 사용했던 것처럼 메소드를 호출할 때 class.method( );으로 호출하는 반면 non-static의 경우 class 변수 = new class( ); 와 변수.method( );를 이용해서 호출합니다.
public class NonStatic {
public static void main(String[] args) {
/*Class 변수 = new class();
변수.method명();
*/
// **여기가 중요한 차이점입니다.
NonStatic ns = new NonStatic();
ns.publicMethod();
ns.protectedMethod();
ns.defaultMethod();
ns.privateMethod();
}
public void publicMethod() {
System.out.println("public");
}
protected void protectedMethod() {
System.out.println("protected");
}
void defaultMethod() {
System.out.println("default");
}
private void privateMethod() {
System.out.println("private");
}
}
non-static은 위와 같이 new 키워드로 객체를 만들어야 호출이 가능합니다.
확실히 static을 사용할 때랑은 조금 다르죠
다른 클래스에서 사용할 때 역시 new 키워드로 객체를 만들어서 사용해줍니다.
자바에서는 static을 클래스변수 non-static을 인스턴스 변수라고 표현하는데
static
- 클래스가 여러 번 생성되어도 static 변수는 처음 한 번만 생성됨
- 동일한 클래스의 모든 객체들에 의해서 공유
- 메모리는 method 영역에 저장된다. (이때 메모리의 주소값이 저장된다.)
- JVM이 실행되어 클래스가 메모리에 올라갈 때부터 프로그램 종료 시까지 유지된다.
- 따라서 메모리 낭비가 심할 수 있다.
non-static
- 클래스 내에 선언된 변수
- 객체 생성 시마다 매번 새로운 변수가 생성된다.
- 객체를 생성할 때 heap 영역에 메모리가 생성된다.
- 공유되지 않음
간단하게 표현하자면 static은 클래스 자체에 속하고 non-static은 인스턴스(객체)에 속한다 정도로 알고 계시면 됩니다.
- static이 필요한 이유
자바는 어떤 변수나 함수도 클래스 밖에 존재할 수 없기 때문에 전역 변수나 전역 메소드를 사용할 경우 static을 사용해주면 됩니다.
헷갈리시는 분들을 위해 코드로 예시를 들어볼게요
public class NonStatic {
static int classVar = 1; //static변수 부분
int instanceVar = 20; //non-static 변수 부분
public static void main(String[] args) {
NonStatic test1 = new NonStatic();
NonStatic test2 = new NonStatic();
System.out.println("1. " + test1.classVar + " 2. " + test1.instanceVar);
System.out.println("1. " + test2.classVar + " 2. " + test2.instanceVar);
test1.classVar = 10;
test1.instanceVar = 200;
System.out.println();
System.out.println("1. " + test1.classVar + " 2. " + test1.instanceVar);
System.out.println("1. " + test2.classVar + " 2. " + test2.instanceVar);
}
}
이렇게 했을 때 출력 결과가 각각 어떻게 나올까요?
'Java > JAVA' 카테고리의 다른 글
[JAVA] 자바의 String과 StringBuffer (0) | 2021.09.19 |
---|---|
[JAVA] String pool (0) | 2021.09.18 |
[JAVA] Scanner (0) | 2021.09.15 |
[JAVA] 자바의 반복문 (0) | 2021.09.13 |
[JAVA] 자바의 조건문 (2) | 2021.09.12 |