일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자바기초
- 자바
- 핀트투자후기
- 핀트 후기
- 예외
- 직장인소액투자
- 웹개발
- 직장인부업
- 코틀린
- 핀트수익률
- 소액투자
- 로보어드바이저
- 핀트 수익률
- 재태크
- 직장인 소액투자
- 자바문법
- Java
- fint 수익률
- 개발
- AI투자
- 웹
- 핀트후기
- 직장인재태크
- git
- fint
- 인텔리제이
- 핀트투자
- fint후기
- 핀트
- 자동투자
- Today
- Total
하루하루 살아남기
[Java] 변수의 스코프 / Static 본문
변수의 스코프
프로그램에 사용하는 변수들은 사용 가능한 범위가 있어요
자바는 변수가 선언된 블록이 변수의 사용 범위에요
public class ScopeClass {
int globalVariable = 10;
}
globalVariable 변수는 ScopeClass라는 클래스 블록에 포함되어 있어요.
따라서 globalVariable 변수의 사용범위는 해당 클래스 (ScopeClass) 전체라고 할 수 있어요.
public class ScopeClass {
int gloablVariable = 10;
public void localScopeVariable(int value) {
int localScope = 20;
}
}
int형의 매개변수를 받는 localScopeVariable이라는 메서드를 생성했어요.
해당 메서드는 localScope라는 변수를 가지고 있어요.
public class ScopeClass {
int gloablVariable = 10;
public void localScopeVariable(int value) {
int localScope = 20;
System.out.println(gloablVariable);
System.out.println(value);
System.out.println(localScope);
}
public static void main(String[] args) {
ScopeClass scopeClass = new ScopeClass();
scopeClass.localScopeVariable(3);
}
}
main 메서드를 추가해 ScopeClass의 인스턴스를 생성하고 localScopeVariable를 인자(3) 과 함께 호출했더니,
에러없이 정상적으로 실행했어요. 이로써,
1. int value는 블록 바깥쪽에 있지만, 메서드 선언부에 위치하므로 해당 메서드 블록 내라고 보아도 된다.
2. globalVariable은 클래스 내부의 메서드에서 사용이 가능하다
3. 파라미터로 받는 value 또한 문제없이 사용 가능하다는 것을 알 수 있어요
public class ScopeClass {
int gloablVariable = 10;
public void localScopeVariable(int value) {
int localScope = 20;
System.out.println(gloablVariable);
System.out.println(value);
System.out.println(localScope);
}
// 컴파일 에러를 내게 만들 함수
public void localScopeVariableError(int value2) {
System.out.println(gloablVariable);
System.out.println(value);
System.out.println(localScope);
}
public static void main(String[] args) {
ScopeClass scopeClass = new ScopeClass();
scopeClass.localScopeVariable(3);
scopeClass.localScopeVariableError(30);
}
}
이번엔 localScopeVariableError라는 함수를 만들었어요.
이 localScopeVariableError함수에는 localScopeVariable함수의 파라미터인 value와, 변수인 localScope를
출력하도록 만들었어요. 실행시켜보니
편집기에서도 에러를 내뱉고, 실행결과 또한 에러가 나오네요.
이는 변수를 선언한 블록에 포함되지 않았기 때문입니다. 그래서 localScopeVariableError에서는
이 변수들을 사용할 수 없는겁니다 물론 value와 localScope를 출력하는 구문을 주석처리하면
문제없이 실행됩니다.
그럼 main 메서드에서 globalVariable 변수를 사용하는건 문제없을까요?
결론부터 말씀드리면 아닙니다. 헷갈리실수도 있는데 하나씩 해보겠습니다
모든 클래스는 인스턴스화 하지 않으면 사용할수 없어요. 그런데 static이라는 키워드가 붙으면
인스턴스화하지 않아도 static한 메서드나 static한 변수를 사용할 수 있어요
그래서 main메서드는 main메서드가 포함된 클래스를 인스턴스화 하지않아도 사용이 가능해요
단 static한 메서드는 객체를 생성하지 않아도 static한 메서드나 static한 변수(클래스)를 사용할수 있지만
static하지않은 변수(인스턴스)는 사용할 수 없어요.
static한 메서드는 인스턴스가 없어도 언제든지 사용할수 있지만 static하지않은 메서드는 인스턴스가 있어야 사용할수 있기 때문이에요
반대로 static하지않은 메서드는 언제든지 사용할수있는 static한 메서드를 사용할수 있다
인스턴스화란?
main함수에서 ScopeClass scopeClass = new ScopeClass();
이런식으로 클래스로부터 객체를 만드는 과정을 인스턴스화라고 해요.
public class ScopeClass {
int gloablVariable = 10;
static int staticVariable = 7;
public void localScopeVariable(int value) {
int localScope = 20;
}
public static void main(String[] args) {
System.out.println(staticVariable);
}
}
static한 int형 변수인 staticVariable을 선언하고 main함수에서 사용이 가능하네요
static한 메서드에서 static하지 않은 변수(globalVariable)을 사용하려면 어떻게 해야 할까요?
당연히 객체를 생성하고 사용하면 됩니다.
ScopeClass scopeClass = new ScopeClass();
System.out.println(scopeClass.gloablVariable);
이런 식으로요.
'개발 > Java' 카테고리의 다른 글
[Java / 자바] 메서드 오버로딩(Method Overloading) (0) | 2021.03.15 |
---|---|
[Java / 자바] this 키워드 (0) | 2021.03.14 |
[Java / 자바] 생성자 (0) | 2021.03.14 |
[Java] 자바 열거형(enum) (0) | 2021.03.11 |
[Java] 변수의 Scope / Static (2) (0) | 2021.03.09 |