JAVA 메모리 영역
클래스 영역 : 공유메모리 (static변수, static메서드, 생성자메서드)
스택 영역 : 일반변수, 참조변수
힙 영역 : 객체
클래스의 필드(field)란 클래스에 포함된 변수(variable)를 의미
클래스 내에서 필드는 선언된 위치에 따라 다음과 같이 구분
1. 클래스 변수(static variable)
- 클래스 영역에 위치한 변수 중 static 키워드를 가짐
- 자동 초기화
- 인스턴스 생성하지 않고 바로 사용 가능
- 해당 클래스의 모든 인스턴스가 공유해야 하는 값을 위해 사용
- 하나의 메모리 공간만 사용
2. 인스턴스 변수(instance variable)
- 클래스 영역에 위치한 변수 중 static 키워드를 가지지 않음
- 자동 초기화
- 인스턴스마다 가져야 하는 고유한 값을 위해 사용
- 변수마다 메모리공간 생성
3. 지역 변수(local variable)
- { }내에서 선언되는 변수
- { }내에서 공간형성 , { }를 벗어나면 공간 소멸
- 메소드나 생성자, 초기화 블록 내에 위치한 변수
- 사용전 초기화 필요
변수 | 생성 시기 | 소멸 시기 | 저장 메모리 | 사용 방법 |
클래스 변수 | 클래스가 메모리에 올라갈 때 | 프로그램이 종료될 때 | 메소드 영역 | 클래스 이름. 변수 이름 |
인스턴스 변수 | 인스턴스가 생성될 때 | 인스턴스가 소멸할 때 | 힙 영역 | 인스턴스 이름. 변수 이름 |
지역 변수 | 블록 내에서 변수의 선언문이 실행될 때 | 블록을 벗어날 때 | 스택 영역 | 변수 이름 |
예제 )
선언위치에 따른 변수의 종류_포커카드 속성
class Card
{
String kind; //(무늬)인스턴스 변수
int number; //(숫자)인스턴스 변수
static int width = 100; //(폭)클래스 변수
static int height = 250; //(높이)클래스 변수
void method()
{
int lv=0; //지역 변수
}
}
//인스턴스 변수 호출
Card c = new Card(); //객체 생성
c.kind = "Heart"; //객체 이름.변수이름
c.number = 5;
//클래스 변수 호출(객체 생성 없이 사용가능)
Card.width = 200; //클래스이름.변수이름
Card.height = 300;
클래스 영역에 선언된 변수 : 인스턴스, 클래스 2가지.
이때 static이 있으면 클래스 변수, 없으면 인스턴스 변수라고 함.
매서드 영역에 선언된 변수 : 지역변수
포커카드 마다 폭과 넓이는 모두 같다 > 공통 속성 > 클래스 변수(static)
포커카드 마다 무늬와 숫자는 다르다 > 개별 속성 > 인스턴스 변수
예제 )
class Field {
static int classVar = 10; // 클래스 변수 선언
int instanceVar = 20; // 인스턴스 변수 선언
}
public class Member01 {
public static void main(String[] args) {
int var = 30; // 지역 변수 선언
System.out.println(var + "\n"); // 지역 변수 참조
Field myField1 = new Field(); // 객체 생성
Field myField2 = new Field(); // 객체 생성
System.out.println(Field.classVar); // 클래스 변수 참조
System.out.println(myField1.classVar);
System.out.println(myField2.classVar + "\n");
Field.classVar = 100; // 클래스 변수의 값을 변경
System.out.println(Field.classVar); // 클래스 변수 참조
System.out.println(myField1.classVar);
System.out.println(myField2.classVar + "\n");
System.out.println(myField1.instanceVar); // 인스턴스 변수 참조
System.out.println(myField2.instanceVar + "\n");
myField1.instanceVar = 200; // 인스턴스 변수의 값을 변경
System.out.println(myField1.instanceVar); // 인스턴스 변수 참조
System.out.println(myField2.instanceVar);
}
}
클래스 변수는 생성된 모든 인스턴스가 같은 값을 공유
인스턴스 변수는 각 인스턴스마다 고유한 값을 가짐
따라서, myFIeld1의 인스턴스 변수값을 200으로 변경 후
myField1객체를 호출하면 200, myField2 객체를 호출하면 20 이 출력된다.
결과 )
30
10
10
10
100
100
100
20
20
200
20
메소드의 구분
메소드 : 어떠한 작업을 수행하기 위한 명령문의 집합
1. 클래스 메소드 (static method)
- static 키워드를 가짐
- 객체 생성 없이 바로 사용가능
- '클래스 이름.메서드이름(매개변수)'와 같이 호출 가능
- 전달된 매개변수만으로 동작
- 인스턴스 변수 사용할 수 없음
- 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하고자 할 경우 객체 생성
2. 인스턴스 메소드 (instance method)
- static 키워드를 가지지 않음
- 반드시 객체 생성해야만 호출 가능
- 인스턴스 멤버(인스턴스 변수와 인스턴스 메소드)는 반드시 객체를 생성한 후에만 참조 또는 호출 가능
예제 )
class Sum {
Scanner sc = new Scanner(System.in);
//클래스 메서드 : 인스턴스 변수와 관계없이 매개변수만으로 작업 가능
static int sum1(int x, int y) {
return x+y; //x, y는 지역 변수
}
//인스턴스 메서드 : 인스턴스 변수 x,y만을 이용해 작업하므로 매개변수 필요 없다.
int x, y;
int sum2() {
System.out.print("정수 2개 입력 : ");
int x = sc.nextInt();
int y = sc.nextInt();
return x+y; //x, y 인스턴스 변수
}
}
class SumTest {
public static void main(String[] args) {
//클래스 메서드 호출
System.out.println(Sum.sum1(10,20));
//인스턴스 메서드는 객체 생성 후에만 호출 가능
Sum result = new Sum();
System.out.println(result.sum2());
}
}
결과 )
30
정수 2개 입력 : 10 20
30
정리 )
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static 을 붙인다.
- 클래스변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.
- static 이 붙은 메서드는 인스턴스 생성 없이 호출 가능한 반면, 인스턴스 변수는 객체를 생성해야만 만들어지기 때문에 static 이 붙은 메서드에서 인스턴수 변수의 사용을 허용하지 않음. 그러나, 인스턴스 변수나 인스턴스 메서드에서는 static 이 붙은 멤버들을 사용한 것은 언제나 가능.
- 인스턴스 변수를 필요로 하지않는다면 static 을 붙이자. (메서드 호출시간 짧아지기 때문에 효율 증가)
- 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면 static 을 붙인다.
참고 사이트 : https://88240.tistory.com/440 [shaking blog:티스토리]
참고 사이트 : tcpschool.com
참고 영상 : 남궁성의 정석코딩
'JAVA' 카테고리의 다른 글
[JAVA] 오버로딩/Overloading (0) | 2022.07.26 |
---|---|
[JAVA] 매개변수, return문, 반환값 (0) | 2022.07.25 |
[JAVA] 객체지향/클래스 개념/구성/선언 (0) | 2022.07.14 |
[JAVA] 반복문 for / 별짓기 / 구구단 (1) | 2022.07.13 |
[JAVA] 반복문 while / 구구단 / 별짓기 (1) | 2022.07.12 |