728x90
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));
    }
}
728x90

'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

+ Recent posts