Java 메모리 구조 행 결과 ``` 차량 구입, 이름: K3 차량 구입, 이름: G80 차량 구입, 이름: Model Y 구매한 차량 수: 3
메소드 영역 - 클래스 정보를 보관
스택 영역 - 실제 프로그램이 실행되는 영역
힙 영역 - 객체(인스턴스)가 생성되는 영역
스택 구조
= 후입 선출
= LIFO
= Last In First Out
1 → 2 → 3 → 3 → 2 → 1
큐 구조
= 선입 선출
= FIFO
= First In First Out
1 → 2 → 3 → 1 → 2 → 3
스택 영역
● 자바는 스택 영역을 사용해서 메소드 호출과 지역 변수(매개변수 포함)를 관리함
● 메소드를 계속 호출하면 스택 프레임이 계속 쌓임
● 지역 변수(매개변수 포함)는 스택 영역에서 관리함
● 스택 프레임이 종료되면 지역 변수도 함께 제거됨
● 스택 프레임이 모두 제거되면 프로그램도 종료됨
Static 변수
Static을 사용하면 공용으로 함께 사용하는 변수를 만들 수 있다.
package static1;
public class Data3 {
public String name; // 인스턴스 변수
public static int count; // static이 붙으면 static변수, 정적변수, 클래스 변수라고 한다
public Data3(String name){
this.name=name;
count++;
}
}
package static1;
public class DataCountMain3 {
public static void main(String[] args) {
Data3 data1 = new Data3("A");
System.out.println("A count="+Data3.count);
Data3 data2 = new Data3("B");
System.out.println("B count="+Data3.count);
Data3 data3 = new Data3("C");
System.out.println("C count="+Data3.count);
}
}
필드의 종류
● 인스턴스 변수 - Static이 붙지 않은 멤버 변수
→ 인스턴스 변수는 인스턴스를 만들 때마다 새로 만들어진다
→ 인스턴스를 생성해야 사용이 가능하다
● 클래스 변수(=Static변수, 정적변수) - Static이 붙은 변수
→ Java를 시작할 때 딱 1개가 만들어진다, 여러 곳에 공유할 목적으로 사용된다
→ static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다. 그래서 클래스 변수라고 한다
Static 메소드
package static2;
public class DecoData {
private int instanceValue;
private static int staticValue;
public static void staticCall(){
//instanceValue++; //인스턴스 변수 접근 불가 , 컴파일 에러
//instanceMethod();//인스턴스 메소드 접근 불가, 컴파일 에러
staticValue++; // 정적 변수 접근
staticMethod(); // 정적 메소드 접근
}
public void instanceCall(){
instanceValue++; // 인스턴스 변수 접근
instanceMethod(); // 인스턴스 메소드 접근
staticValue++; // 정적 변수 접근
staticMethod(); // 정적 메소드 접근
}
private void instanceMethod(){
System.out.println("instanceValue="+instanceValue);
}
private static void staticMethod(){
System.out.println("ststicValue="+ staticValue);
}
}
package static2;
public class DecoDataMain {
public static void main(String[] args) {
System.out.println("1. 정적 호출");
DecoData.staticCall();
System.out.println("2. 인스턴스 호출1");
DecoData data1 = new DecoData();
data1.instanceCall();
System.out.println("3. 인스턴스 호출1");
DecoData data2 = new DecoData();
data2.instanceCall();
}
}
---------------------------------------------
1. 정적 호출
ststicValue=1
2. 인스턴스 호출1
instanceValue=1
ststicValue=2
3. 인스턴스 호출1
instanceValue=1
ststicValue=3
Static import
package static2;
import static static2.DecoData.staticCall;
//import static static2.DecoData.*;
public class DecoDataMain {
public static void main(String[] args) {
System.out.println("1. 정적 호출");
staticCall();
staticCall();
staticCall();
main() 메소드는 정적 메소드!
정적 메소드는 같은 클래스 내부에서 정적 메소드만 호출할 수 있다.
예시)
다음 코드를 참고하여 Class 작성하기
package static2.ex;
public class CarMain {
public static void main(String[] args) {
Car car1 = new Car("K3");
Car car2 = new Car("G80");
Car car3 = new Car("Model Y");
Car.showTotalCars(); //구매한 차량 수를 출력하는 static 메서드
}
}
실행결과
차량 구입, 이름: K3
차량 구입, 이름: G80
차량 구입, 이름: Model Y
구매한 차량 수: 3
package static2.ex;
public class Car {
private static int totalCars;
private String name;
public Car(String name){
System.out.println("차량 구입, 이름:"+name);
this.name=name;
}
public static void showTotalCars() {
System.out.println("구매한 차량 수: "+totalCars);
}
}
예시) 수학 유틸리티 클래스
실행 코드
package static2.ex;
public class MathArrayUtilsMain {
public static void main(String[] args) {
int[] values = {1, 2, 3, 4, 5};
System.out.println("sum=" + MathArrayUtils.sum(values));
System.out.println("average=" + MathArrayUtils.average(values));
System.out.println("min=" + MathArrayUtils.min(values));
System.out.println("max=" + MathArrayUtils.max(values));
}
}
package static2.ex;
public class MathArrayUtils {
private MathArrayUtils() {
//인스턴스생성을 private로 막기
}
public static int sum(int[] values) {
int total = 0;
for (int value : values) {
total += value;
}
return total;
}
public static double average(int[] values) {
return (double) sum(values) / values.length;
}
public static int min(int[] values) {
int minValue = values[0];
for (int value : values) {
if (value < minValue) {
minValue = value;
}
}
return minValue;
}
public static int max(int[] values) {
int maxValue = values[0];
for (int value : values) {
if (value > maxValue) {
maxValue = value;
}
}
return maxValue;
}
}
package static2.ex;
import static static2.ex.MathArrayUtils.*;
public class MathArrayUtilsMain {
public static void main(String[] args) {
int[] values = {1, 2, 3, 4, 5};
System.out.println("sum=" + sum(values));
System.out.println("average=" + average(values));
System.out.println("min=" + min(values));
System.out.println("max=" + max(values));
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA] 상속★ (1) | 2024.03.05 |
---|---|
[JAVA] Final 변수 (0) | 2024.03.05 |
[JAVA] 접근 제어자 (0) | 2024.03.03 |
[JAVA] 패키지 (0) | 2024.03.02 |
[JAVA] 생성자 (0) | 2024.03.02 |