필드
클래스 내부에 선언된 변수로, 클래스 내부의 메서드들에서 접근하여 사용할 수 있는 데이터를 필드라고 한다.
변수는 변수의 범위(space)와 수명(lifetime)에 따라 구분 클래스 변수(class variable), 인스턴스 변수(instance variable) 그리고 지역 변수(local variable)로 구분된다.
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
- 클래스 변수(Class Variable)
- 클래스 전체에 공유되는 변수
- 클래스 내부에서 선언되며 인스턴스 생성과 상관 없이 바로 사용 가능
- 클래스 이름을 통해 접근 가능
- 상수나 공유되어야 할 값을 저장할 때 사용 - 인스턴스 변수(Instance Variable)
- 인스턴스마다 별도로 유지되는 변수
- 클래스 내부에서 선언되지만 인스턴스 생성 후 사용 가능
- “this”라는 키워드를 통해 접근 가능
- 인스턴스마다 다른 값을 저장할 때 사용 - 지역 변수(Local Variable)
- 선언된 함수나 블록 내에서만 유효한 변수로 함수나 블록을 벗어나면 메모리에서 제거됨
- 함수나 블록 내에서 선언되며 다른 함수나 블록에서는 접근 불가
- 지역 변수는 함수나 블록 내에서만 사용
Static 키워드
클래스 변수와 인스턴스 변수를 구분하기 위한 방법으로 static 키워드의 유무를 확인한다. static 은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드로 ‘정적 멤버(static member)’라고 부른다.
static이라고 정의되어 있는 클래스 멤버들은 인스턴스의 생성 없이도 클래스명.멤버명 으로 사용이 가능하다.
static 키워드를 사용하는 정적 멤버를 사용하는 것 또한 메모리의 저장 위치와 관련이 있다. new 키워드를 통해 생성된 인스턴스는 힙 메모리에 생성되고 독립적인 저장공간을 가지게 되는 반면 static키워드로 선언된 정적 멤버는 클래스 내부에 공간을 가지고 있기 때문에 객체 생성 없이 곧바로 사용이 가능하다.
static함수는 해당 함수가 선언된 파일에서만 액세스할 수 있도록 지정하는 데 사용한다. 이러한 함수는 해당 파일 내에서만 호출 가능하며, 다른 파일에서는 호출할 수 없다.
public class StaticTest {
public static void main(String[] args) {
MyClass instance1 = new MyClass(); // MyClass 인스턴스 생성
MyClass instance2 = new MyClass(); // MyClass 인스턴스 생성
instance1.setInstanceVar(1); // static 이 없는 변수
instance2.setInstanceVar(2); // 인스턴스 변수 설정
System.out.println("instance1 인스턴스 변수: " + instance1.getInstanceVar()); // 1
System.out.println("instance2 인스턴스 변수: " + instance2.getInstanceVar()); // 2
System.out.println("클래스 변수: " + MyClass.classVar); // 0 static이 있는 변수는 클래스에서 바로 호출
}
}
class MyClass {
private int instanceVar; // 인스턴스 변수
public static int classVar; // 클래스 변수
public void setInstanceVar(int value) {
this.instanceVar = value;
}
public int getInstanceVar() {
return this.instanceVar;
}
}
static을 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유할 수 있다.
결론적으로 static 키워드는 클래스의 멤버 앞에 붙일 수 있다. 정적 멤버의 가장 큰 특징은 인스턴스를 생성하지 않아도 변수나 메서드의 호출이 가능하다는 점이다.
메서드
메서드(Method)란 클래스에 정의된 함수 즉, 특정 작업을 수행하는 명령문들의 집합을 의미한다.
- 메서드 정의
[접근제한자] [반환타입] [메서드명] ([매개변수]) { //메서드 시그니처
[메서드내용] // 메서드 바디
}
- 접근제한자(access modifier) : 메서드에 대한 접근 권한을 지정
⇒ public, private, protected 등 - 반환타입(return type) : 메서드가 반환하는 값의 데이터 타입을 지정
⇒ 반환 값이 없을 경우 void - 메서드이름(method name) : 메서드의 이름을 지정
⇒ 관례적으로 카멜 표기법(camelCase)을 사용합니다. - 매개변수(parameters) : 메서드에 전달되는 인자의 타입과 이름을 지정
⇒ 인자가 없을 경우 생략 가능 - 메서드 바디(method body): 메서드가 실제로 수행하는 코드를 작성
public class MethodEx {
public int add(int num1, int num2) {
int result = num1 + num2;
return result;
}
public static void main(String[] args) {
MethodEx obj = new MethodEx();
int sum = obj.add(5,8);
System.out.println(sum);
}
}
⇒ int 타입의 반환값을 가지고 int형 매개변수 num1, num2를 갖는 add 메서드 정의
⇒ add 메드는 staic을 쓰지 않았기에 출력 시 메서드의 호출이 필요하며 출력을 위해 아래의 main 메서드를 만들어 줌
위의 예시에서 add(5,8)이라고 num1과 num2에 들어갈 값을 넣어 주었다. 이 값을 '인자(argument)’라고 부르며 메서드가 호출될 때, 메서드에 전달되는 실제 값(데이터)를 의미한다.
'LANGUAGE > JAVA' 카테고리의 다른 글
[JAVA] System.arraycopy 배열에 값 추가하기 / 배열 복사 메서드 (0) | 2023.04.24 |
---|---|
[JAVA] JAVA 객체지향 프로그래밍 / 메서드 오버로딩(Method Overloading)이란? (0) | 2023.04.23 |
[JAVA] 클래스(Class) 와 객체(Object) / 객체와 인스턴스의 차이 (0) | 2023.04.21 |
[JAVA] 객체 지향 프로그래밍 기초 / 추상화란? OOP의 특성 알기 (0) | 2023.04.21 |
[JAVA] JAVA 배열(Array) 기본 개념 / 배열이란? 배열 생성 방법 (0) | 2023.04.21 |