Java/JAVA

[JAVA] 자바의 메소드(Method)

담크 2021. 9. 17. 23:52

맨 처음 자바 기본에서 설명했듯이 자바의 기본적인 형태는 클래스와 클래스를 구성하는 메소드와 필드로 구성되어 있다고 했습니다. 오늘은 그중에서 메소드에 대해 공부해보도록 하겠습니다.

 

메소드는 자바의 기능을 사용하기 위한 명령문들의 집합이라고 할 수 있습니다.

하나의 이름으로 여러 개의 명령을 일괄 처리할 수 있는 모듈이라고 생각하시면 됩니다.

그렇기 때문에 메소드를 잘 이용하면 중복되는 코드가 반복적으로 실행되는 것을 피할 수 있습니다.

 

메소드의 선언 방법은

접근제한자 메모리영역 리턴타입 메소드명(파라미터) {
	명령;
}

이 됩니다.

우리가 지금까지 공부하면서 사용했던 대표적인 메소드를 예를 들면 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