3. 변수란? 변수의 선언과 저장


1. 변수(varialbe)란?

  • 하나의 값을 저장할 수 있는 메모리 공간

2. 변수의 선언

// 변수타입 변수이름;
int age; // 정수타입의 변수 age를 선언
  • 변수의 선언 이유
    • 값(data)을 저장할 공간을 마련하기 위해

3. 변수에 값 저장하기

int age;  // 정수타입의 변수 age를 선언
age = 25; // 변수 age에 25를 저장
 
int x = 0;        // 변수 x를 선언 후, 0으로 초기화
int y = 5;        // 변수 y를 선언 후, 5로 초기화
int x = 0, y = 5; // 위의 두 줄을 한 줄로
  • 변수의 초기화 : 변수에 처음으로 값을 저장하는 것
    • [주의] 지역 변수는 읽기 전에 꼭! 초기화해야 함.

4. 변수의 값 읽어오기

int year = 0, age = 14;
year = age + 2000;
// -> year = 14 + 2000;
// -> year = 2014;
age = age + 1; // 변수의 값을 1 증가시키는 방법
// -> age = 14 + 1;
// -> age = 15;
System.out.println(age);
// -> System.out.println(15); // 15가 화면에 출력됨
  • 변수의 값이 필요한 곳에 변수의 이름을 적는다.

4. 변수의 타입


1. 변수의 타입

int age = 25; // 정수타입이기 때문에 정수를 저장할 수 있음
age = 3.14;   // 할당값이 정수가 아니기 때문에 에러
  • 변수의 타입은 저장할 값의 타입에 의해 결정된다.
char ch = '가';   // char는 문자 타입
double pi = 3.14; // double은 실수 타입
  • 저장할 값의 타입과 일치하는 타입으로 변수를 선언

2. 값의 타입

  • 8개의 기본 타입 (Primitive Type)
    • 값(data)
      • 문자 - char
      • 숫자
        • 정수 - byte, short, int, long
        • 실수 - float, double
      • 논리 - boolean

5. 상수와 리터럴


int score = 100;
score = 200;
final int MAX = 100; // MAX는 상수
MAX = 200;           // 에러
char ch = 'A';
String str = "abc";
// 변수 : score, ch, str
// 상수 : MAX
// 리터럴 : 100, 200, 'A', "abc"
  • 변수(variable) - 하나의 값을 저장하기 위한 공간
  • 상수(constant) - 한 번만 값을 저장 가능한 변수
  • 리터럴(literal) - 그 자체로 값을 의미하는 것

6. 리터럴의 타입과 접미사


종류리터럴접미사
논리형false, true없음
정수형123, 0b0101, 077, 0xFF, 100LL
실수형3.14, 3.0e8, 1.4f, 0x1.0p-1f, d
문자형‘A’, ‘1’, ‘\n’없음
문자열“ABC”, “123”, “A”, “true”없음
boolean power = true;
char ch = 'A';
String str = "ABC";
byte b = 127; // int타입의 리터럴 사용, 다만 byte의 범위에 들어와야 함
byte b = 128; // 에러
// 접두사 : 0b, 0x, 0
int i = 100;     // 10진수
int bin = 0b0101 // 2진수
int oct = 0100;  // 8진수
int hex = 0x100; // 16진수
long l = 10_000_000_000L; // 20억 초과 시 L 필수 적용
long l = 100;             // L 생략 가능
float f = 3.14f;  // f 생략 불가
double d = 3.14d; // d 생략 가능
10. -> double 10.0
.10 -> double 0.10
10f -> float 10.0f
1e3 -> double 1000.0

7. 변수와 리터럴의 타입 불일치


int i = 'A';      // int > char
// 'A' 는 65
long l = 123;     // long > int
double d = 3.14f; // double > float
  • 범위가 ‘변수 > 리터럴’ 인 경우, OK
int i = 3_000_000_000; // int의 범위 벗어남
long l = 3.14f;        // long < float
float f = 3.14         // float < double
  • 범위가 ‘변수 < 리터럴’ 인 경우, 에러
byte b = 100; // OK
byte b = 128; // 에러, (-128 ~ 127) 범위 벗어남
  • byte, short 변수에 int 리터럴 저장 가능
    • 단, 변수의 타입의 범위 이내이어야 함

8. 문자와 문자열


char ch = 'A';
char ch = 'AB'; // 에러
String s = "ABC";
// String은 클래스
String s1 = "AB";             // s1에 주소를 저장
String s2 = new String("AB"); // 생성자 생략 가능
String s = "A";
String s = ""; // 빈 문자열
char ch = '';  // 에러
String s1 = "A" + "B"; // "AB"
""+7 -> ""+"7" -> "7"
""+7+7 -> "7"+7 -> "7"+"7" -> "77"
7+7+"" -> 14+"" -> "14"+"" -> "14"

9. 두 변수 바꾸기


int x = 10, y = 20;
x = y; // y의 값을 x에 저장
y = x; // x의 값을 y에 저장
int x = 10, y = 20;
int tmp;
tmp = x; // x의 값을 tmp에 저장
x = y;   // x의 값을 y에 저장
y = tmp; // tmp의 값을 y에 저장

10. 기본형과 참조형


  • 기본형(Primitive Type)
    • 오직 8개 (boolean, char, byte, short, int, long, float, double)
    • 실제 값을 저장
    • 각 타입마다 메모리 사용 크기가 정해져 있기 때문에 범위를 초과할 경우 오버플로우 현상이 발생할 수 있음
    • 스택 영역에 생성
  • 참조형(Reference Type)
    • 기본형을 제외한 나머지 (String, System 등)
    • 메모리 주소를 저장(4 byte 또는 8 byte)
    • null 값을 대입할 수 있다면 참조 타입
    • 힙 영역에 생성
Date today; // 참조형 변수 today를 선언
today = new Date(); // 객체생성 후 today에 객체의 주소를 저장

11. 기본형의 종류와 범위


  • 기본형(Primitive Type) - 종류와 크기
    • 논리형 - true와 false중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용됨
    • 문자형 - 문자를 저장하는데 사용되며, 변수 당 하나의 문자만 저장할 수 있음
    • 정수형 - 정수값을 저장하는데 사용됨
      • 주로 int와 long을 사용함
      • byte는 이진 데이터를 다루는데 사용
      • short은 c언어와의 호환을 위해 추가됨(잘 안쓰임)
    • 실수형 - 실수값을 저장하는데 사용되며, float와 double이 있음
종류/크기1248
논리형boolean
문자형char
정수형byteshortintlong
실수형floatdouble
  • 기본형(Primitive Type) - 표현범위
    • n비트로 표현할 수 있는 값의 개수 :
    • byte -128 ~ 127
    • short -32768 ~ 32767
    • char 0 ~ 65535
    • int -20억 ~ 20억
    • long -800경 ~ 800경
자료형저장 가능한 값의 범위정밀도bitbyte
float1.4E-45 ~ 3.4E387 자리324
double4.9E-324 ~ 1.8E30815 자리648

12. 형식화된 출력 - printf()


System.out.println(10.0/3); // 3.333333...
  • println()의 단점 - 출력형식 지정불가
    • 실수의 자리수 조절불가 - 소수점 n자리만 출력하려면?
System.out.println(0x1A); // 26
  • 10진수로만 출력된다
System.out.printf("%.2f", 10.0/3); // 3.33
System.out.printf("%d", 0x1A); // 26
System.out.printf("%x", 0x1A); // 1A
  • printf()로 출력형식 지정가능

13. printf()의 지시자


지시자설명
%bboolean 형식으로 출력
%ddecimal 형식으로 출력
%ooctal 형식으로 출력
%x, %Xhexa-decimal 형식으로 출력
%ffloating-point 형식으로 출력
%e, %Eexponent 표현식의 형식으로 출력
%ccharater로 출력
%sstring으로 출력
// 정수를 10진수, 8진수, 16진수로 출력
System.out.printf("%d", 15); // 15 10진수
System.out.printf("%o", 15); // 17 8진수
System.out.printf("%x", 15); // f 16진수
System.out.printf("%s", Integer.toBinaryString(15)); // 1111 2진수
// 8진수와 16진수에 접두사 붙이기
System.out.printf("%#o", 15); // 017
System.out.printf("%#x", 15); // 0xf
System.out.printf("%#X", 15); // 0XF
// 실수 출력을 위한 지시자 %f - 지수형식(%e), 간략한 형식(%g)
float f = 123.4567890f;
System.out.printf("%f", f); // 123.456787 (정밀도 때문에 결과가 다름)
System.out.printf("%e", f); // 1.234567e+02
System.out.printf("%g", 123.456789); // 123.457
System.out.printf("%g", 0.00000001); // 1.00000e-8
System.out.printf("[%5d]%n", 10);  // [   10]
System.out.printf("[%-5d]%n", 10); // [10   ]
System.out.printf("[%05d]%n", 10); // [00010]
System.out.printf("d=%14.10f%n", d); // 전체 14자리 중 소수점 아래 10자리
// [  1.2345678900]
System.out.printf("[%s]%n", url);    // [www.codechobo.com]
System.out.printf("[%20s]%n", url);  // [   www.codechobo.com]
System.out.printf("[%-20s]%n", url); // [www.codechobo.com   ]
System.out.printf("[%.8s]%n", url);  // [www.code]

14. 화면으로부터 입력받기


3. 화면에서 입력받기 - Scanner

import java.util.*;                       // import문 추가
Scanner scanner = new Scanner(System.in); // Scanner 객체 생성
int num = scanner.nextInt();              // 화면에서 입력받은 정수를 num에 저장
String input = scanner.nextLine();        // 화면에서 입력받은 내용을 input에 저장
int num = Integer.parseInt(input);        // 문자열(input)을 숫자(num)로 변환
  • Scanner란?
    • 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스

15. 정수형의 오버플로우


short sMin = -32768, sMax = 32767;
char cMin = 0, cMax = 65535;
System.out.println("sMin  = " + sMin);             // sMin  = -32768
System.out.println("sMin-1= " + (short)(sMin-1));  // sMin-1= 32767
System.out.println("sMax  = " + sMax);             // sMax  = 32767
System.out.println("sMax+1= " + (short)(sMax+1));  // sMax+1= -32768
System.out.println("cMin  = " + (int)cMin);        // cMin  = 0
System.out.println("cMin-1= " + (int)--cMin);      // cMin-1= 65535
System.out.println("cMax  = " + (int)cMax);        // cMax  = 65535
System.out.println("cMax+1= " + (int)++cMax);      // cMax+1= 0

17. 타입간의 변환방법


1. 문자와 숫자간의 변환

3 + '0' -> '3'
'3' - '0' -> 3

2. 문자열로의 변환

3 + "" -> "3"
'3' + "" -> "3"

3. 문자열을 숫자로 변환

Integer.parseInt("3") -> 3
Double.parseDouble("3.14") -> 3.14
"3".charAt(0) -> '3'