정적(static) 멤버 , heap, stack, beans

kmb·2022년 1월 4일
0

자바

목록 보기
11/31
post-thumbnail

정적(static) 멤버 : 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드(field)와 메서드(method)를 의미. 이를 각각 정적 필드, 정적 메서드라고 부른다.
정적 멤버는 객체에 소속된 멤버가 아니라 클래스에 소속된 멤버이므로 클래스 멤버라고도 부른다.

 

  • 정적 멤버 선언

정적 필드와 정적 메서드를 선언하는 방법은 static 키워드를 추가하는 것이다.

public class 클래스 {
	
    static 타입 필드 [= 초기값];	// 정적 필드
    
    static 리턴타입 메서드 (매개변수) {   // 정적 메서드
    	...
    }
}

 

  • 정적 필드 vs 인스턴스 필드

어떤 필드를 선언할지에 대한 판단 기준은 다음과 같다.

객체마다 가지고 있어야 할 데이터라면 인스턴스 필드
공용적인 데이터라면 정적 필드

 

  • 정적 멤버 사용 방법
클래스.필드;

클래스.메서드(매개변수, ...);

 

  • 정적 멤버 예시
public class Calculator {
	
    static double pi = 3.14;  // 정적 필드
    
    static int plus(int x, int y) {  // 정적 메서드
    	return x + y;
    }
    
    static int minus(int x, int y) {  // 정적 메서드
    	return x - y;
    }
}

public class CalculatorExample {
	
    public static void main(String[] args) {
    	
        double result1 = 10 * 10 * Calculator.pi;
        int result2 = Calculator.plus(10, 5);
        int result3 = Calculator.minus(10, 5);
        
        System.out.println("result1 = " + result1);  // result1 = 314.0
        System.out.println("result2 = " + result2);  // result2 = 15
        System.out.println("result3 = " + result3);  // result3 = 5
    }
}

 

static : 프로그램이 시작되기 전에 메모리에 필요한것들 올리고 종료될때까지 소멸되지않고 메모리에 계속 머문다. (정적 영역)
--> 즉 프로그램의 시작전부터 끝날때까지 메모리에 존재하는 영역.

heap : 프로그램이 실행되고 있는 도중에 필요할때마다 메모리에 올리고 일정시간이 지나면 소멸된다. (동적 영역)

stack : 행위에 대한 정보가 시작할때 메모리에 올라가고 행위가 끝나면 메모리에서 사라진다. (동적영역)
--> 가장 생명주기가 짧다.

<생명주기 크기>
static > heap > stack


Beans : 여러가지 자료형을 가지고 있는 클래스 ex) (20, 'A')

사용자가 Beans를 만든다면 그것은 커스텀 자료형이다.

class VarEx {  // 커스텀 자료형

    static int n1 = 10;
    static char c1 = 'A';
}

public class MyVar {

    static int num = 500;

    public static void main(String[] args) {
        
        System.out.println(VarEx.n1);  
        System.out.println(VarEx.c1);

        System.out.println(num);
        System.out.println(MyVar.num); 
    }
}

static 키워드를 가지고 있는 모든것을 static 메모리에 올린다. 즉 int n1 = 10 , char c1 = 'A' , main { } , int num = 500 을 static 메모리에 올린다.

실행(Ctrl+F11)을 하면 main { } 안에 있는 코드가 실행된다.


static정적이다. 즉 프로그램이 시작되기전에 static 메모리에 올라가고 프로그램이 종료되면 없어지기 때문에 프로그램 시작 도중에는 관리를 할 수 없다.

따라서 heap 영역을 이용해서 프로그램 시작 중간에 동적으로 관리가 가능하다.
클래스이름 참조변수 = new 클래스이름( ); 으로 정의하며 이는 heap 공간에 클래스이름( ) 내부에 가지고 있는 모든 데이터를 할당한다는 의미이다. (단 static은 제외)

class Note {

    int price = 2000;
}

public class VarEx05 {

    static int num = 500;

    public static void main(String[] args) {

        Note note1 = new Note();   // heap영역 (static영역을 제외한 Note 클래스가 가진 모든 데이터를 할당)
        Note note2 = new Note();   // heap영역 
        Note note3 = new Note();   // heap영역
        
        int age = 25;  // main 메서드의 stack 공간
    }
}

위 그림을 참고하면

Note 라는 커스텀자료형 클래스의 실제 데이터(int price=2000)는 heap 영역에 저장되며

note1, note2, note3 이라는 변수(객체, 객체변수, 참조변수)는 stack 영역의 공간에 있고
실제 데이터가 저장된 heap 영역의 참조값(reference value, 메모리에 저장된 주소를 연결해주는값)을
new 연산자를 통해서 return 받는다.

즉, 실제 데이터를 갖고 있는 heap 영역의 참조 값을 stack 영역의 객체가 갖고 있다.

출처 : 이지업 컨텐츠 내의 데어프로그래밍 자바강의

profile
꾸준하게

0개의 댓글