자바의 정석 Chapter 2.1 - 변수 (Variable)
자바의 정석 2장부터는 하나의 개념에 대해서 3개 이상의 작은 챕터들의 집합으로 이러우져 있다.
따라서, 작은 챕터 기준으로 글을 작성하려고 한다.
소프트웨어(프로그램)의 가장 근본적인 정의는 하드웨어를 제어하기 위해 사용되는 명령어들의 집합으로 설명한다.
현재 개발자로서 실제 실무에서 사용되는 소프트웨어의 정의를 작성해 본다면 아래와 같이 정의할 수 있을 것 같다.
다양한 종류의 정보를 그 특성에 맞게 분류하고, 이렇게 분류된 데이터를 연산을 통해 가공하여 최종 결과를 도출하는 과정
따라서, 프로그래밍 개발을 하는 데 있어서 값(data)은 매우 중요한 역할을 한다.
1. 변수 (Variable)란?
프로그래밍 능력 중의 하나가 가장 중요한 '값(data)'을 저장할 수 있는 메모리상의 공간을 의미
이 공간에 저장된 값을 변경할 수 있기에, '변수'라는 말로 사용한다.
하나의 변수에는 한가지의 값(data)만 저장할 수 있다.
변수에 새로운 값(data)를 저장하면, 이전의 값이 지워진다.
2. 변수의 선언
변수를 사용하는 가장 기본은 바로 선언이다.
선언이란 이러한 저장 공간을 사용하겠다고 정의하는 것.
변수를 선언하는 방법은 아래와 같다.
변수 선언은 변수의 종류를 뜻하는 변수 타입을 지정해야 한다.
변수 타입이란, 저장하고자 하는 공간의 크기를 유형별로 정의 내린 것으로 생각할 수 있다.
변수 타입을 지정한 뒤, 변수의 이름을 정해 작성한다.
[변수 이름 : 정해진 변수에 원하는 값을 넣기 위해서는 변수별로 구분할 수 있어야 하며, 이것을 이름으로 구분한다.]
그리고 ;으로 마무리를 하면 변수선언은 끝이 난다.
3. 변수의 초기화
변수를 선언한 이후에는 변수 사용이 가능하다.
변수 사용의 기본은 초기화이다. [변수를 사용하기 전, 처음으로 값을 저장하는 것을 의미]
메모리는 기본적으로 모든 소프트웨어가 공유하는 자원
따라서, 공간 할당을 하고 나면 여러 프로그램들의 공유 활동으로 인해 쓰레기(Garbege) 값이 존재할 수 있다.
이러한 문제를 해결하기 위해 테이터 초기화 작업은 필수이다.
변수에 값을 저장할 때, '='연산자를 통해 값을 저장한다. (좌변의 변수에 우변의 데이터를 저장한다는 뜻)
변수 선언은, 하나의 선언에 한 줄씩 선언하는 방식과, 동일한 타입끼리 통합하여 선언하는 방식이 있다.
변수를 각각 선언하는 방법 | 동일한 변수 타입 별로 그룹지어 선언하는 방법 |
---|---|
int a = 0; int b = 0; | int a=0, b=0; |
double x = 0.0f; doubld y = 0.0f; | double x=0.0f, y = 0.0f; |
4. 변수 사용 예제
class VarEx1 {
public static void main(String args[]) {
int year = 0;
int age = 14;
System.out.println(year);
System.out.println(age);
year = age + 2000; // 변수 age의 값에 2000을 더해서 변수 year에 저장
age = age + 1; // 변수 age에 저장된 값을 1 증가시킨다.
System.out.println(year);
System.out.println(age);
}
}
/* 실행 결과
0
14
2014
15
*/
두 개의 변수 age와 year을 선언하여, 값을 저장하고 출력하는 간단한 예제
year과 age를 0과 14로 초기화하여 System.out.println() 함수로 출력을 하였다.
- System.out.println(year); // 변수 year의 값을 화면에 출력
- System.out.println(age); // 변수 age의 값을 화면에 출력
그다음 문장은 year에 2000을 더해서 다시 저장하라는 의미
- year = age + 2000;
그 다음 문장은 age에 1을 더해서 다시 저장하라는 의미
- age = age + 1;
- 단계적으로 보면 아래와 같다.
- year = age + 2000;
- year = 14 + 2000; // 변수 age에 저장된 값(14)을 읽어와서 식에 사용
- year = 2014 // 변수 year에 2014를 저장
위 설명에서 알 수 있듯이 변수의 값을 사용하기 위해서는 변수 이름을 그대로 사용하면 됨.
-
- age = age + 1;
- age = 14 + 1; // 변수 age에 저장된 값을 읽어온다
- age = 15; // 변수 age에 15를 저장한다. age의 연산은 아래와 같다.
5. 두 변수의 값 교환
두 변수의 값을 서로 교환하기 위해서는 어떻게 하는 것이 좋을까?
int x = 10, y =20 이 있다고 가정해 보자.
단순히 생각하면 x에 y를 넣고 y에 x를 넣으면 될 것으로 보이지만 실제 그렇게 하면 아래와 같은 결과가 나온다.
첫 번째 단계에서 y값을 x에 대입할 때 이미 x의 값이 사라졌다.
따라서, y로 대치되기 전 x의 기존 값을 그대로 y로 저장하는 경우를 적용할 수 없게 된다.
머릿속으로만 두 값을 변경시킨다고 할 때, 우리는 무의식적으로 x의 값을 기억한 상황에서 y값을 x에 저장한다.
따라서, 무의식적으로 x값을 기억하는 메커니즘을 코드에도 적용해야 한다.
그 방법을 그대로 적용하기 위해서는 값을 기억하기 위한 임시 변수가 필요하게 된다.
따라서, tmp라는 임시 변수를 하나 더 선언한다.
그 후, x의 값을 미리 tmp에 저장한다.
그리고 x에 y를 대입하고, 임시변수에 저장된 x의 값을 y에 저장하면 교환이 완료된다.
int x = 10;
int y = 20;
int tmp;
- 이후 순서는 아래 그림과 같다.
- 책에서는 적절한 비유로 두 컵의 내용물을 바꾸기 위해서는 하나의 컵이 더 필요한 것과 같은 이치라 한다.
- 위 내용을 자바 코드로 작성하면 아래와 같다.
class VarEx2 {
public static void main(String args[]) {
int x = 10, y = 20;
int tmp = 0;
System.out.println("x:" + x + " y:" + y);
tmp = x;
x = y;
y = tmp;
System.out.println("x:" + x + " y:" + y);
}
}
- 위 소스코드를 단계적으로 작성해 보면 아래와 같다.
System.out.println("x:" + x + " y:" + y);
-> System.out.println("x:" + 10 + " y:" + 20);
-> System.out.println("x:10" + " y:" + 20);
-> System.out.println("x:10 y:" + 20);
-> System.out.println("x:10 y:20);
- 여기서 + 연산자의 경우 숫자데이터들 간의 연산은 덧셈을 실행하지만, 문자열이 들어가면 그대로 결합하는 연산을 한다.
- 이후 문자열 관련 챕터에서 자세하게 다룰 예정
6. 변수의 명명규칙
'변수의 이름'처럼 프로그래밍에서 사용하는 모든 이름을 '식별자(identifier)'라고 하며, 식별자는 같은 영역 내에서 서로 구분될 수 있어야 한다. 또한 식별자를 만들 때는 아래 규칙을 지켜야 한다.
1. 대소문자가 구분되며, 길이에 제한이 없다.
- True와 true는 서로 다른 것으로 간주한다.
2. 예약어를 사용해서는 안 된다.
- true는 예약어라서 사용할 수 없지만, True는 가능하다.
3. 숫자로 시작해서는 안 된다.
- top10는 허용하지만, 7up은 혀용되지 않는다.
4. 특수문자는 '_'와 '$'만을 허용한다.
- $harp은 허용되지만, S#arp은 허용되지 않는다.
예약어란, 키워드(keyboard) 또는 '리져브드 워드 (reserved word)'라고 하는데, 프로그래밍 언어의 구문에 사용되는 단어다.
따라서, 예약어는 클래스, 변수, 메서드 이름으로 사용할 수 없다.
abstruct | default | if | package | this |
assert | do | goto | private | throw |
boolean | double | implements | protected | thorws |
break | else | import | public | transient |
byte | enum | instanceof | return | true |
case | extends | int | short | try |
catch | false | interface | static | void |
char | final | long | stririfp | volatile |
class | finally | native | super | while |
const | float | new | switch | |
continue | for | null | synchronized |
여기까지 설명한 변수 명명규칙에 대해서는 자바 컴파일과정에서 무조건적으로 오류를 발생시키는 규칙이다.
따라서, 반드시 지켜야 하며, 해당 사항을 지키지 않으면 문제가 발생한다. (무조건 error가 발생하기에...)
다만, 이 외적으로 자바 개발자들 간의 암묵적으로 만든 규칙들이 있다.
이 규칙은 컴파일과 실행환경에서 문제를 일으키지는 않는 규칙들이나, 개발자들 간의 원활한 소통을 위해 만든 규칙이다.
1. 클래스 이름의 첫 글자는 대문자로 한다.
- 변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.
이것을 통해 해당 이름이 클래스인지 아닌지 구분이 가능하다
2. 여러 단어로 이루어진 이름은 단어의 앞글자를 대문자로 한다.
- lastIndexOf, StringBuilder
3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
- PI, MAX_NUMBER
또한 이름을 정할 때에는, 이름만 보고도 어떤 역할을 하는 것인지 알 수 있는 이름으로 정하는 것이 중요
즉, 의미 있는 이름을 정하는 것이 가독성과 협업 면에서 매우 좋음.
그리고, 변수명 옆에 주석을 통한 설명을 작성하는 것이 가장 이상적이다.
생성형 AI의 가장 잘하는 것 중 하나가 명명 규칙 및 설명 작성을 기가막히게 한다.
이런 부분에도 활용을 하면 매우 좋을 것 같다.
ex)
int curPos; // 현재 커서 위치
int lastPos; // 마지막 위치