단 하나의 값을 저장할 수 있는 메모리 공간ex) int age; // age 라는 이름의 변수를 선언
int : 변수타입 - 변수에 저장될 값이 어떤 '타입(type)'인지를 저장하는 것
age : 변수이름 - '값을 저장할 수 있는 메모리 공간'의 이름
변수의 종류에 따라 변수의 초기화를 생략할 수 있는 경우도 있지만, 변수는 사용되기 전에 적절한 값으로 초기화 하는 것이 좋다.
지역변수는 사용되기 전에 초기화를 반드시 해야 하지만 클래스변수와 인스턴스변수는 초기화를 생략할 수 있다.
변수의 이름 처럼 프로그래밍에서 사용하는 모든 이름을 식별자(identifier)라고 하며, 식별자는 같은 영역 내에서 서로 구분(식별)될 수 있어야한다. 그리고 식별자를 만들 때는 다음과 같은 규칙을 지켜야 한다.대소문자가 구분되며 길이에 제한이 없다.예약어를 사용해서는 안 된다.숫자로 시작해서는 안 된다.특수문자는 '_'와 '$'만을 허용한다.<이 외에 필수적인 것은 아니지만 자바 프로그래머들에게 권장하는 규칙>
클래스 이름의 첫 글자는 항상 대문자로 한다.
여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
`상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
기본형 변수는 실제 값(data)을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다.
참조형 변수(또는 참조변수)를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.
클래스이름 변수이름; // 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다.
ex) Date today = new Date(); // Date 객체를 생성해서, 그 주소를 today에 저장
| 분류 | 자료형 | 저장 가능한 값의 범위 | 크기(bit, byte) |
|---|---|---|---|
| 논리형 | boolean | false, true | 8bit, 1byte |
| 문자형 | char | '\u0000' ~ '\uffff' (0~2^16-1, 0~65535) | 15bit, 2byte |
| 정수형 | byte | -128 ~ 127 (-2^7~2^7-1) | 8bit, 1byte |
| short | -32,768 ~ 32,767 (-2^15~2^15-1) | 16bit, 2byte | |
| int | 2,147,483,648 ~ 2,147,483,647 (-2^31~2^31-1, 약 ±20억) | 32bit, 4byte | |
| long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807(-2^63~2^63-1) | 64bit, 8byte | |
| 실수형 | float | 1.4E-45 ~ 3.4E38 (1.4x10^-45~3.4x10^38) | 32bit, 4byte |
| double | 4.9E-324 ~ 1.8E308 (4.9x10^-324~1.8x10^308) | 64bit, 8byte |
상수(constant)도 '값을 저장할 수 있는 공간'이지만, 변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없다. 선언 방법은 변수 선언시 타입 앞에 키워드 final을 붙여주기만 하면 된다.final int MAX_SPEED = 10; // 상수 MAX_SPEED를 선언 & 초기화
final int MAX_SPEED; // 에러. 상수는 선언과 동시에 초기화해야함
final int MAX_VALUE = 100; // OK. 선언과 동시에 초기화함
MAX_VALUE = 200; // 에러. 상수의 값은 변경 불가
의미있는 이름을 붙여서 코드의 이해와 수정을 쉽게 만든다.int year = 2014; // year는 변수, 2014는 리터럴
final int MAX_VALUE = 100; // MAX_VALUE는 상수, 100은 리터럴
| 종류 | 리터럴 | 접미사 |
|---|---|---|
| 논리형 | false, true | 없음 |
| 정수형 | 123, 0b0101, 077, 0xFF, 100L | l , L |
| 실수형 | 3.14, 3.0e8, 1.4f, 0x1.0p-1 | f , d |
| 문자형 | 'A', '1', '\n' | 없음 |
| 문자열 | "ABC", "123", "A", "true" | 없음 |
- long과 float의 리터럴에 접미사를 붙이는 것만 신경쓰면 된다.
| 지시자 | 설명 |
|---|---|
| %b | 불리언(boolean) 형식으로 출력 |
| %d | 10진(decimal) 정수의 형식으로 출력 |
| %o | 8진(octal) 정수의 형식으로 출력 |
| %x, %X | 16진(hexa-decimal) 정수의 형식으로 출력 |
| %f | 부동 소수점(floating-point)의 형식으로 출력 |
| %e, %E | 지수(exponent) 표현식의 형식으로 출력 |
| %c | 문자(character)로 출력 |
| %s | 문자열(string)로 출력 |
class Main {
public static void main(String[] args) {
int a = 1;
System.out.printf("a = %d\n", a);
// 등등 동일하게
}
}
import java.util.Scanner;
public class ScannerEx {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("두 정수 입력 : ");
String input = sc.nextLine();
int num = Integer.parseInt(input);
System.out.println("입력내용 : " + input);
System.out.printf("num = %d\n", num);
}
}
한 자리의 2진수를 비트(bit, binary digit)라고 하며, 1 비트는 컴퓨터가 값을 저장할 수 있는 최소단위이다.
너무 작으므로 1 비트 8개를 묶어서 바이트(byte)라는 단위로 정의해서 데이터의 기본 단위로 사용한다.
그 외에도 워드(word)는 CPU가 한 번에 처리할 수 있는 데이터의 크기를 의미한다. 1워드는 32비트 CPU에서 32bit(4byte)이고, 64비트 CPU에서는 64bit(8byte)이다.
char ch = 'A';
문자가 아닌 '문자의 유니코드(정수)'가 저장된다. 문자 'A'의 유니코드는 65 이므로, 변수 ch에는 65가 저장된다. 따라서 아래의 두 문장은 동일한 결과char ch = 'A'; // 문자 'A'를 char 타입의 변수 ch에 저장
char ch = 65; // 문자의 코드를 직접 변수 ch에 저장
int code = (int)ch; // ch에 저장된 값을 int타입으로 변환하여 저장한다.
'A' <-> 65
문자 인코딩(encoding), 그 반대로 코드를 문자로 변환하는 것을 문자 디코딩(decoding)이라고 한다.실제로, Dialogflow라는 자연어 처리 api를 사용하면서 이 과정이 필요했던 경험이 있었는데, 인코딩 코드를 짜느라 애를 먹은 기억이... 😢
ASCII는 'American Standard Code for Information Inrerchane'의 약어로 정보교환을 위한 미국 표준 코드라는 뜻이다.유니코드 이다.기본적으로 정수형 변수를 선언할 때는 int타입으로 하고,
int의 범위(약 ±20억)를 넘어서는 수를 다뤄야할 때는 long을 사용하면 된다.
byte나 short는 성능보다 저장공간을 절약하는 것이 더 중요할 떄 사용
타입이 표현할 수 있는 값의 범위를 넘어서는 것을 오버플로우(overflow)라고 한다.
오버플로우가 발생한다고 해서 에러가 발생하는 것은 아니고, 예상했던 결과를 얻지 못할 뿐이다.
따라서, 값을 예상하고 그에 맞게 변수 타입 선언을 정확히 해야한다.
실수형은 소수점수도 표현해야 하므로 얼마나 큰 값을 표현할 수 있는가뿐만 아니라 얼마나 0에 가깝게 표현할 수 있는가도 중요하다.
double 타입의 변수를 사용하는 경우는 대부분 저장하려는 값의 범위 때문이 아니라 보다 높은 정밀도가 필요해서이다.
하여 연산속도의 향상이나 메모리를 절약하려면 float를 선택하고, 더 큰 값의 범위라던가 더 높은 정밀도를 필요로 한다면 double을 선택해야 한다.
형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주기만 하면 된다.
(타입)피연산자
여기에 사용되는 괄호()는 캐스트 연산자 또는 형변환 연산자라고 하며, 형변환을 캐스팅(casting)이라고도 한다.
double d = 85.4;
int score = (int)d; // double 타입의 변수 d를 int 타입으로 형변환
피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다.| 변환 | 수식 | 결과 |
|---|---|---|
| int -> char | (char) 65 | 'A' |
| char -> int | (int) 'A' | 65 |
| float -> int | (int) 1.6f | 1 |
| int -> float | (float) 10 | 10.0f |
값 손실이 발생하지 않으나 큰 타입에서 작은 타입으로 변환은 값에 따라 값 손실이 발생할 수 있다.정수형과 마찬가지로 작은 타입에서 큰 타입으로 변환하는 경우, 빈 공간을 0으로 채운다.
반대로 double타입에서 float타입으로 변환하는 경우, 지수(E)와 가수(M)가 버려지고 반올림이 발생할 수 있다.
float f = 1234; // 형변환의 생략. float f = (float)1234;와 같음 byte b = 1000; // 에러. byte의 범위(-128~127)를 넘는 값을 저장. char ch = (char)1000; // 명시적 형변환. 에러가 발생하지 않는다. int i = 3; double d = 1.0 + i; // double d = 1.0 + (double)i; 에서 형변환이 생략됨
기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
저는 그냥 책만 보고 공부하긴 하지만 필요한 사람이 있을까봐 남깁니다.