JAVA DAY15 - 객체지향 프로그래밍 Ⅰ - 2 static, JVM

어뮤즈온·2020년 12월 2일
0

초급자바

목록 보기
21/31

Static

  • static을 붙이면 프로그램 실행시 메모리에 올라간다.
  • 객체생성을 하지 않아도 사용할 수 있다.
  • static을 붙인 변수는 객체간에 변수의 값을 공유한다.
  • static이 붙은 멤버의 명칭 : 클래스 변수, 클래스 메서드
  • static이 붙지 않은 멤버의 명칭 : 인스턴스 변수, 인스턴스 메서드
class Human {
	
	int account;
	
	void saveMoney(int money){
		account += money;
		System.out.println("통장 잔고 : " + account);
	}
	
	static int dateAccount;
	
	void saveDateMoney(int money){
		dateAccount += money;
		System.out.println("데이트 통장 잔고 : " + dateAccount);
	}
	
}

public class Static {
	
	//값을 공유하기 위해 static을 붙인다.
	static int var;
		
	public static void main(String[] args) {
		Human 철수 = new Human();
		Human 영희 = new Human();
		
		철수.saveMoney(100000);
        	//통장잔고 : 100000 출력
		영희.saveMoney(200000);
        	//통장 잔고 : 200000 출력
		
		철수.saveDateMoney(200000);
        	//데이트 통장 잔고 : 200000 출력
		영희.saveDateMoney(200000);
		//데이트 통장 잔고 : 400000 출력
	}
	
}

유틸리티 성향의 메서드

  • 유틸리티 성향의 메서드인 경우 static을 붙인다.
  • Math.random() Math.round() System.out.println()
import java.util.Scanner;

public class ScanUtil {
	
	private static Scanner s = new Scanner(System.in);
	
	public static String nextLine(){
		return s.nextLine();
	}
	
	public static int nextInt(){
		return Integer.parseInt(s.nextLine());
	}
	
} //다른 클래스 안에서도 객체생성을 하지 않아도 공유가 가능하다.

//다른 클래스안에서 Scanner 객체생성이 필요없이 공유하여 사용할 수 있다.
public static void main(String[] args) {
	System.out.println("문자열 입력>");
	String str = ScanUtil.nextLine();
	System.out.println(str);
		
	System.out.println("숫자 입력>");
	int num = ScanUtil.nextInt();
	System.out.println(num);
}

JVM(Java Virtual Machine)

  • 자바로 만들어진 프로그램이 실행되는 컴퓨터 안의 가상 컴퓨터
  • 운영체제 -> JVM -> 자바 프로그램
  • 장점 : 운영체제에 상관없이 실행할 수 있다.
  • 단점 : 속도가 느리다.

JVM 메모리 구조

  • Method Area(메서드 영역) : 클래스 멤버가 저장된다. (static이 붙은 것)
  • Call Stack(호출 스택) : 현재 호출되어 있는 메서드가 저장된다. (출력 후 Call Stack에서 삭제된다.)
  • Heap : 객체가 저장된다.
public class JVM {
	
    	//시점을 생각해야하는 문제
    	int instanceVar; //객체생성 후에 메모리에 저장
    	static int classVar; //프로그램 실행시 메모리에 저장
    
    	void instanceMethod(){ //객체생성 후에 메모리에 저장
    		System.out.pritnln(instanceVar);
        	System.out.println(classVar);
        }
    
    	static void classMethod(){
    		//System.out.println(instanceVar);
        	//오류 : classMethod()는 프로그램 실행시 메모리에 저장되지만
        	//instanceVar는 객체생성 후에 메모리에 저장되기 때문
        	System.out.println(classVar);
   	 }

	//JVM의 흐름 이해하기
	public static void main(String[] args) {
    		//1. 프로그램 실행시 main(), classVar, classMethod()가 MethodArea에 저장됨
        	//2. main()이 호출되어 callStack에 저장됨
        
        	System.out.println(classVar);
        	//3. System클래스의 out이 MethodArea에 저장됨
        	//4. println()이 호출되어 CallStack에 저장됨
        	//5. println()이 classVar를 출력 후 CallStack에서 삭제됨
        
        	classMethod();
        	//6. classMethod()가 호출되어 CallStack에 저장됨
        	//7. instanceVar는 메모리에 존재하지 않기 때문에 사용할 수 없음
        	//8. println()이 호출되어 CallStack에 저장됨
        	//9. println()이 classVar를 출력 후 CallStack에서 삭제됨	
        	//10. classMethod()의 실행이 종료되어 CallStack에서 삭제됨
        
        	JVM jvm = new JVM();
        	//11. JVM객체가 Heap에 저장됨
        	//12. jvm변수가 CallStack에 생성되고, JVM객체의 주소가 저장됨
        
        	System.out.println(jvm.instanceVar);
        	//13. println()이 호출되어 CallStack에 저장됨
        	//14. println()이 instanceVar를 출력 후 CallStack에서 삭제됨
        
        	jvm.instanceMethod();
        	//15. instanceMethod()가 호출되어 CallStack에 저장됨
        	//16. println()이 호출되어 CallStack에 저장됨
        	//17. println()이 instanceVar를 출력 후 CallStack에서 삭제됨
        	//18. println()이 호출되어 CallStack에 저장됨
        	//19. println()이 classVar를 출력 후 CallStack에서 삭제됨
        	//20. instanceMethod()의 실행이 종료되어 CallStack에서 삭제됨
        
        	jvm = null;
            	//21. jvm변수에 null이 저장됨
            	//22. 어디에서도 주소를 참조하지 않는 JVM객체는 GarbageCollector에 의해 삭제됨 
            
            	//23. main()의 실행이 종료되어 CallStack에서 삭제됨
            	//24. 프로그램이 종료되고 MethodArea의 데이터가 삭제됨
    	}

}
profile
Hello, world!

0개의 댓글