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 키워드가 붙은 필드는 객체를 생서하기 전에 메모리 공간을 확보한다.
'Java > 모두의 자바' 카테고리의 다른 글
Chapter 06-32 생성자 (0) | 2022.02.07 |
---|---|
Chapter 05-31 열거형(Enum) (0) | 2022.02.06 |
Chapter 05-29 String 클래스의 메서드 (0) | 2022.02.05 |
Chapter 05-29 String 클래스의 메서드 (0) | 2022.02.05 |
Chapter 05-28 메서드 사용하기 (0) | 2022.02.05 |