본문 바로가기

JAVA

JAVA(20220.05.05)-변수의 범위와 static, enum, 생성자

변수의 범위 

  • 변수가 선언된 블럭이 변수의 사용범위이다
  • 블럭 바깥에 존재하는 매개변수도 메서드 선언부분에 포함되기 때문에 블럭 안에서 사용이 가능하다

 

ex)

public class ValableScopeExam{

        int globalScope = 10;   // 인스턴스 변수 

        public void scopeTest(int value){   
            int localScope = 10;
            System.out.println(globalScope);
            System.out.println(localScpe);
            System.out.println(value);
        }
    }

위 코드에서는 오류가 나지 않는다.

클래스의 속성으로 선언된 변수인 globalScope(클래스의 속성으로 선언된 변수는 클래스 전체에서 사용이 가능하다

메소드 선언부 매개변수인 value,

메소드에 선언된 localScope 모두 사용이 가능하다. 

 

 

 

 

** 그러나 globalScope는 같은 클래스 안에 있는 main메소드에서 사용이 불가능하다 

        public static void main(String[] args) {
            System.out.println(globalScope);  //오류
            System.out.println(localScope);   //오류
            System.out.println(value);        //오류  
        }   
 

왜냐하면 main함수는 static한 메소드이기 때문이다!

*static한 변수가 아니면 사용이 불가능하다*

 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(staticVal);      //사용가능 
        }

    }

 

여기서 static한 변수란?

  1. 정적변수
  2. 메모리에 올라갈 때 딱 한번 메모리 공간에 할당됨
  3. 그 값은 모든 인스턴스가 공유

그러면 main메소드에서 static한 변수말고는 사용이 불가능할까 ?

아니다 ! 

인스턴스화를 통해 가능하다 ! 

    ValableScopeExam v1 = new ValableScopeExam();
    ValableScopeExam v2 = new ValableScopeExam();
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  //20 이 출력된다. 
    System.out.println(v2.golbalScope);  //30이 출력된다. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.statVal);  //20 이 출력된다. 
    System.out.println(v2.statVal);  //20 이 출력된다. 

(메인 메소드안에서 작성되어야하는 코드임)

 

이렇듯 인스턴스화를 통해 non-static변수들을 출력할 수 있다. 

여기서 하나의 의문점

맨 아래 코드 두줄을 살펴보자

    System.out.println(v1.statVal);  //20 이 출력된다. 
    System.out.println(v2.statVal);  //20 이 출력된다. 

10과 20이 출력될 것이라는 예상과 달리 둘다 20이 출력된다. 

그 이유는 아까 위에서 static변수의 특징에 대해 언급했듯이 

한번 메모리에 할당되고(공간이 하나라는 뜻)  그 값을 공유하기 때문이다. 

 

 

 이런 변수를 클래스변수라고 부른다

클래스 변수는 클래스 이름을 직접 사용하는 것이 가능하다

ex) System.out.println(VariableScopeExam.staticVal);

 

 

 

eum(열거형)

  • enumerated type
  • 서로 연관된 상수들의 집합

왜 enum을 사용할까 ? 

 

 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"
            
            
            Gender gender2;
            gender2 = Gender.MALE;
            gender2 = Gender.FEMALE;
            
            gender2 = "boy";    //오류를 발생시킨다 
        }
    }
enum Gender{
	MALE, FEMALE;
 }

> gender가 MALE, FEMALE. 오직 두 개의 값만 가질 수 있게 하고 싶지만 enum을 사용하지 않게 되면 

gender1 = "boy"같은 상수 취급이 가능해져서 의도와 달라질 수 있음. 

하지만 enum을 사용하게 되면 내가 원하는 값만 가질 수 있도록 확정지을 수 있다. 

 

 

필드(Field)

  • 클래스를 정의할때 클래스의 속성을 저장하기 위해 선언하는 변수들

종류

  1. 지역변수 > 메소드 안에 선언된 변수
  2. 인스턴스변수 > 메소드 밖에서 static키워드 없이 선언된 변수. 객체가 생성될 때 생성됨
  3. 클래스변수(static) > 메소드 밖에서 선언된 변수 중 static 키워드를 사용하여 선언한 변수

 

생성자란?

  • 모든 클래스는 인스턴스화 될때 생성자를 사용한다 
  • 매개변수가 없는 생성자를 기본생성자라고 한다
  • 생성자를 만들지 않았을 때 컴파일시, 자동으로 기본생성자가 만들어진다 

생성자의 역할

  • 객체가 될 때 필드를 초기화

ex) 1  

public class EX1 {
	public EX1(){ 
		System.out.println("생성자");
	}
	
	public static void main(String[] args) {
		EX1 ex = new EX1(); // 인스턴스 생성 및 생성자 호출
	}
}
//오류가 없는 코드이다

생성자와 인스턴스 모두 매개변수가 없기 때문에 오류가 나지 않는다

ex) 2

 

public class EX2 {
	public EX2(String s){ 
		System.out.println(s+"생성자");
	}
	
	public static void main(String[] args) {
  		EX2 ex2 = new EX2("나는"); 
        // 인스턴스 생성 및 생성자 호출. 매개변수를 받으므로 오류가 나지 않는다
        	EX3 ex3 = new EX3();
        // 생성자가 매개변수를 받지만 인스턴스가 매개변수를 갖지 않으므로 오류가 발생한다 
	}
}

- ex2번의 코드 중  ex3의 오류를 해결하기 위해 매개변수를 받지 않는 생성자를 하나 만들어주면 문제가 해결되는데, 이를 메소드 오버로딩이라고 한다. 오버로딩은 다음 시간에 더 자세히 배워보도록 하겠다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

본 게시글은 프로그래머스<자바입문>의 내용을 복습하며 정리한 글입니다.