자바(Java)〃필드와 변수의 선언위치와 초기값(전역변수,지역변수)

반응형

               


자바의 클래스는 필드와 메소드 그리고 생성자로 구성되어 있는데요. 그 중 첫번째 필드에 대해서 필드의 선언과 사용법을 정리해보겠습니다.


예전 객체지향언어를 정리하면서 사람을 객체라고 한다면 이름이나 나이, 키와 몸무게등등 특징적인 정보들이 필드라 하고 동작에 해당되는 움직인다, 물을 마신다, 밥먹는다 등등 동작에 해당되는 것들은 메소드라고 정리해볼 수 있었습니다. 


[프로그래밍/Java] - 자바(Java)〃객체지향 vs 절차지향 비교+장점과 단점


필드의 선언과 사용에 대해 알아보기전에 클래스의 구성과 객체의 구성을 먼저 볼게요. 객체는 필드와 메소드로 이루어져 있고 클래스는 객체에 생성자라는 요소가 하나 추가되었죠? 



그렇다면 필드는 클래스 내부에 사용된다는 것을 알겠는데.. 무엇때문에 선언 위치가 중요하냐하면 변수라는 요소때문에 그렇습니다. 개념적인 차원에서 변수와 필드는 선언 방식이 정말 비슷해서 그냥 모르고 지나칠수가 있는데 변수는 메소드와 생성자 내부에 사용되기 때문에 엄연히 다르기 때문이죠.

  

필드와 변수의 선언위치

물론 개발자들의 편의에 따라 필드는 클래스의 내부 멤버라해서 멤버변수라 부르기도 하고, 전역변수라고도 합니다. 위에서 언급한 변수는 지역변수라 부르고요. 하지만 개념을 정리하는 차원에서 그림과 같이 한번 알아보면...



필드는 클래스 내부 중괄호 { } 안에서 어디든지 선언이 가능하지만 메소드와 생성자의 요소 밖에만 생성이 되야합니다. 변수는 메소드와 생성자 중괄호 { } 안에 선언이 되야 하고요. 처음 글로만 정리하려다 보니 어려웠는데 그림으로 정리하니 한눈에 쏙 들어오는것 같습니다.


 필드의 선언과 초기값

하지만 필드와 변수는 선언이 비슷하죠. 필드는 기본타입 or 참조타입과 필드명으로 String name = "지훈"; / int age = "27"; 이렇게 선언이 되고 초기값을 생략할 수 있습니다.



초기값을 생략하면 위와 같이 기본 초기값으로 출력이 됩니다. int age;로만 선언을 하면 0이 출력되고 String name;으로만 선언하면 null로 출력이 된다는거죠. 그렇다면 필드와 변수는 무엇이 다를까요?


 지역변수는 초기화를 안하면 Exception(예외)가 발생한다. 

이번 주제에서는 위에서 정리한 필드를 전역변수라 부르고, 변수를 지역변수라고 부르겠습니다. 전역변수와 지역변수의 다른점은 전역변수는 초기화를 안해줘도 되지만 지역변수는 초기화를 안할시 에러가 발생하게 됩니다.


[프로그래밍/Java] - 자바(Java) Heap영역과 Stack영역 정리


그 차이는 전역변수는 클래스내의 멤버변수로 Heap 영역에 메모리가 저장되고, 지역변수는 메소드나 생성자내의 변수이기 때문에 Stack 영역에 메모리가 저장되기 때문인데요. Stack영역에 할당된 변수는 자동으로 초기화 되지 않아서 그렇습니다.


위 사진과 같이 지역변수를 초기화 해주지 않으면 " local variable ji may not have been initialized" 라고 예외가 떠버립니다. 해석해보면 지역변수인 ji가 초기화 설정이 되지 않았다라는 뜻이죠. 이런 이유에서 필드(전역 변수)와 변수(지역 변수)가 비슷하다는 뜻이였습니다.


반대로 Class 중괄호 { }안의 전역 변수는 초기값을 설정해주지 않아도 int 타입의 jun은 0이 출력되었습니다. 다행히도 이클립스에선 코딩을 하다가 지역변수를 초기화 해주지 않으면 빨간색 느낌표가 뜨니 그리 걱정할 필요는 없는것 같아요. 그래도 정리하는 차원에서 비교해봤습니다.


 필드(전역 변수)의 사용예제

위에서 정리해본 필드를 간단하게 사용한 예제 하나가 있습니다. 두개의 클래스를 만들어 한개의 클래스에 필드를 생성하고 나머지 클래스에서 필드를 읽어오는 예제입니다.


School이라는 클래스에 student / ban / age / score 필드를 생성했습니다. 마지막에 score는 초기값을 설정해주지 않고 자동으로 초기화되는지 한번 더 확인해보려고 넣었고요.


SchoolTest 클래스에는 필드를 읽는 역활을 하도록 간단한 작업을 해준 상태입니다. 클래스 외부에 생성된 필드를 가져오는 절차는 new 연산자를 이용해 school객체를 생성하여 접근하고 .(점)연산자를 이용해 객체의 필드나 메소드를 가져오는 방법입니다. 


이렇게 School 안에 있는 필드를 가져와서 SchoolTest에서 읽고 출력해보니 결과값이 만족스럽게 나왔습니다. 학원에서 공부할때는 개념보다는 직접 예제를 만들어보고 실행하고 이해하는 방식으로 배웠기 때문에 이 필드를 공부하고 이해하면서 6시간이나 걸렸네요. 얼른 다른 이론도 정리해놓고 홈페이지나 게시판 하나를 만들어야 하는데... 언제쯤 시작할지 걱정됩니다. 

반응형