반응형
해당 강의를 보고 정리한 것입니다.
https://programmers.co.kr/learn/courses/5
변수의 스코프
: 프로그램상에서 사용되는 변수들의 사용 가능한 범위
- 변수가 선언된 블록이 사용범위
- 클래스의 속성으로 선언된 변수 globalScope의 사용범위는 클래스 전체public class VariableScopeExam { int globalScope = 10; public void scopeTest(int value) { int localScope = 20; System.out.println(globalScope); System.out.println(localScope); System.out.println(value); } }
- 매개변수로 선언된 value는 메서드 선언부에 존재하므로 사용범위는 해당 메서드 블럭 내부
- localScope는 메서드 블럭내에서 선언됐기 때문에 사용범위는 메소드 블록 내부 - main 메소드에서 사용하기
- 같은 클래스 안에 있는데 globalScope 변수 사용불가능
- main은 static한 메서드. static한 메서드에서는 static하지 않은 필드를 사용 할 수 없다.
public class VariableScopeExam { int globalScope = 10; public void scopeTest(int value) { int localScope = 20; System.out.println(globalScope); System.out.println(localScope); 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(globalScope); //에러 System.out.println(localScope); //에러 System.out.println(value); //에러 } }
- static
- 같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
- main 메서드는 static이라는 키워드로 메서드가 정의. -> static한 메서드
- static한 필드(필드 앞에 static 키워드)나, static한 메서드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.
public class VariableScopeExam{ int globalScope = 10; static int staticVal = 7; public void scopeTest(int value) { int localScope = 20; } public static void main(String[] args) { System.out.println(globalScope); //에러 System.out.println(localScope); //에러 System.out.println(value); //에러 System.out.println(staticVal); } }
- static한 변수는 공유됨
- static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성. 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나.
- globalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기 때문에 인스턴스 변수라고 칭함.(별개의 메모리)public class VariableScopeExam { int globalScope = 10; static int staticVal = 7; public void scopeTest(int value) { int localScope = 20; } public void scopeTest2(int value2) { } public static void main(String[] args) { VariableScopeExam v1 = new VariableScopeExam(); VariableScopeExam v2 = new VariableScopeExam(); v1.globalScope = 20; v2.globalScope = 30; v1.staticVal = 10; v2.staticVal = 20; System.out.println(v1.globalScope); // 20출력 System.out.println(v2.globalScope); // 30출력 System.out.println(v1.staticVal); // 20출력 System.out.println(v2.staticVal); // 20출력 System.out.println(VariableScopeExam.staticVal); // 20출력 } }
- staticVal같은 static한 필드는 클래스 변수라고 칭함. (공간이 하나이므로 값을 공유함)
- 클래스 변수는 "참조변수.변수명"으로 사용하기 보다는 "클래스명.변수명"으로 사용하는 것이 더 바람직 함.
v1.saticVal, v2.staticVal (x)
VariableScopeExam.staticVal (o)
열거형(enum)
: enumeration의 약자로 관련이 있는 상수들의 집합.
변수가 특정 값만 가져야 한다면 열거형을 사용한다!
- JDK5에서 추가됨.
- 이전 버전에서는 상수를 열거형 대신 사용함
문제점 :public class EnumExam { public static final String MALE = "MALE"; public static final String FEMALE ="FEMALE"; public static void main(String[] args) { String gender1; gender1 = EnumExam.MALE; gender1 = EnumExam.FEMALE; gender1 = "boy"; //에러가 나지 않음 } }
- String으로 선언된 gender1에는 MALE, FEMALE 둘 중 한 가지 값을 갖길 원하는데 gender1의 type이 string이기 때문에 gender1 = "boy"; 문장이 문제가 되지 않는다.
- gender1에 MALE, FEMALE이 아닌 다른 값이 오게 되면 이후에 문제를 야기할 수 있음. - 열거형
- 해당 문제가 일어나지 않도록 열거형(enum)을 사용.
- 정의 방법
- 사용 방법enum Gender{ MALE, FEMALE; }
public class EnumExam { enum Gender{ MALE, FEMALE; } public static void main(String[] args) { Gender gender2; gender2 = Gender.MALE; gender2 = Gender.FEMALE; gender2 = "boy"; //에러 } }
반응형
'Language > Java' 카테고리의 다른 글
자바 입문하기12 - 오버로딩, 오버라이딩, this(), 패키지 (0) | 2022.01.11 |
---|---|
자바 입문하기11 - 생성자, this (0) | 2022.01.11 |
자바 입문하기9 - String (0) | 2022.01.10 |
자바 입문하기8 - 클래스, 참조타입 (0) | 2022.01.10 |
자바 입문하기7 - for each (0) | 2022.01.07 |