● 필드 field 란 클래스에 포함된 변수들을 의미합니다.
필드 안에서 변수들은 클래스 어디에 위치하는지에 따라 클래스 변수(static 변수, 정적 변수), 인스턴스 변수, 지역 변수로 나뉩니다.
클래스 변수와 인스턴스 변수, 지역변수에 대해서 간단하게만 설명을 하자면
클래스 변수란 처음 static 으로 선언된 변수이며
인스턴스 변수란 클래스 내부에 선언된 변수이고
지역 변수란 메소드 블럭(메소드나 생성자, 초기화 블록 내) 안에 선언된 변수입니다.
자세한 것은 하단에서 함께 볼게요.
● 클래스 변수, 인스턴스 변수, 지역변수 의 생성 시기
각각의 차이가 생기는 이유는 생성시기와도 연관이 됩니다.
- 클래스 변수는 클래스가 메모리가 올라가는 가장 첫 순간에 생성되는 static 클래스입니다.
이것은 프로그램이 종료될 때 같이 소멸하며 클래스이름.변수이름 의 형태로 사용됩니다.
- 인스턴스 변수는 인스턴스 변수가 선언되는 순간 생성되며, 인스턴스가 소멸할 때 함께 소멸합니다.
인스턴스이름.변수이름 의 형태로 사용하는 것은 클래스 변수와 동일합니다.
- 지역변수는 블록 내에서 변수의 선언되는 순간 생성됩니다. 메소드 블럭을 벗어나면 소멸되며
변수 이름 으로 사용합니다.
● 클래스 변수와 인스턴스 변수
new 연산을 통해서 만들어진 참조 데이터 하나하나가 객체입니다.
인스턴스가 사용할 수 있는 변수와 메소드가 인스턴스 멤버예요.
클래스 변수와 다르게 공유가 되지 않습니다.
앞에 static 이 붙어있는 멤버는 클래스 static 멤버입니다.
클래스가 여러번 생성이 되어도 static 변수는 처음 딱 한 번만 생성이 됩니다.
동일한 모든 클래스들에 대해서 공유되어요. 이 변수는 모든 인스턴스가 공유해야 하는 값을 유지하기 위해 사용됩니다.
즉 이미 만들어져 있는 클래스 멤버를 다른 인스턴스들이 모두 참조하기 때문에
해당 값이 변하면 그것을 참조하는 모든 인스턴스들의 값이 바뀝니다.
실행하기 전에 컴파일 과정을 거치는데, 컴파일은 실행될 수 있게 만드는 작업입니다.
컴파일 과정에서 코드의 static 을 읽으면 객체가 생성되기 전부터 미리 메모리에 올려놓는 것으로 판단하기 때문에
new 를 사용하지 않더라도 공유가 됩니다.
class Number{
static int num = 0; // 공유가 된다.
}
public class ClassVar {
public static void main(String[] args) {
Number a = new Number();
a.num = 10; // 직접적으로 접근하면 b또한 공유되어서 값이 바뀐다.
Number b = new Number();
System.out.println(b.num);
}
}
static 변수가 선언된 클래스 내에서는 이름만으로 직접 접근이 가능합니다.
pricate로 선언되지 않으면 클래스 외부에서 접근이 가능합니다.
static 클래스 변수는 생성됨과 동시에 초기화를 하는 것이 좋습니다.
생성자 기반에서 초기화를 하면 인스턴스 생성시마다 값이 리셋됩니다.
● 클래스 메소드와 인스턴스 메소드
static 키워드를 가지는 메소드를 클래스 메소드라고 하고, static 을 가지지 않은 메소드를 인스턴스 메소드라고 합니다.
클래스 메소드는 클래스 변수와 같이 단 한 번만 만들어지고 모든 객체가 동일하게 가져다가 쓸 수 있습니다.
접근방법도 클래스 변수와 동일합니다.
클래스면서 클래스 메소드 = 인스턴스가 생기지 않아도 클래스의 존재만으로 생성되어 있으며 사용할 수 있는 것이에요.
즉 인스턴스 변수를 사용하지 않고 전달된 매개 변수만으로 동작하는 메소드입니다.
클래스 메소드는 사칙연산 등 단순한 기능이 목적일 경우에 객체에 의존적일 필요가 없어서
모든 개체가 기능을 공유하기만 할 때에는 클래스 메소드로 선언하면 좋습니다. (ex 덧셈, 뺄셈 등)
예를 들면 하단의 예제와 같습니다.
PI의 값은 final 선언을 하고 static 클래스로 선언을 함으로써 값이 다른 객체에 의존하지 않고 그대로 보존할 수 있도록 합니다.
class SimpleCalculator{
static final double PI = 3.1415;
static double add(double n1, double n2) {
return n1 + n2;
}
static double min(double n1, double n2) {
return n1 - n2;
}
static double calcircleArea(double r) {
return PI * r * r;
}
static double calcirclePeri(double r) {
return PI * (r *2);
}
}
클래스 메소드는 인스턴스를 생성하지 않아도 바로 사용할 수 있으므로 메소드 내부에서 인스턴스 변수를 사용할 수 없습니다.
즉 클래스 메소드는 인스턴스가 생기기 전부터 존재하고, 인스턴스는 인스턴스 메소드가 있어야만 존재하므로
클래스 메소드에서 인스턴스 변수에 접근이 불가능합니다.
예를 들어 하단의 예제는 성립이 불가능합니다.
class AAA{
int num = 0;
static void addNum(int n) {
num += n;
}
}
그렇기 때문에 메소드 내부에서 인스턴스 변수나 인스턴스 메소드를 사용하지 않는 메소드를 클래스 메소드로 사용합니다.
'자바 > 자바 입문 공부일지' 카테고리의 다른 글
자바 기초 공부 일지 15. 메소드 오버로딩, this 참조 변수 (0) | 2022.10.27 |
---|---|
자바 기초 공부 일지 14. System.out.println, public static void main(), static 초기화 블록 (0) | 2022.10.27 |
자바 기초 공부 일지 12. 생성자와 String 클래스 (수정중) (0) | 2022.10.27 |
자바 기초 공부 일지 11 . ★ 클래스와 인스턴스, 삼각형의 넓이 구하기 (0) | 2022.10.27 |
자바 기초 공부 일지 10. 메소드의 재귀 호출 (0) | 2022.10.26 |