Java/모두의 자바

Chapter 05-30 변수의 스코프와 static

계란💕 2022. 2. 5. 23:25

05-30.1 변수 globalScope 선언

  Ex) 

<hide/>

package javaStudy;
public class VariableScopeExam {
	int globalScope = 10;
	public static void main(String[] args) {	
	}
}

  Note)

  - int 형 변수 globalScope를 선언했고 VariableScopeExam 클래스 전체에서 쓸 수 있다.  

 

 

05-30.2 ScopeTest 메서드 만들기 

  Ex)

<hide/>

package javaStudy;
public class VariableScopeExam {
	int globalScope = 10;
	
	public void scopeTest(int value) {
		int localValue = 20;
	}
	
	public static void main(String[] args) {	
	}
}

  Note) 메서드를 만들고 매개변수로 int형 value를 선언했다.

 

 

05-30.3 ScopeTest메서드 내에서 사용가능한 변수의 범위

<hide/>

package javaStudy;

public class VariableScopeExam {

	int globalScope = 10;
	
	public void scopeTest(int value) {
		int localScope = 20;
		System.out.println(localScope);
		System.out.println(globalScope);
		System.out.println(value);
	}
	public static void main(String[] args) {	
	}
}

  Note) 변수 localScope, globlaScope와 매개변수 value를 사용해도 오류가 일어나지 않는다.

  - 따라서 ScopeTest메서드 내에서 위의 변수들을 모두 사용할 수 있다. 

  - value는 메서드 선언부에 위치하므로 사용 범위는 해당 메서드 블록 내에서만 사용 가능.

 

 

05-30.4 새로운 ScopeTest2 선언

 

  Note) 새로운 메서드 ScopeTest2 에서 globalScope는 에러가 발생하지 않는다

  - 그러나 localScope, value 에 대해서는 컴파일 에러가 발생한다. 

  - 변수를 선언한 블록 내에 포함되지 않기 때문이다.

 

 

05-30.5 main 메서드에서 사용해보면 ?

  Note) 메인 메서드에서는 세 문장에서 모두 컴파일 에러가 나온다. 

  - static 키워드를 붙이면 클래스를 인스턴스화하지 않아도 static한 메서드나 static한 변수를 사용 가능. 

  - static한 변수: static 키워드를 이용해 선언한 변수

  - 즉, 객체를 생성하지 않아도 static한 메서드나 static한 변수(클래스 변수)를 사용 가능하다.

  - static하지 않은 변수(인스턴스 변수)는 사용 불가능하다.

 

 

05-30.6 static 키워드를 사용해서 int 변수 선언

<hide/>

package javaStudy;

public class VariableScopeExam {

	int globalScope = 10;
	static int staticVal = 7;
	
	public void scopeTest(int value) {
		int localScope = 20;
		System.out.println(localScope);
		System.out.println(globalScope);
		System.out.println(value);
	}
	public void scopeTest2(int value2) {
		System.out.println(globalScope);
//		System.out.println(localScope);
//		System.out.println(value);
		System.out.println(value2);
	
	}
	public static void main(String[] args) {
		
		System.out.println(staticVal);		
	}	
}

  Note)  이번에는 main 메서드에서 에러가 발생하지 않는다.

 

 

05-30.7 main 메서드 내에서 static하지 않은 변수는 사용하려면?

  - 객체를 생성하고 사용하면 된다.

  Ex)

<hide/>

public static void main(String[] args) {
		
		System.out.println(staticVal);
		
		VariableScopeExam v1 = new VariableScopeExam();
		System.out.println(v1.globalScope);
		VariableScopeExam v2 = new VariableScopeExam();	
		v1.globalScope = 10;
		v2.globalScope = 20;		
		System.out.println(v1.globalScope);
		System.out.println(v2.globalScope);
		
}

  Note) 출력 결과: 7, 10, 10, 20

  - VariableScopeExam v1 = new VariableScopeExam();

    -> VariableScopeExam클래스와 참조 변수 v1, new 키워드, 클래스명을 넣어 객체를 생성한다. 

    -> 참조 변수와 필드명이 꼭 필요하다. 

  - 참조변수 v1은 VariableScopeExam 이라는 인스턴스가 생성될 때,

    globalScope값을 저장하는 공간을 별개로 하나 가진다. 

  - v1.globalScope = 10; v1이 가진 globalScope에 10을 넣고 출력.

 

 

05-30.8 static한 변수에 값을 부여한 경우

  Ex)

<hide/>

package javaStudy;

public class VariableScopeExam {

	int globalScope = 10;
	static int staticVal = 7;
	
	public void scopeTest(int value) {
		int localScope = 20;
		System.out.println(localScope);
		System.out.println(globalScope);
		System.out.println(value);
	}
	public void scopeTest2(int value2) {
		System.out.println(globalScope);
//		System.out.println(localScope);
//		System.out.println(value);
		System.out.println(value2);
	
	}
	public static void main(String[] args) {
		
		System.out.println(staticVal);
		
		VariableScopeExam v1 = new VariableScopeExam();
		System.out.println(v1.globalScope);
		VariableScopeExam v2 = new VariableScopeExam();	
		v1.globalScope = 10;
		v2.globalScope = 20;		
		System.out.println(v1.globalScope);
		System.out.println(v2.globalScope);
		v1.staticVal = 50;
		v2.staticVal = 100;
		System.out.println(v1.staticVal);
		System.out.println(v2.staticVal);

	}	
}

  Note) 출력 결과: 7  10  10  20  100  100

  - 50과 100이 아닌 100과 100이 출력 됐다. 

  - static한 필드는 인스턴스를 생성할 때 만들어지는 게 아니다.

  - 값을 저장하는 공간더 하나 뿐이라 값을 공유한다.  .. "클래스 변수"

 

    -> Def) 클래스 변수: static 키워드가 붙은 변수를 의미한다. 

    -> 클래스를 생성하지 않아도 실행파일이 메모리에 로드될 때 생성한다. 

    -> 프로그램 시작할 때 생성했다가 프로그램 종료할 때 소멸된다.

    -> 클래스 변수는 인스턴스를 선언하지 않아도 사용가능하므로 " 클래스명. 클래스 변수명"이라 쓴다.

 

  -  globalScope같은 변수는 인스턴스를 생성할 때 생성되므로 "인스턴스 변수"라고 한다.

 

    -> Def) 인스턴스 변수: 클래스의 멤버로 설정하는 변수이다. 

    -> 클래스를 이용해 인스턴스화할 때 메모리에 할당된다. 

    -> 즉, new 연산자를 사용해 객체를 생성할 때 생성했다가 객체가 소멸할 때 소멸한다.

  - 지역변수: 클래스에 포함된 메서드에서 사용하는 변수이다. 

 

 

05-30.9 변수의 스코프와 static 실습

  Ex 1) main 메서드는 static한 메서드이다. 정상 작동하도록 코드를 수정하라.

<hide/>

package javaStudy;

public class VariableScopeExam {
	static int value = 10;
	public static void main(String[] args) {
		System.out.println(value);
	}
}

  Note) value 변수를 선언할 때 static 키워드를 붙여야 한다. 

  Def) 인스턴스화: 객체를 생성하는 과정

  - 인스턴스화하지 않으면 실체는 생기지 않는다, 

  - 하드디스크애 저장된 클래스를 사용할 수 있도록 메모리에 올려 주는 것을 뜻한다. 

  - 메모리에 올라와있는 자원만 사용이 가능하다. 

  - static이란 키워드는 해당 요서를 인스턴스화하지 않고 메모리에 올려 주는 역할을 한다. 

  - static으로 선언한 요소만 메모리에 따로 올려준다. 

  - 그래서 main메서드는 그 메서드를 감싸는 객체를 인스턴스화하지 않았는데도 사용 가능하다. 

  - static한 메서드에서는 static한 필드만 사용가능하다. 

  - static한 main 메서드에서 value 변수를 사용하기 위해 변수 선언할 때 static를 붙인다.

 

 

05-30.10 변수의 스코프와 static 실습

  Ex 2) static 한 변수는 여러 인스턴스에서 숫자를 변경해도 값이 모두 공유된다.

  - 다음 코드에서 taxi의 wheelCount와 suv의 wheelCount를 다르게 지정한 것처럼 보이지만 

  - 둘 다 마지막에 지정한 4라는 값을 가진다.  Car클래스의 wheelCount는 static하기 때문이다.

  - 코드 작성하여 결과 확인하라

<hide/>

package javaStudy;

public class StaticExam {
	public static void main(String[] args) {
	
		Car taxi = new Car();
		Car suv = new Car();	
		taxi.wheelCount = 10; 
		suv.wheelCount = 4;				
		System.out.println("taxi의 바퀴 수:" + taxi.wheelCount );
		System.out.println("suv의 바퀴 수:" + suv.wheelCount );		
	}

}

  Note) 

  - static 키워드가 붙은 요소들은 메모리에 이미 올라와 있다.

  - static 키워드가 붙은 필드는 객체를 생서하기 전에 메모리 공간을 확보한다.