1. 변수(variable)
1.1 변수(variable)이란?
"변수란, 단 하나의 값을 저장할 수 있는 메모리 공간"
하나의 변수에 단 하나의 값만 저장할 수 있으므로, 새로운 값을 저장하면 기존의 값은 사라진다.
1.2 변수의 선언과 초기화
int age;
int 라는 '변수타입'과 age라는 '변수이름'
- 변수의 초기화
변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 '초기화(innitialization)'해야 한다. 메모리는 여럽 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 '알 수 없는 값(쓰레기 값, garbage value)'가 남아있을 수 있기 때문이다.
변수에 값을 저장할 때는 대입 연산자 '=' 를 이용한다. 수학에서는 양변의 값이 같다는 뜻이지만, 자바와 C언어에서는 오른쪽의 값을 왼쪽(변수)에 저장하라는 뜻이다. 그래서 대입연산자의 왼쪽에는 반드시 변수가 와야 한다. 변수의 종류에 따라 변수의 초기화를 생략하는 경우도 있지만, 변수는 사용되기 전에 적절한 값으로 초기화하는 것이 좋다.
참고 | 지역변수는 사용되기 전에 초기화를 반드시 해야 하지만 클래스 변수와 인스턴스 변수는 초기화를 생략할 수 있다. 변수의 초기화에 대해서는 6장에서 자세히 배운다.
"변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것"
- 두 변수의 값 교환하기
int x = 10;
int y = 20;
다음과 같이 두 변수 x, y가 있을 때 두 변수에 담긴 값을 서로 바꾸려면 어떻게 할까?
변수 int temp 를 이용한다.
package ch02;
public class VarEx2 {
public static void main(String[] args) {
int x = 10, y = 20;
int temp = 0;
System.out.println("x : " + x + " y : " + y);
temp = x;
x = y;
y = temp;
System.out.println("x : " + x + " y : " + y);
}
}
1.3 변수의 명명규칙
'변수의 이름'처럼 프로그래밍에서 사용하는 모든 이름을 '식별자(identifier)'라고 하며 식별자는 같은 영역 내에서 서로 구분(식별)될 수 있어야 한다. 그리고 식별자를 만들 때는 다음과 같은 규칙을 지켜야 한다.
1) 대소문자가 구분되며 길이에 제한이 없다.
- True와 true는 다른 것으로 간주된다.
2) 예약어를 사용해서는 안 된다.
- true는 예약어라서 사용할 수 없지만, True는 가능하다.
3) 숫자로 시작해서는 안 된다.
- top10 허용하지만, 7up은 허용되지 않는다.
4) 특수문자는 '_'와 '$'만을 허용한다.
-$harp는 허용되지만, S#arp는 허용되지 않는다.
예약어는 키워드(keyword) 또는 '리져브드 워드(reserved word)'라고 하는데, 프로그래밍언어의 구문에 사용되는 단어를 뜻한다. 그래서 예약어는 클래스나 변수, 메소드의 이름(identifier)으로 사용할 수 없다.
- 자바에서 사용하는 예약어
abstract default if package this assert do goto private throw boolean double implements protected throws break else import public transient byte enum instanceof return ture case exxtends int short try catch false interface static void char final long strictfp volatile class finally native super while const float new switch continue for null synchronized
참고 | goto와 const는 실제로 사용되지 않으며, assert는 JDK1.4부터 enum은 JDK1.5부터 새로 추가되었다.
1. 클래스 이름의 첫 글자는 항상 대문자로 한다.
- 변수와 메소드의 이름 첫 글자는 항상 소문자로한다.
2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
- LastIndexOf, StringBuffer
3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_' 로 구분한다.
- PI, MAX_NUMBER
coding convention 규칙을 미리 정해놓아야 프로그램에서 일관되게 사용할 수 있다.
참고 | 자바에서는 모든 이름에 유니코드에 포함된 문자들을 사용할 수 있지만, 적어도 클래스 이름은 ASCII코드(영문자)로 하는 것이 좋다. 유니코드를 인식하지 못하는 운영체계(OS)도 있기 때문이다.
변수의 이름은 짧을수록 좋지만, 약간 길더라도 용도를 알기 쉽게 '의미있는 이름'으로 하는 것이 바람직하다. 변수의 선언문에 주석으로 변수에 대한 정보를 주는 것도 좋은 생각이다.
int curPos = 0; // 현재 위치(current position)
int lastPos = -1; // 마지막 위치(last position)
2. 변수의 타입
우리가 주로 사용하는 값(data)의 종류(type)는 크게 '문자와 숫자'로 나눌 수 있으며, 숫자는 다시 '정수'와 '실수'로 나눌 수 있다.
값(data) - 문자 'A', '1', 'ABC' / - 숫자 - 정수 123, 0, -100 / - 실수 3.14, -3.0 X 10^8
이러한 값(data)의 종류(type)에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이 자료형(data type)이다.
자료형에는 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 등이 있으며, 변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택하면 된다.
- 기본형과 참조형
자료형은 크게 기본형과 참조형 두 가지로 나눌 수 있는데, 기본형 변수는 실제 값(data)을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다. 자바는 C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
참고 | 메모리에는 1byte 단위로 일련번호가 붙어있는데, 이 번호를 '메모리 주소(memory address)' 또는 간단히 '주소'라고 한다. 객체의 주소는 객체가 저장된 메모리 주소를 뜻한다.
기본형(primitive type)
- 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 계산을 위한 실제 값을 저장한다. 모두 8개
참조형(reference type)
- 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입
참조형변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.
클래스이름 변수이름; // 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다.
다음은 Date 클래스 타입의 참조변수 today를 선언한 것이다. 참조변수는 null 또는 객체의 주소를 값으로 갖으며 참조변수의 초기화는 다음과 같이 한다.
Date today = new Date(); // Date 객체를 생성해서, 그 주소를 today에 저장
객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다. 이 주소가 대입연산자 '='에 의해서 참조변수 today에 저장되는 것이다. 이제 참조변수 today를 통해서 생성된 객체를 사용할 수 있게 된다.
참조 | 참조형 변수는 null 또는 객체의 주소(4 byte, 0x0FFFFFFFF)를 값으로 갖는다. null은 어떤 객체의 주소도 저장되어 있지 않음을 뜻한다. 단 JVM이 32 bit가 아니라 64bit라면 참조형 변수의 크기는 8byte가 된다.
Q. 자료형(data type)과 타입(type)의 차이가 뭔가요?
A. 기본형은 저장할 값(data)의 종류에 따라 구분되므로 기본형의 종류를 얘기할 때는 '자료형(data type)'이라는 용어를 씁니다. 그러나 참조형은 항상 '객체의 주소(4 byte 정수)'를 저장하므로 값(data)이 아닌, 객체의 종류에 의해 구분되므로 참조형 변수의 종류를 구분할 때는 '타입(type)'이라는 용어를 사용합니다. '타입(type)'이 '자료형(data type)'을 포함하는 보다 넓은 의미의 용어이므로 굳이 구분하지 않아도 됩니다.
2.1 기본형(primitive type)
기본형에는 모두 8개의 타입(자료형)이 있으며,
크게 논리형 boolean(1byte), 문자형 char(2byte), 정수형 int(4byte) byte(1byte) long(8byte) short(2byte), 실수형 float(4byte), double(8byte)로 구분된다.
2.2 상수와 리터럴(constant & literal)
리터럴은 일반적인 상식의 상수를 의미한다.
- 특수 문자 다루기
영문자 이외에 tab이나 backspace 등의 특수문자를 저장하려면, 아래와 같이 조금 특별한 방법을 사용한다.
char tab = '\t';
'\t'는 실제로는 두 문자로 이루어져 있지만 한 문자(탭, tab)를 의미한다. 아래의 표는 탭(tab)과 같이 특수한 문자를 어떻게 표현할수 있는지 알려준다.
특수문자 | 문자 리터럴 |
tab | \t |
backspace | \b |
from feed | \f |
new line | \n |
carriage return | \r |
역슬래쉬(\) | \\ |
작은따옴표 | \' |
큰따옴표 | \" |
유니코드(16진수)문자 | \u유니코드 (예 : char a = '\u0041') |
'자바의정석' 카테고리의 다른 글
@SuppressWarning (0) | 2021.04.16 |
---|---|
lastIndexOf (0) | 2021.04.12 |
System.out.printf('%2d', x); %2d란?? (0) | 2021.04.06 |
ch02 연습문제 (0) | 2020.11.22 |
[자바의 정석] ch01 자바를 시작하기 전에 (0) | 2020.11.14 |