static 을 공부하기 전 ,
알아보는 자바의 운영체제
코드가 실행되어지면 ,클래스들이 실행되어지면서 ,
모든 코드들을 메모리에 올려놓고 JVM이 작동되면서 메모리를 할당하여 사용한다.
JVM이 코드 실행시에 반드시 필요한 아이와 필요할 때만 쓰면 되는 것을 구분하여 사용한다.
반드시 필요한 아이를 static으로 정의하고 (stack area)
필요할 떄만 생성하여 쓰는 아이를 instance 로 정의 하여 (heap area)
용도에 맞게 메모리를 적절히 나누어 운영하게 된다.
메인이 끝나면 , 프로그램이 종료된다.
stack 안에 main 이 먼저 아래에 자리하고 , stack은 자료를 담아두는 공간에 대한 용어이다.
메서드의 실행 순서(메서드 콜)를 관리한다.
제일 마지막에 들어간 데이터가 제일 먼저 나올 수 있게 만들어진 구조 (FILO 구조)
즉 , main 이 가장 마지막에 나온다.
구조상의 비교 : (QUE 구조 : 제일 먼저 들어온애가 제일 먼저 나간다 <->FILO 구조)
static (클래스의 종속)
static 키워드를 붙이게 되면 , 멤버들이 해당 클래스 수준에 종속하게 된다.
static 변수는 해당 클래스 수준에서 전역변수와 유사하게 동작한다.
클래스 로드시 한번 할당되고 , 모든 인스턴스들이 static 변수를 공유하게 된다.
지역변수로는 static이 불가하고 클래스의 전역변수만 static 이 가능하다.
즉 , static 메서드 내라고 하더라도 static 의 지역변수 선언은 불가하다.
메서드 내 : 지역변수
instance (=none_Static , 인스턴스 종속)
따로 키워드를 붙이고 사용하면 instance 로 사용하게 되고,
객체 또는 인스턴스 수준에 속하게 된다.
인스턴스 멤버 또는 객체들은 인스턴스 수준에서 지역변수로 동작한다.
즉 인스턴스에 종속하게 된다.
호출 규칙
static 메서드
static 메서드는 인스턴스 없이 호출이 가능하다.
인스턴스 멤버에서 static을 사용하려면 , 인스턴스 생성후 호출이 가능하다.
같은 static 멤버라면 같은 공간에 올려져있는 메모리를 사용해서 할 수 있다.
instance 메서드
static , instance 모두 인스턴스 없이 사용가능하다.
접근 해보기.
1. static 멤버 메서드에서 static 멤버 변수 접근
//멤버 변수 정의
int result ;
int instanceTotal ;
static int staticTotal ;
//멤버 메서드 정의
//static 메서드
public static int staticAdd(int i , int j) {
//result = i+j; // 인스턴스 없이는 접근 불가.
staticTotal += i+j; //인스턴스 없이 접근 가능
return i + j ;
}
2. static 멤버 메서드에서 instance 멤버 변수 접근
static 멤버 메서드에서 instance 멤버를 접근하기 위해서는 instance 생성이 필요하다.
1. 인자로 인스턴스 생성해서 접근하기
//멤버 변수 정의
int result ;
int instanceTotal ;
static int staticTotal ;
//멤버 메서드 정의
//static 메서드
public static int staticAdd(int i , int j , Ex05_static ex05) {
//인스턴스 멤버에 접근(인스턴스가 필요하다.)
ex05.instanceTotal = i+j;
return i + j ;
}
2. 직접 인스턴스 생성해서 접근하기
//멤버 변수 정의
int result ;
int instanceTotal ;
static int staticTotal ;
//멤버 메서드 정의
//static 메서드
public static int staticAdd(int i , int j) {
Ex05_static instansMethod = new Ex05_static();
instansMethod.instanceTotal = i+j;
return i + j ;
}
→ 용도에 따라 사용할 수 있는데,
인자를 통해서 받은 인스턴스는 실행하는 곳에서 생성한 것을 참조받았지만 ,(즉 , 공통된 인스턴스 사용)
메서드 내부적으로 생성하는 것은 1회적으로 생성되어 사용되는 점이 있다.(매번 다른 인스턴스를 사용하게 된다.)
3. instance 멤버 메서드에서 static 멤버변수 , instance 멤버 변수 접근
인스턴스 메서드에서는 static 멤버변수와 인스턴스 멤버 변수에 인스턴스 없이 접근이 가능하다.
public int instanceMulti(int i , int j) {
result = i * j;
staticTotal +=result;
instanceTotal += result;
return i * j;
}
public int instanceDiv(int i , int j) {
result = i / j;
staticTotal +=result;
instanceTotal += result;
return i / j;
}
static main 에서의 접근하기
1. static 멤버 Call
- 같은 클래스에서 static 메서드 콜 [ static 메서드명 ]
System.out.println("staticAdd(10, 3, ex051) add :"+staticAdd(10, 3, ex051));
//System.out.println(ex051.staticMin(10, 3, ex052));
//static을 static 하게 사용하라.
//=> 접근 경고 : 인스턴스 없이 메서드명만 사용 (동일 클래스의 static 멤버인 경우)
//클래스명.멤버명(다른 클래스의 static 멤버인 경우)
System.out.println("staticMin(10, 3 ,ex051) min :"+staticMin(10, 3 ,ex051));
- 같은 클래스에서 static 변수 콜 [ static 변수명 ]
System.out.println("static 변수 )staticTotal : "+staticTotal); // 같은 클래스 내
- 다른 클래스에서 static 멤버 콜 [ 클래스명.static 멤버명 ]
클래스명. 을 치면, 그 해당 클래스의 static 으로 정의된 모든 값들을 볼 수 있다.
System.out.println("옆집의 static 멤버 호출해 보기.");
System.out.println("Ex05_static.staticTotal : "+Ex05_static.staticTotal);
System.out.println("Ex05_static.staticAdd(4, 2, new Ex05_static()) : "+Ex05_static.staticAdd(4, 2, new Ex05_static()));
2. instance 멤버 Call ( 다른클래스나 같은클래스나 사용법 동일)
- instance 메서드 콜 [ 생성한인스턴스명. instance 메서드명 ]
System.out.println("instance Call test");
System.out.println("ex051.instanceMulti(10, 2) Multi :"+ex051.instanceMulti(10, 2));
System.out.println("ex051.instanceDiv(10, 2) Div :"+ex051.instanceDiv(10, 2));
- instance 변수 콜 [ 생성한인스턴스명. instance 변수명 ]
System.out.println("instance 변수 )instanceTotal : "+ex051.instanceTotal);
- 다른 클래스에서 instance 멤버 콜 [ 생성한인스턴스명. instance 멤버명 ]
E05_static instanceTest = new Ex05_static(); // 인스턴스 생성 동일
System.out.println("옆집의 instance 멤버 호출해 보기.");
System.out.println("Ex05_static.staticTotal : "+Ex05_static.staticTotal);
System.out.println("instanceTest.instanceTotal : "+instanceTest.instanceTotal);
System.out.println("instanceTest.instanceMulti(1, 4) : "+instanceTest.instanceMulti(1, 4));
System.out.println("Ex05_static.staticTotal : "+Ex05_static.staticTotal);
static 변수와 instance 변수의 차이점 살펴보기
static 변수는 한 클래스 내에 모든 값들을 공유하고 있는 점이 있지만,
instance 변수는 instance 객체에 의존하여 개별 값들을 활용 됨을 볼 수 있다.
Ex05_static ex052 = new Ex05_static(); // 인스턴스 생성
System.out.println("=====static 변수와 instance 변수 차이점===== ");
System.out.println("static 변수 )staticTotal : "+staticTotal);
System.out.println("instance 변수 )instanceTotal : "+ex052.instanceTotal);
System.out.println("========메서드 사용======== ");
System.out.println("staticAdd(10, 3, ex052) add :"+staticAdd(10, 3, ex052));
System.out.println("=====메서드 사용후 결과===== ");
System.out.println("static 변수 )staticTotal : "+staticTotal);
System.out.println("instance 변수 )instanceTotal : "+ex052.instanceTotal);
코드를 실행하면서 static 값(staticTotal : static변수)을 stack 의 메서드 영역에 들어가고 ,
stack 영역에 메인이 들어가게 되면서 ,
메인실행에서 instance 를 만들고 ,
instance 안에는 result(instance 변수) 도 있고 , instanceTotal(instance 변수) 도 있다.
각각의 변수들이 저장된 위치가 다르고 사용법도 다르다.
이름이 같다고 혼동하면 안된다 .
인스턴스 변수 같은 경우 저장된 주소값이 다르다고 생각할 것.
'Developer > JAVA' 카테고리의 다른 글
JAVA , 예제 : 로또 번호 생성기 , 학생 성적순 출력 (0) | 2024.08.06 |
---|---|
JAVA , 접근 제어자 : 설정자와 접근자 (0) | 2024.08.05 |
JAVA , 초기화 블럭(init) 과 생성자 , this (0) | 2024.08.04 |
JAVA , 팩토리얼 연산 (Factorial)과 static (0) | 2024.08.03 |
JAVA , 매개변수의 전달 방식 : CallByValue와 CallByReference (0) | 2024.08.03 |