J8 - 변수(Variable)

변수

프로그램에서는 몇 가지 이유로 변수가 필요한데, 이 변수라는 것은 문자나 숫자 같은 데이터를 담는 컨테이너 입니다. 변수에 담겨진 데이터로는 다른 데이터로 바꿀 수 있으며, 일반적으로 우리가 사용하는 언어에서 대명사와 비슷한 역할을 한다고 이해하면 쉽습니다.

예를 들어 수학에서 다음 식은 "x는 10이다"를 의미합니다.

x = 10

프로그램에서도 다음과 같이 적으면 "x에 10을 대입한다"라는 의미가 되고, 결과적으로 x는 10이 됩니다.

x = 10;

수학에서의 등호(=)는 "같다"라는 의미입니다만, Java에서는 "대입한다"라는 의미로 사용됩니다.
변수에는 여러 가지 값을 대입할 수 있습니다. 예를 들어 다음과 같은 것도 가능합니다.

var = 10;

또한 새로운 값을 다시 var에 재설정하는 것도 가능합니다.

var = 20;

이렇게 하면 var의 값이 20으로 바뀌게 됩니다. 즉 변수는 이름 그대로 내용을 자유롭게 변경할 수 잇습니다. 다음과 같이 입력하면 어떻게 될까요?

var = var+1;

위의 식은 수학적으로는 틀립니다. 이것이 등호의 용도나 의미가 수학에서의 그것과 다른 대표적인 예 입니다. Java에서는 var에 1을 더해 var라고 정의한다라는 의미지요. 수학에서는 양변이 같다는 의미 입니다만, Java에서는 우변의 계산 결과를 좌변에 대입한다는 의미 입니다.

변수의 이름을 붙이는 법

변수의 이름은 자유롭게 정할 수 있습니다. 프로그래머가 정한 이름을 식별자라고 하는데 변수명 외에도 클래스명에도 있습니다. 식별자는 모든 문자를 다 사용할 수 있는 것은 아닙니다. 아래 정리된 것 처럼, 알파벳 대, 소문자와 아라비아 숫자, _(언더바), $만이 가능하며 이 외의 문자를 사용하게 되면 에러가 발생합니다.


식별자에 사용할 수 있는 문자
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 _ $

아래와 같은 식별자인 경우 에러가 발생합니다.

ex#1   &prog  project-01


식별자를 만드는 방법은 다음과 같은 약속이 있습니다.


  • 첫 문자는 숫자로 시작할 수 없다
  • 영문자의 대, 소문자를 구별한다.
  • 예약어는 사용불가
  • 이름의 길이는 거의 제한이 없다(문자열의 데이터 범위와 같은 범위)
위의 약속을 참고해 보자면 다음의 식별자들은 사용할 수 없습니다.

99name   1_var

또한 대, 소문자를 구별하기 때문에 철자가 같아도 아래의 식별자는 모두 다른 이름으로 식별합니다.


program    Program    ProGram    proGram   PrograM


예약어

예약어는 Java에서 이미 정해진 단어로 선언이나 처리를 위한 것이므로 일반적인 식별자로 사용하지 못합니다.

abstract    assert    boolean    break    byte    case    catch    char    class    const    continue    default    do    double    else    enum    extends    final    finally    float    for    goto    if    implements    import    instanceof    int    interface    long    native    new    package    private    protected    public    return    short    static    strictfp    super    switch    synchronized    this    throw    throws    transient    try    void    volatile    while

예약어라도 문자의 일부를 대문자로 바꾸거나, 일부로 사용하는 것은 괜찮습니다.

ASSERT    Class    Void_09    thisprogram

식별자를 만드는 관습

많은 프로그래머들이 식별자를 정할 때 오랜 관습으로 굳어진 규칙을 따르는 데요. 이것을 지키지 않는 다고 해서 에러가 발생하거나 잘못된 것은 아닙니다. 하지만 익혀두면 다른 프로그래머들의 소스를 볼 때 한 눈에 알아보기 좋을 것 같네요

  • 소문자로 시작한다.
  • 2 개 이상의 단어를 쓸 때는 두 번째 이후의 단어는 첫 글자를 대문자로 쓰거나 언더바로 연결한다.
예를 들어보자면,

myfirstprogram -> myFirstProgram 혹은 my_first_program
bigdataproject -> bigDataProject 혹은 big_data_project

이런 식으로 만드는 거죠. 식별자가 클래스 이름이나 변수명, 패키지이름일 때에 따라 아래와 같은 관습을 따릅니다.

  • 클래스명
    • 기본적으로 소문자 사용
    • 첫글자는 대문자
      Myproject
      Bigdataproject
      My_class
  • 변수명, 패키지 이름 등
    • 기본적으로 소문자 사용
    • 첫글자는 소문자
      myProject
      bigDataProject
      my$class

변수 선언

변수의 값을 대입하기 전에 사용하는 변수의 형을 이름과 함께 선언합니다. 변수를 선언할 때는 반드시 형 이름, 변수 이름, 세미콜론의 순서를 따라 선언해야 합니다.

int a;
a = 1;

위의 코드를 보면 int라는 키워드가 있고 뒤에 a가 오고 마지막에 세미콜론(;)으로 구문을 마쳤습니다.
int가 바로 형 이름, 즉 정수형 데이터를 사용하겠다라는 의미이고, 그 다음 a는 그 정수형 데이터의 이름이 a라는 것이고 세미콜론으로 구문의 끝을 나타내고 있습니다.

값을 대입하기 전에 반드시 변수 선언을 해야 하며, Java에서 세미콜론은 생략할 수 없습니다.

변수 선언시 주의 사항


  1. 같은 이름의 변수를 다시 선언하면 안된다.
    데이터 형이 다르더라도 같은 이름의 변수가 다시 선언되면 안됩니다. 변수값을 재설정하는 것(변수에 다른 데이터값을 대입하는 것)과는 다른 것입니다.

    int a;
    a = 10;
    double a;
    a = 152;
    

    위에서 3행에 double a;로 변수 a를 또 선언했습니다. 이런 경우 에러가 발생합니다.
  2. 다른 형의 리터럴을 사용할 수 없습니다.
    변수 선언 시, 정수형이라고 int로 선언을 하면 선언한 변수에 정수가 아닌 실수형 데이터를 넣지 못합니다. 반드시 선언한 데이터 형의 리터럴을 할당해야 합니다.

    int a;
    a = 10.5 // int형 변수인 a에 10.5라는 double형 변수를 대입했다.
    

  3. 선언과 동시에 값을 할당 할 수 있다

    int a = 10;
    int b = c + 1;
    
  4. 여러 개의 변수를 한 번에 선언할 수 있다

    int a, b, c;
    
  5. 여러 개의 변수 중 일부 변수만 초기화(재설정) 할 수 있다.

    int a = 2, b, c;