-
개념원리 - (3) 자바_선언과 초기화개발/Java 2018. 2. 13. 15:51
처음으로 객체에 관한 수업을 듣고 숙제로 객체를 이용하여 간단한 인사 관리 시스템을 짜는데,
별 짓을 다 해도 내가 만든 사원 객체가 제대로 생성되지 않아서 새벽 늦게까지 끙끙댔다.
다음 날 스터디장한테 내가 짠 소스를 보여주며 대체 왜 이게 안되는지 이해를 할 수 없다고 했다.
스터디장이 한참을 들여다보더니 "이거 생성이 안됐잖아" 라며 간밤의 내 삽질을 뿌셔뿌셔해줬다.
그때까지 변수 또는 객체의 선언과 초기화, 생성에 대한 개념이 제대로 안 잡힌 상태에서 정신없이 코딩을 하다보니 그런 실수가 나온 것이다.
이 포스팅은 그 날의 나에게 헌정하는 글이다.
1. 선언
자바의 정석 1권을 펴보면 본격적으로 개념 강의에 들어가자마자 변수의 선언과 초기화에 대해서 설명한다.
변수를 "단 하나의 값을 저장할 수 있는 메모리 공간" 이라고 정의하는데,
여기서 주목할 것은 변수가 곧 "메모리 공간" 이라는 부분이다.
변수를 선언한다는 것은 곧 메모리의 빈 공간에 해당 변수를 위한 저장공간을 확보한다는 것이다.
2. 초기화
변수를 사용하기 전에는 초기화가 반드시 필요하다.
초기화는 변수를 사용하기 전에 처음으로 값을 저장하는 것이다.
초기화라는 용어를 쓰니 뭔가 색다른 작업을 하는 것 같지만
int a; ← 변수 a 선언(메모리 공간 확보)
a = 0; ← 변수 a의 값을 0으로 초기화
이게 전부다.
3. 클래스, 배열의 생성
이렇게 정리하고 나니 정말 별것도 아닌데 왜 헷갈렸나 싶을 정도로 간단하다.
배열이나 클래스를 선언하고 생성하는 부분에서 그나마 할말이 좀 많아질 것 같다.
기본 자료형은 위에서 본 것과 같이 변수 선언만으로 실제 데이터를 저장할 수 있는 메모리 공간 확보가 이루어진다.
그러나 클래스와 배열은 선언하는 것만으로는 사용할 수 없다.
new 생성자를 사용하여야 클래스 또는 배열을 위한 실제 저장공간이 생성된다.
이때, new 연산자는 힙 영역에 메모리를 할당하며, 참조값을 리턴하는 역할을 한다.
예를 들어 아래와 같이 선언했을 시
Animal a = new Animal();
- Animal : 사용자 정의 자료형
- a : Animal 인스턴스를 다루기 위한 참조변수. 스택 영역에 생성되어 Animal 인스턴스의 주소를 관리
- new : 힙 영역에 메모리 생성, 참조값 리턴
- Animal() : 생성자. new 연산자에 의해 생성된 메모리를 초기화함
로 정리할 수 있다.
클래스를 이용하여 예시를 들었으나 배열의 경우도 위와 동일하다.
(단, 배열의 선언과 초기화를 동시에 하는 경우에는 int[] score = { 50, 60, 70, 80, 90}; 과 같이 new int[] 생략 가능)
이는 배열, 클래스 등이 참조형 변수이기 때문이다.
자바의 정석 1권 27페이지에 아래와 같이 기본형과 참조형에 대해 아주 깔끔하게 나와있는데,
기본형 (primitive type)
- 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
- 계산을 위한 실제 값을 저장
참조형 (reference type)
- 8개의 기본형을 제외한 나머지 타입
- 객체의 주소를 저장
이 정의와 같이 배열 또는 클래스 선언에서 사용된 변수는 실제 데이터가 어디 있는지만 알고 있을 뿐,
그 위치에 어떤 값이 들어가있는지는 모른다.
그러므로 배열이나 클래스를 선언하기만 하고 생성하지 않으면 아무짝에도 쓸모 없게 되는 것이다.
다음에는 자바의 메모리 구조도 다시 한번 공부해야겠다....
'개발 > Java' 카테고리의 다른 글
설치된 자바 bit 확인하기 (0) 2018.02.20 개념원리 - (2) 자바_캡슐화와 다형성 (0) 2018.02.13 개념원리 - (1) 자바 & 객체지향_주요 개념과 특징 (0) 2018.02.13 댓글