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 |
---|