본문 바로가기
자바(Java)

자바 입문하기10 - scope, static, enum

by codeyaki 2022. 1. 10.
반응형

해당 강의를 보고 정리한 것입니다.

https://programmers.co.kr/learn/courses/5

 

자바 입문

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금

programmers.co.kr


변수의 스코프

: 프로그램상에서 사용되는 변수들의 사용 가능한 범위

  • 변수가 선언된 블록이 사용범위
    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);	
    	}
    }
    - 클래스의 속성으로 선언된 변수 globalScope의 사용범위는 클래스 전체
    - 매개변수로 선언된 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한 변수는 하나.
    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출력			
    	}
    
    }
     - globalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기 때문에 인스턴스 변수라고 칭함.(별개의 메모리)
    - 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";	//에러
    	}
    
    }​

 

반응형