공부/Java

[Java-02] 변수(Variable) - 변수와 상수, 변수의 타입

줭♪(´▽`) 2020. 12. 25. 21:32

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 (저자 : 남궁성, 출판 : 도우출판)