자바(JAVA) 변수와 메서드
1. 변수
변수에는 클래스변수, 인스턴스변수, 지역변수 세 종류가 있습니다. 변수가 선언된 위치에 따라 변수의 종류가 결정되므로 어느 영역에 선언되었는지 확인하여 사용하는 것이 중요합니다.
다음 예제와 함께 변수의 종류와 특징에 대해 알아보겠습니다.
public class Variables { int instanceVariable; // 인스턴스 변수 static int classVariable; // 클래스 변수 void method() { int localVariable; // 지역변수 } }
변수의 종류 | 선언위치 | 생성시기 |
클래스 변수(class variable) | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수(instance variable) | 인스턴스가 생성되었을 때 | |
지역 변수(local variable) | 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) | 변수 선언문이 수행되었을 때 |
인스턴스 변수
클래스 영역에 선언되며 클래스의 인스턴스를 생성할 때 만들어집니다. 그렇기 때문에 인스턴스를 먼저 생성해야 인스턴스 변수를 사용할 수 있습니다. 인스턴스마다 고유한 값이나 상태를 유지해야하는 경우 인스턴스 변수로 선언하여 사용합니다.
클래스 변수
앞서 설명한 인스턴스 변수 앞에 static을 붙이면 클래스 변수가 됩니다. 클래스변수는 모든 인스턴스가 공통된 저장공간을 공유하게 되어 공유변수라고도 합니다. 이러한 특징으로 인하여 한 클래스이 모든 인스턴스들이 공통적인 값을 유지해야하는 경우 클래스 변수로 사용합니다.
클래스가 메모리에 올라갈 때 생성되기 때문에 프로그램이 종료될 때까지 유지되며, public을 앞에 붙이면 같은 프로그램 내의 어디서나 접근할 수 있는 전역변수의 성격을 갖게 됩니다.
※ 위의 예제의 Variables 클래스의 클래스변수 classVariable를 사용하려면 Variables.classVariable 과 같이 사용하면 됩니다.
지역 변수
메서드 내에서만 선언되어 사용이 가능합니다. 또한 for문, while문과 같은 블럭내에 선언된 변수도 지역변수이며 이러한 블럭내의 지역변수도 선언된 블럭 내에서만 사용이 가능합니다.
2. 메서드
어떤 작업을 수행하기 위한 집합을 메서드라고 합니다. 반복적으로 사용되는 코드를 줄이기 위해 메서드를 사용하며 주로 어떤 값을 입력받아서 처리하고 결과를 되돌려주는 역할을 합니다.
다음 예제를 통해 메서드 작성 방법에 대해 알아보겠습니다.
int returnMethod(int a, int b) { int result = a + b; return result; } void voidMethod() { System.out.println("This is void method. No return."); }
메서드는 선언부와 구현부로 이루어져 있습니다.
위의 예제에서 'int returnMethod(int a, int b)'와 'void voidMethod()' 부분이 선언부에 해당하며 {} 블럭 부분이 구현부에 해당합니다.
메서드의 결과값 반환 여부에 따라 return 타입 또는 void 타입으로 선언부를 작성해줘야합니다.
다음은 메서드를 호출하는 방법입니다.
참조변수.메서드명(매개변수1, 매개변수2, ... );
ex) tv.channelUp();
아래의 간단한 예제를 통해서 메서드 호출을 확인해 보겠습니다.
class Math { long add(long a, long b) { return a + b; } long substract(long a, long b) { return a - b; } long multiply(long a, long b) { return a * b; } double divide(double a, double b) { return a / b; } public static void main(String[] args) { Math math = new Math(); long calResult = math.add(10L, 20L); } }
Math 클래스의 인스턴스를 생성한 다음 참조변수 math를 통해 add() 메서드를 사용한 것을 확인할 수 있습니다.
※ 같은 클래스내의 인스턴스 메서드끼리는 참조변수 사용없이 서로 호출이 가능하지만, static 메서드는 같은 클래스내의 인스턴스 메서드를 호출할 수 없습니다.
※ 기본형 매개변수와 참조형 매개변수
- 기본형 매개변수 : 기본형 매개변수에 저장된 값이 복사됩니다. 따라서 변수의 값을 읽기만 할 수 있습니다. (read only)
- 참조형 매개변수 : 참조형 매개변수의 값이 저장된 곳의 주소값을 알 수 있기 때문에 값을 읽어오고 변경할 수 있습니다. (read & write)
클래스 메서드와 인스턴스 메서드
클래스 변수와 인스턴수 변수처럼 메서드 앞에 static의 유무로 클래스 메서드와 인스턴스 메서드로 나눠서 사용할 수 있습니다.
인스턴스 메서드는 메서드의 작업을 수행하는데 있어서 인스턴스변수를 필요로 하는 메서드입니다. 반면에 인스턴스와 관계없는 메서드는 클래스 메서드로 정의하여 사용합니다.
그럼 여기서 static을 붙여 정의하는 클래스 변수와 메서드의 특징에 대해 좀 더 자세하게 알아보겠습니다.
- 클래스를 설계할 때 모든 인스턴스에서 공통적으로 사용해야하는 것에는 static을 붙인다.
- 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다. 반면에 인스턴스 메서드는 클래스 변수를 사용할 수 있다.
- 메서드 내에서 인스턴스 변수나 메서드를 사용하지 않는다면 static을 붙여 클래스 메서드로 사용하는 것을 고려해봐야 한다.
(메서드 호출 시간이 짧아져 효율이 높아지기 때문)
※ 클래스 멤버와 인스턴스 멤버 간의 참조와 호출
- 같은 클래스에 속한 멤버들 중 인스턴스 멤버가 다른 인스턴스 멤버나 클래스 멤버를 참조 또는 호출하는 것은 가능
- 클래스 멤버가 인스턴스 멤버를 호출할 때는 반드시 인스턴스를 생성해야 가능
(클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재할 수도 있고 안할 수도 있기 때문)
이상으로 자바의 변수와 메서드에 대해서 알아봤습니다.
※ 참고 문헌
남궁성, 『Java의 정석 2nd Edition』, 도우출판(2010)