Post

[Java] 변수

[Java] 변수

우리는 살아가면서 ‘변수’ 라는 용어를 간혹 들어봤을 것이다. ‘변수가 많네~’, ‘변수가 생길수도있어!’, ‘변수에 담아!’ 등 프로그래밍을 포함해 일상생활에서도 많이 쓰이곤한다. 이번 포스팅에서는 이러한 변수라는 용어가 프로그래밍 세계에서 어떤의미를 가지고 활용되는지 알아보자.


변수란?


프로그래밍 세계에서는 변수를 ‘단 하나의 값을 저장할 수 있는 메모리상의 공간’을 뜻한다. 이렇게 이름지어진 이유는 프로그래밍에서의 변수의 성질, 즉 ‘변수에 저장된 값은 변경될 수 있다’는 점이 수학에서의 ‘변하는 수’를 정의하고 있는 변수와 상통하고 있기 때문이다.

변수

변수


변수의 선언 및 초기화

변수 선언

프로그래밍에서 변수를 사용하기 위해선 선언을 해주어야한다. 변수 선언은 프로그래밍마다 다소 차이가 있는데 해당 포스팅은 자바의 변수를 다루기 때문에 자바의 변수 선언을 알아보자.

자바에서의 변수선언 방법은 다음과 같다.

1
2
3
4
5
int a;          // int 자료형의 a라는 변수를 선언

String b;       // Stirng 자료형의 b라는 변수를 선언

int c, d;   // int 자료형의 c, d라는 변수를 선언

위 예시 코드를 보면 a와 b라는 변수를 선언하였다. 근데 여기서 의문점이 생길 것이다. “변수를 사용하기 위해 a라는 명칭을 가진 변수와 b라는 명칭을 가진 변수를 선언했는데 각각의 변수명 앞에 int와 String은 뭐지?” 라고 말이다.
int와 String은 자바에서 ‘데이터타입’ 또는 ‘변수타입’ 이라고 부르며, 자바에서의 변수를 선언할 때는 반드시 변수명 앞에 데이터타입(변수타입)을 반드시 명시해주어야 한다. 데이터타입은 int, String 이외에도 char, long, boolean등이 있으며, 변수를 선언함에 있어 해당 변수에 어떤 데이터 유형을 담아 사용할 것인지 고려하여 위 예시와 같이 작성해주면 된다.

데이터타입의 자세한 내용은 아래링크를 참고바란다.
데이터타입 (with.자바) - WONMO LEE’s TECH BLOG

변수 초기화

변수 초기화란 변수를 사용하기 전에 처음으로 값을 저장하는 것을 말한다. 변수는 종류에 따라 변수의 초기화를 생략할 수 있지만, 사용전에 적절한 값으로 초기화하는 것이 좋다. 이유는 여러 프로그램이 공유하는 자원인 메모리에, 전에 다른 프로그램에 의해 저장된 ‘알 수 없는 값(쓰레기값)’이 남아있을 수 있기 때문이다. 변수의 초기화 방법은 2가지로, 변수 선언과 초기화를 동시에 하는 방법과, 선언과 초기화를 분리하여 초기화만하는 방법이 있다.

자바에서의 변수 초기화 방법은 다음과 같다.

1
2
3
4
5
6
7
8
9
// 선언 및 초기화
int a = 1;           // int 자료형의 a 변수를 선언하고 값을 1로 초기화
String b = "";       // Stirng 자료형의 b 변수를 선언하고 값을 빈문자열로 초기화
int c = 0, d = 0;    // int 자료형의 c, d 변수를 선언하고 값을 각각 0으로 초기화

// 초기화
a = 1;      // int 자료형의 a 변수값을 1로 초기화
b = "";     // Stirng 자료형의 b 변수값을 빈문자열로 초기화
c = 0;      // int 자료형의 c 변수값을 0으로 초기화

위 예시 코드를 보면 대입연산자 ‘=’와 우변에 값이 작성되어있다. ‘=’은 프로그래밍에서는 우변의 값을 좌변에 저장하라는 의미로, 변수 초기화 시 변수선언 형식에 대입연산자 ‘=’와 초기화값을 작성해주면된다.

앞전에 언급하였듯이 변수는 사용전 적절한 값으로 초기화해주는 것이 좋다. 따라서 변수의 선언과 초기화를 분리하여 작성하는 것보다 같이하는 작성하는 것을 지향하자.


변수의 명명규칙


변수명은 프로그래밍에서 ‘식별자’라고 하며, 식별자는 같은 영역 내에서 서로 구분될 수 있어야한다.

식별자를 만들 때의 규칙은 다음과 같다.

  • 대소문자가 구분되야하며, 길이에 제한이 없다.

    False와 false는 서로 다르게 간주된다.

  • 예약어를 사용할 수 없다.

    false는 예약어이기 때문에 식별자로 사용할 수 없지만 False는 가능하다.

  • 숫자로 시작할 수 없다.

    a123은 변수명으로 사용할 수 있지만, 123a는 변수명으로 사용 불가능하다.

  • 특수문자는 ‘_‘와 ‘$’만들 허용한다.

    _a는 변수명으로 사용가능하지만, #a는 사용 불가능하다.

예약어는 ‘키워드’ 또는 ‘리져브드 워드’ 라고 하며, 프로그래밍언어의 구문에 사용되는 단어를 의미한다. 예약어는 변수 뿐만 아니라 클래스, 메서드의 이름으로도 사용할 수 없다.

자바에서 사용되는 예약어는 다음과 같다. 자바 예약어

자바 예약어


선언위치에 따른 변수의 종류


자바에서 선언위치에 따른 변수의 종류에는 3가지가 있다.

  • 클래스 변수
  • 인스턴스 변수
  • 지역 변수

변수의 종류를 결정 짓는 중요한 요소는 ‘변수의 선언된 위치’ 이므로 변수의 종류를 파악하기 위해서는 변수가 어느 영역에 선언되었는지 확인하는 것이 중요하다. 멤버변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버변수 중 static이 붙은 것은 클래스변수, 붙지 않은 것은 인스턴스 변수이다. 글로만 보았을 때 이해가 잘 안갈 수 있으니 예제코드를 통해 알아보자.

1
2
3
4
5
6
7
8
class Car {
  static String color;              // 클래스 변수(static변수, 공유변수)
  int wheel;                        // 인스턴스 변수

  void engine() {             
        boolean power = true;       // 지역 변수
  }
}

위 클래스를 구성을 보면 변수 2개와 메서드 1개가 있다. 앞전에 언급하였듯이 선언위치에 따른 변수는 크게 멤버변수와 지역변수 2개로 나뉜다. color와 wheel변수는 이중 멤버변수에 해당하며 statice의 유무에 따라 다시 한번 클래스 변수 또는 인스턴스 변수로 세분화 되어 나뉜다.

클래스변수와 인스턴스 변수를 이해하려면 static에 대한 이해가 필요한데, 해당 포스팅은 변수를 다루는 포스팅이므로 변수와 접목시켜 간단히만 설명하겠다.
static이 붙은 변수의 경우 어느 위치에 작성이 되어있든 자바프로그램이 실행되는 동시에 메모리에 올라간다. 반대로 static이 붙지 않은 변수의 경우 객체가 생성될 때 메모리에 올라간다. static유무에 따라 해당 변수를 사용할 수 있는 시점이 고려된다는 것이다. 따라서 color는 static이 있으므로 클래스변수에 해당하며, wheel는 static이 없으므로 인스턴스 변수에 해당하는 것이다.

다음 engine메서드를 보자. 해당 메서드안에는 power라는 변수가 선언 및 초기화 되어있다. power변수는 메서드 안에 선언되어있으므로 멤버변수가 아닌 지역변수이다. 눈치빠르신 독자분들은 이해하셨겠지만 멤버변수와 지역변수로 나뉘는 기준은 scope다. color변수와 wheel변수는 engine메서드와 동급으로 클래스 영역에서 최상위 포지션을 차지하고있다. 하지만 power변수의 경우 클래스 안의 engine메서드 안에 자리잡고 있다. 뎁스가 하나 더 있는 것이다.

변수종류 각각의 특징을 정리하면 다음과 같다.

변수의 종류      선언위치          생성시기    
클래스 변수      클래스 영역          클래스가 메모리에 올라갈 때    
인스턴스 변수      클래스 영역          인스턴스가 생성되었을 때    
지역변수      클래스 영역 이외의 영역          변수 선언문이 수행되었을 때    

인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스 마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 가진다.

따라서 위의 종류별 변수들의 특징들을 잘 알아두고 변수를 사용하는 것이 독자분들의 질 높은 프로그래밍에 도움이 될 것이다.


읽어주셔서 감사합니다. 😊

Reference
자바의 정석 - 남궁성

This post is licensed under CC BY 4.0 by the author.