본문 바로가기

프로그래밍/자바

[java] 다시 공부하는 자바의 정석_Chapter2. 변수

2-3. Java

자바의 정석을 다시 살펴보면서 정리한 내용이다.

1. 변수와 상수

1.1 변수란?

변수란, 단 하나의 값을 저장할 수 있는 메모리상의 공간이다.

1.2 변수의 선언과 초기화

변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것이다.

int a = 0;
int b = 0;

1.3 변수의 명명규칙

프로그래밍에서 사용하는 모든 이름을 "식별자(identifier)"라고 한다. 식별자는 같은 영역 내에서 서로 구분(식별)될 수 있어야 한다.

  • 대소문자가 구분되며 길이에 제한이 없다.
  • 예약어를 사용해서는 안 된다.
  • 숫자로 시작해서는 안 된다.
  • 특수문자는 '_'와 '$'만을 허용한다.

예약어

2. 변수의 타입

기본형 변수는 실제 값(data)을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다.

  • 기본형
    • 논리형, boolean
    • 문자형, char
    • 정수형, byte, short, int, long
    • 실수형, float, double

2.1 primitive type

기본형

int는 약 +_20억의 수를 저장할 수 있다. 실수형은 정수형과 저장형식이 달라서 같은 크기라도 훨씬 큰 값을 표현할 수 있으나 오차가 발생할 수 있다는 단점이 있다. 그래서 정밀도(precision)가 중요한데, 정밀도가 높을수록 오차 범위가 줄어든다.

  • float의 정밀도, 7자리. 10진수로 7자리의 수를 오차없이 저장할 수 있다는 뜻이다.
  • double의 정밀도, 15자리.

2.2 상수와 리터럴(constant & literal)

상수는 변수와 달리 한 번 값을 저장하면 다른 값으로 변경 할 수 없다. 그리고 반드시 선언과 동시에 초기화해야 한다. 그 후에는 상수의 값을 변경하는 것이 허용되지 않는다. 상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이다.

final int MAX_SPEED;        // 에러, 초기화를 안했다.
final int MAX_SPEED = 100;  // 정상.
MAX_SPEED = 200;            // 에러, 상수값은 변경할 수 없다.

리터럴(literal)은 그 자체로 값을 의미하는 것이다. 보통 우리가 얘기하는 상수를 가르키는 것인데, 이미 상수를 값을 한 번만 저장할 수 있는 변수로 정의하였기에 구분하기 위해서 리터럴이란 용어를 쓴다. 상수는 리터럴에 '의미있는 이름'을 붙여서 코드의 이해와 수정을 쉽게 만든다.

final int WIDTH = 100;
final int HEIGHT = 100;
int triangleArea = (WIDTH * HEIGHT) / 2;
int rectangleArea = WIDHT * HEIGHT;
  • 리터럴의 타입과 접미사

long, l 또는 L을 접미사로 붙인다. 붙이지 않으면 int로 인식한다.

float, f 또는 F를 접미사로 붙인다. 붙이지 않으면 double로 인식한다.

long big = 100_000_000_000L;
long nex = 0xFFFF_FFFF_FFFF_FFFFL;
float pi = 3.14 // 에러, double은 float에 저장 할 수 없다. (타입에러)
  • 문자 리터럴과 문자열 리터럴

'A', 문자 하나를 감싼 것을 문자 리터럴이라고 한다.

"ABC", 두 문자 이상은 큰 따옴표 두개 이상으로 감싼다. 문자열 리터럴이라 한다.

String str = "";    // OK, 내용이 없는 빈 문자열
char ch = '';       // 에러, ''안에 반드시 하나의 문자가 필요
char ch = ' ';      // OK, 공백 문자(blank)로 변수 ch를 초기화

3. 진법

3.1 10진법과 2진법

int age = 25; // age = 00000000000000000000000000011001, 로 저장된다.

3.2 비트(bit)와 바이트(byte)

한 자리의 2진수를 '비트"라고 하며, 1비트는 컴퓨터가 값을 저장할 수 있는 최소단위이다. 그러나 1비트는 너무 작은 값이기 때문에 1비트 8개를 묶어서 '바이트'라는 단위로 정의해서 데이터의 기본 단위로 사용한다.

워드(word), 'CPU가 한 번에 처리할 수 있는 데이터의 크기'를 의미한다.

4. 기본형(primitive type)

4.1 논리형 - boolean

논리형에는 'boolean' 한가지 밖에 없다. true, false 둘 중 한가지 값만을 허락한다. default 값은 'false'이다.

boolean power = true;
boolean checked = False; // 에러. 대소문자가 구분됨. true 또는 false 만 가능.

4.2 문자형 - char

char, 한 가지 자료형밖에 없다. 단 하나의 문자만 저장할 수 있다. '문자'가 저장되는 것 같지만, 사실은 문자가 아닌 '문자의 유니코드(정수)'가 저장된다. 컴퓨터는 숫자밖에 모른다.

char ch = 'A';   // 문자 'A'를 char타입의 변수 ch에 저장.
char ch = 65;    // 문자의 코드를 직접 변수 ch에 저장.

위 두개는 같은 결과를 표출한다. 어떤 문자의 유니코드를 알고 싶으면, char형 변수에 저장된 값을 정수형(int)으로 변환하면 된다.

int code = (int)ch; // ch에 저장된 값을 int타입으로 변환하여 저장한다.

4.3 정수형 - byte, short, int, long

1, 2, 4, 8 → byte < short < int < long 각 자료형의 저장할 수 있는 값의 범위가 2배씩 증가한다. 기본 자료형은 'int'이다. 어떤 진법의 리터럴을 변수에 저장해도 실제로는 2진수로 바뀌어 저장된다.

  • 오버플로우 & 언더플로우

해당 타입이 표현할 수 있느 값의 범위를 넘어서는 것.

5. 형변환

5.1 형변환(캐스팅, casting)이란?

형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것이다.

5.2 형변환 방법

5.5. 정수형과 실수형 간의 형변환

int의 최대값은 약 20억으로 최대 10자리의 정밀도를 요구한다. 그러나 float는 10진수로 약 7자리의 정밀도만을 제공하므로, int를 float로 변환할 때 정밀도 차이에 의한 오차가 발생할 수 있다. 그래서 10진수로 8자리 이상의 값을 실수형으로 변환할 때는 float가 아닌 double로 형변환을 해야 오차가 발생하지 않는다.

int intA = 91234567;
int intB = 91234567;
float floatA = (float)intA;     // 91234568.0
double doubleB = (double)intB;  // 91234567.0
int returnIntA = (int)floatA;   // 91234568
int returnIntB = (int)doubleB;  // 91234567

실수형을 정수형으로 변환하면, 소수점이하의 값은 버려진다.

5.6 자동 형변환

형변환을 생략하면 컴파일러가 알아서 자동적으로 형변환을 한다. 그 규칙은 다음과 같다.

기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
byte → short → int → long → float → double
char →

  • boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
  • 기본형과 참조형은 서로 형변환할 수 없다.
  • 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.

'프로그래밍 > 자바' 카테고리의 다른 글

[JAVA] 서블릿(servlet)이란 _ 자바  (0) 2017.03.27