1. 변수(Variable)란?
- 단 하나의 값을 저장할 수 있는 메모리상의 공간
- 이 공간에 저장된 값은 변경될 수 있기 때문에 '변수'라고 이름이 붙음
2. 변수의 선언과 초기화
1) 변수의 선언
변수타입 변수이름;
ex) int age;
- 변수타입 : 변수에 저장될 값이 어떤 '타입(type)'인지를 지정하는 것, 저장하고자 하는 값의 종류에 맞게 변수의 타입을 선택해서 적어줌
- 변수이름 : 변수에 붙인 이름, 메모리 공간에 붙인 이름, 이 이름을 사용하여 값을 저장하고 값을 읽어옴
(같은 이름의 변수가 여러 개 존재하면 안됨)
변수를 선언한다
= 메모리의 빈 공간에 '변수타입'에 알맞은 크기의 저장공간이 확보되고, 앞으로 이 저장공간은 '변수이름'을 통해 사용할 수 있게 된다.
2) 변수의 초기화
- 변수를 사용하기 전에는 '초기화(initialization)'를 해야함
- 메모리는 여러 프로그램이 공유하는 자원이므로 쓰레기값(garbage value)가 남아있을 수 있기 때문
- 대입연산자 '='를 사용, 대입연산자의 왼쪽에는 변수가 오고 오른쪽에는 값이 와야함
ex) int age = 25;
- 타입이 같을 경우 콤마 ','를 사용하여 한 줄에 선언할 수 있음
ex) int x = 10, y = 5;
예제) 두 변수의 값 교환하기
class Ex {
public static main(String[] args) {
int x = 10;
int y = 20;
int tmp;
tmp = x;
x = y;
y = tmp;
System.out.println("x:" + x + " y:" + y);
}
}
[결과] x:20 y:10
3) 변수의 명명규칙
- 식별자(identifier) : 프로그래밍에서 사용되는 모든 이름, 같은 영역 내에서 서로 구분(식별)될 수 있어야함
- 식별자의 필수규칙
(1) 대소문자가 구분되며 길이에 제한이 없음
(2) 예약어를 사용하면 안됨
예약어(=keyword=reserved word) : 프로그래밍언어의 구문에 사용되는 단어(if, while, public, true 등)
(3) 숫자로 시작하면 안됨
(4) 특수문자는 '_'와 '$'만 허용
- 프로그래밍 권장규칙
(1) 클래스 이름의 첫 글자는 항상 대문자로 함, 변수와 메서드의 이름의 첫 글자는 항상 소문자로 함
(2) 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 함
ex) lastIndexOf, StringBuffer
(3) 상수의 이름은 모두 대문자로 함, 여러 단어로 이루어진 경우 '_'로 구분
ex) PI, MAX_NUMBER
(4) 변수의 이름은 의미있는 이름으로 함
3. 변수의 타입
1) 기본형과 참조형
- 기본형(primitive type) : 계산을 위한 실제 값(data)을 저장, 총 8개
- 참조형(reference type) : 어떤 값이 저장되어 있는 주소(memory address)를 저장, 8개의 기본형을 제외한 나머지 타입
2) 기본형
(1) 논리형 : boolean
- true와 false 중 하나의 값을 가지며 조건식과 논리적 계산에 사용
(2) 문자형 : char
- 문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있음
(3) 정수형 : byte, short, int, long
- 정수를 저장하는데 사용되며, 주로 int가 사용됨
(4) 실수형 : float, double
- 실수를 저장하는데 사용되며, 주로 double이 사용됨
자료형 | 저장 가능한 값의 범위 | 크기 (bit) | 크기 (byte) |
boolean | false, true | 8 | 1 |
char | '\u0000' ~ '\uffff' (0~216-1, 0~65535) | 16 | 2 |
byte | -128 ~ 127 (-27~27-1) | 8 | 1 |
short | -32,768 ~ 32,767 (-215~215-1) | 16 | 2 |
int | -2,147,483,648 ~ 2,147,483,647 (-231~231-1) | 32 | 4 |
long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,808 (-263~263-1) | 64 | 8 |
float | 1.4E-45 ~ 3.4E38 (1.4×10-45~3.4×1038) | 32 | 4 |
double | 4.9E-324 ~ 1.8E308 (4.9×10-324~1.8×10308) | 64 | 8 |
- 정수형의 경우 '-2n-1 ~ 2n-1-1' 의 범위로 사용 가능 (n은 bit 수)
- 연산 중 저장범위를 넘어서게 되면 원하지 않는 값을 결과로 얻기 때문에, 정밀도(precision)을 고려하여 자료형을 선택함
4. 상수(constant)와 리터럴(literal)
1) 상수(constant)
- 변수와 마찬가지로 값을 저장할 수 있는 공간이지만, 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없음
- 선언하는 법은 변수와 동일하며 변수의 타입 앞에 키워드 'final'을 붙여줌
- 선언과 동시에 초기화해야 하며, 그 후부터는 상수의 값을 변경하는 것이 허용되지 않음
(JDK1.6부터는 선언과 동시에 초기화하지 않아도 되며, 사용하기 전에만 초기화하면 된다. 하지만 선언과 동시에 초기화하는 것이 좋다.)
- 모두 대문자로 하는 것이 암묵적인 관례이며, 여러 단어로 이루어져있는 경우 '_'로 구분
2) 리터럴(literal)
- 값 자체를 의미하는 것으로, 기존에 알고있던 상수를 위의 개념으로 사용함으로써 리터럴이라는 명칭을 붙음
변수(variable) : 하나의 값을 저장하기 위한 공간
상수(constant) : 값을 한번만 저장할 수 있는 공간
리터럴(literal) : 그 자체로 값을 의미하는 것
상수는 리터럴에 '의미있는 이름'을 붙여서 코드의 이해와 수정을 쉽게 만든다.
- 리터럴의 타입과 접미사
종류 | 리터럴 | 접미사 |
논리형 | false, true | 없음 |
정수형 | 123, 0b0101, 077, 0xFF, 100L | L |
실수형 | 3.14, 3.0e8, 1.4f, 0x1.0p-1 | f, d |
문자형 | 'A', '1', '\n' | 없음 |
문자열 | "ABC", "123", "A", "true" | 없음 |
- 정수형 : long타입에 L을 붙이고, byte타입과 short타입의 리터럴은 별도로 존재하지 않으며, 접미사가 없으면 int타입임
- 2진 리터럴(0b,0B), 8진 리터럴(0), 16진 리터럴(0x,0X) 표현 가능
ex) int binNum = 0b10, octNum = 010, hexNum = 0x10; (순서대로 2진, 8진, 16진)
- JDK1.7부터 정수형 리터럴의 중간에 구분자 '_'를 넣을 수 있음
ex) long big = 100_000_000_000L;
- 실수형 : float타입에 f 또는 F를 붙이고, double타입에 d 또는 D를 붙임, 접미사가 없으면 double 타입임
- 문자 리터럴 : 작은 따옴표('')로 문자 하나를 감싼 것 (반드시 하나의 문자가 있어야 함)
- 문자열 리터럴 : 큰 따옴표("")로 문자열을 감싼 것 (안에 아무런 문자도 넣지 않아도 됨 = empty stirng)
- 덧셈 연산자(+) : 피연산자가 모두 숫자일 때는 두 수를 더하지만, 피연산자 중 어느 한 쪽이 String이면 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String을 결합함 (결합순서에 따라 결과가 달라짐)
ex) 7 + "아" = "7아"
"아 " + 7 = "아 7"
7 + 7 + "" = 14 + "" = "14"
"" + 7 + 7 = "7" + 7 = "77"
- 타입의 불일치 : 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용됨
ex) int i = 'A'; // 가능
double d = 3.14f; // 가능
float f = 3.14; // 에러 (float타입보다 범위가 넓은 double타입을 저장할 수 없음)
5. 출력(printf)과 입력(Scanner)
1) 출력(printf)
- println()을 사용하면 값을 변환하지 않고는 다른 형식으로 출력할 수 없음
- printf() : '지시자(specifier)'를 통해 변수의 값을 여러 가지 형식으로 변환하여 출력할 수 있음, 줄바꿈시 "\n"을 넣어줘야함 (지시자 : 값을 어떻게 출력할 것인지 지정)
지시자 | 설명 |
%b | boolean 형식으로 출력 |
%d | 10진(decimal) 정수 형식으로 출력 |
%o | 8진(octal) 정수 형식으로 출력 |
%x, %X | 16진(hexa-decimal) 정수 형식으로 출력 |
%f | 부동 소수점(floating-point) 형식으로 출력 |
%e, %E | 지수(exponent) 표현식의 형식으로 출력 |
%c | 문자(character)로 출력 |
%s | 문자열(string)로 출력 |
ex) System.out.printf("%d", age); // age라는 변수를 10진 정수형으로 출력
- 정수형을 출력할 때, 출력될 값이 차지할 공간을 숫자로 지정할 수 있음
ex)
System.out.printf("[%5d]\n"); // [ 10]
System.out.printf("[%-5d\n"); // [10 ]
System.out.printf("[%05d\n"); // [00010]
- 실수형을 출력할 때, %f가 주로 쓰이고 %e는 지수형태로 출력할 때, %g는 값을 간략하게 표현할 때 사용
- %f는 기본적으로 소수점 아래 6자리까지만 출력하기 때문에 소수점 아래 7자리에서 반올림함
- 전체 자리수와 소수점 아래의 자리수를 지정할 수도 있음
ex) System.out.printf("%14.10f\n"); // 전체 14자리 중 소수점 아래 10자리
- 지정된 숫자보다 문자열의 길이가 작으면 빈자리는 공백으로 출력
- 기본적으로 우측 끝에 문자열을 붙이지만, '-'를 붙이면 좌측 끝에 붙임
- '.'을 붙이면 문자열의 일부만 출력 가능
2) 입력(Scanner)
- Scanner 클래스를 이용하여 화면으로부터 입력받을 수 있음
import java.util.*;
.
.
.
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
- nextLine()이라는 메서드를 호출하면, 입력대기 상태에 있다가 입력을 마치고 '엔터키(Enter)'를 누르면 입력한 내용이 문자열로 반환됨
- 입력받은 문자열을 숫자로 변환하려면 Integer.parseInt()를 사용함
참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)
'공부 > Java' 카테고리의 다른 글
[Java-02] 변수(Variable) - 형변환(Casting) (0) | 2021.02.01 |
---|---|
[Java-02] 변수(Variable) - 기본형(Primitive type) (0) | 2021.01.31 |
[Java-02] 변수(Variable) - 진법 (0) | 2021.01.30 |
[Java-01] JDK 설치 및 환경변수 설정 (0) | 2020.12.23 |
[Java-01] Java란? (0) | 2020.12.17 |