초급JAVA 9 - Static, ScanUtil, JVM, 생성자

voilà!·2021년 11월 2일
0

초급JAVA

목록 보기
18/24

Static

  • static을 붙이면 프로그램 실행 시 메모리에 올라간다.
  • 객체생성을 하지 않아도 사용할 수 있다.
  • static을 붙인 변수는 객체간에 변수의 값을 공유한다.
    (지역변수가 아닌 전역변수에만 붙일 수 있음)
  • static이 붙은 멤버의 명칭 : 클래스 변수, 클래스 메서드
  • static이 붙지 않은 멤버의 명칭 : 인스턴스 변수, 인스턴스 메서드

값을 공유하기 위해 변수에 static을 붙인다.

static int var; // 클래스 변수 : 모든 객체가 같은 값을 공유
public static void main(String[] args) {
	//변수에 static 안붙이고 사용할 때
	Saram s1 = new Saram();
	Saram s2 = new Saram();
    
        s1.name = "철수";
	s2.name = "영희";
	s1.saveMoney(100000);
	s2.saveMoney(200000);
	
	s1.saveDateMoney(300000);
	s2.saveDateMoney(300000);
	
	
	//이제부터 사용자한테 입력받을 때 scanUtil 클래스 사용하기
	System.out.println("문자열 입력>");
	String str = ScanUtil.nextLine();
	System.out.println(str);
	
	System.out.println("숫자입력>");
	int num = ScanUtil.nextInt();
	System.out.println(num);
	
	System.out.println("2번째 숫자입력>");
	double num1 = ScanUtil.nextDouble();
	System.out.println(num1);
	
}
}

class Saram{
String name;
int account;
void saveMoney(int money){
	account += money;
	System.out.println(name + "의 통장잔고 : " + account);
}

//변수에 static 붙이고 사용할 때
static int dateAccount;

void saveDateMoney(int money){
	dateAccount += money;
	System.out.println("데이트 통장잔고 : " + dateAccount);
}

//메서드는 자주 사용되는 객체에 static을 붙인다
    

ScanUtil 클래스 생성으로 스캐너를 그때그때 만들지 않아도 된다.

package e_oop;

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());
}

public static long nextLong(){
	return Long.parseLong(s.nextLine());
}

public static double nextDouble(){
	return Double.parseDouble(s.nextLine());
}
}

JVM(Java Virtual Machine)

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

<JVM 메모리 구조>

  • Method Area(메서드 영역) : 프로그램이 시작할 때 클래스 멤버가 저장되고, 끝나면 삭제된다.
    -> static이 붙은 변수가 프로그램이 시작할 때 한번만 저장됨
  • Heap : 객체가 저장되고, 아무데서도 객체의 주소를 참조하지 않을 때 삭제된다.
  • Call Stack(호출스택) : 현재 호출되어 있는 메서드가 저장되고, 메서드 실행이 끝나면 삭제된다.
    -> static이 붙지 않은 변수가 저장됨

프로그램 실행 시 메모리 구조

	//1. 프로그램 실행 시 static이 붙은 main(), classVar, classMethod()가 MethodArea에 저장됨
	//2. 가장 먼저 main()가 호출되어 Call Stack에 저장됨
	
	System.out.println(classVar);
	//3. System클래스의 out이 MethodArea에 저장됨
	//4. println()이 호출되어 Call stack에 저장됨
	//5. println()이 classVar를 출력 후 Call Stack에서 삭제됨
	
	classMethod(); //클래스 멤버 호출
	//6.classMethod()가 호출되어 Call Stack에 저장되었다가 메서드가 종료되면 삭제됨 
	
	JVM jvm = new JVM();
	//7. JVM객체가 Heap에 저장됨
	//8. jvm변수가 Call Stack에 생성되고(지역변수는 Call Stack에서 만들어짐), JVM객체의 주소가 저장됨
	
	System.out.println(jvm.instanceVar);
	//9. println()이 호출되어 Call stack에 저장되었다가 jvm.instanceVar를 출력 후 Call Stack에서 삭제됨
	 
	jvm.instanceMethod(); //인스턴스 멤버 호출
	//10. instanceMethod()가 호출되어 Call Stack에 저장되었다가 메서드가 종료되면 삭제됨
	
	jvm = null;
	//11. jvm변수에 null이 저장됨 
	//12. 어디에서도 주소를 참조하지 않는 JVM객체는 GarbageCollector에 의해 삭제됨
	
	//13. main()의 실행이 종료되어 Call Stack에서 삭제됨
	//14. 프로그램이 종료되고  MethodArea의 데이터가 삭제됨
    

변수 초기화 방법

  1. 명시적 초기화
    int var = 10;
    static int classVar = 20;

  2. 초기화 블럭 (여러줄의 로직으로 초기화 할 때 사용)
    {
    var = 30; //(인스턴스 변수를 초기화 할 때 사용)
    }

    static {
    classVar = 40; //(클래스 변수를 초기화 할 때 사용)
    }

  3. 생성자 (인스턴스 변수를 초기화 할 때 사용하는 메서드)

  • 클래스와 같은 이름의 메서드
  • 인스턴스 변수를 초기화 하기 위해 사용한다.
  • 클래스에 생성자는 반드시 하나 이상 존재해야 한다.
  • 직접 선언해주지 않으면 컴파일러가 기본 생성자를 만들어준다.
  • 생성자는 리턴타입이 없다.
VariableInit(){ //클래스와 동일한 이름
	var = 50;
	// 생성자 사용 이유
	// 초기화에 여러줄의 코드가 필요할 때
	// 초기화에 파라미터가 필요할 때(=외부에서 값을 결정해서 가져올때)
}
public static void main(String[] args) {
	Init i = new Init(); //클래스와 동일한 이름의 메서드(= 생성자) 호출
	i.a = 10;
	i.b = 20;
	i.c = 30;
    
     	Init i2 = new Init();
	i2.a = 40;
	i2.b = 50;
	i2.c = 60;
	
	Init i3 = new Init(70, 80, 90); //생성자에 파라미터 사용해서 초기화, 위보다 간단함
	
	System.out.println(); //오버로딩이 된 메서드

}
	

생성자에서 초기화에 파라미터를 사용해야 하는 이유

class Init{
int a;
int b;
int c;

Init(int a, int b, int c){ //생성자 초기화 및 변수 초기화 위해 파라미터 받기
	this.a = a;  //파라미터로 받은 값을 지역변수로 초기화
	this.b = b;  //여기서 지역변수 : 객체의 주소를 저장
	this.c = c;
	//this : 인스턴스 변수와 지역변수의 이름이 같을 때 둘을 구분하기 위해 사용한다.
}

//오버로딩 : 같은 이름의 메서드를 여러개 정의하는 것 -> 구분은 파라미터로!(개수나 타입이 달라야 함)
Init(){ //똑같은 이름의 메서드가 복수개여도 가능 -> 구분은 파라미터로!
	this(10, 20, 30); //생성자의 첫줄에서만 사용할 수 있다.
	//this() : 생성자에서 다른 생성자를 호출할 때 사용한다. 여기서는 위 생성자를 호출!
	
}

}

0개의 댓글