참고
자바의 정석
https://shelter715.tistory.com/204
https://dangle.tistory.com/7
https://intrepidgeeks.com/tutorial/java-formula-2-variable
값의 분류
- 값의 종류는 크게 '문자와 숫자'로 나눌 수 있으며, 숫자는 다시 '정수와 실수'로 나눌 수 있다.

- 자료형이란 겂의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이다.
- 변수의 타입은 저장할 값의 타입에 의해 결정이 된다.
기본형과 참조형
- 기본형 변수는 실제 값을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소를 값으로 갖는다.
- 자바는 C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
참조
- 기본형 (primitive type)
- 논리형(boolean), 문자형 (char), 정수형 (byte, short, int, long),
실수형 (float, double) 계산을 위한 실제 값을 저장한다.
- 참조형 (reference type) (객체 생성하는 것을 생각하면 된다.)
- 객체의 주소(메모리 주소)를 저장한다. 8개의 기본형을 제외한 나머지 타입 (4byte or 8byte).
ex) String, System...
클래스이름 변수이름; // 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다.
- 참조 변수는 null 또는 객체의 주소를 값으로 갖는다.
- 참조변수의 초기화는 아래와 같다.
Date today = new Date();
참고
참조형 변수는 null 또는 객체의 주소 (4byte)를 값으로 갖는다.
null은 어떤 객체의 주소도 저장되어 있지 않음을 뜻한다.
JVM이 32bit가 아니라 64bit라면 참조형 변수의 크기는 8byte가 된다.
자료형과 타입의 차이가 무엇인가?
굳이 차이는 없지만 엄밀히 이야기를 하면 다음과 같다.
기본형의 종류를 이야기할때는 자료형이라고 부르며, 참조형을 이야기 할때는 타입이라고 부른다.
즉, 타입이 자료형을 포함하는 보다 넓은 의미의 용어이므로 굳이 구분하지 않아도 된다.
기본형
- 기본형에는 모두 8개의 타입이 있으며, 크게 논리형, 문자형, 정수형, 실수형으로 구분된다.
- 논리형
- boolean
- true와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다.
- boolean은 다른 기본형과의 연산이 불가능하다.
- 문자형
- char
- 문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다.
- 여러개의 문자를 저장하고 싶을 때는 String이라는 참조형 타입을 써야한다.
- 문자를 내부적으로 정수 (유니코드)로 저장하기 때문에 정수형과 별반 다르지 않으며 정수형 또는 실수형과 연산도 가능하다.
- 정수형
- byte, short, int, long
- 정수를 저장하는데 사용되며, 주로 int가 사용.
- byte는 이진 데이터를 다룰 때 사용되며, short는 C언어와의 호환을 위해 추가
- short 자료형은 잘 사용하지 않는다.
- 정수형은 일반적으로 int를 사용한다. 왜냐하면, int는 CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문이다. 효율적인 메모리를 절약하려면 byte나 short를 선택하자.
- 실수형
- float, double
- 실수를 저장하는데 사용되며, 주로 double이 사용된다.

- boolean은 true와 flase 2가지 값만 표현할 수 있으면 되므로, 가장 작은 크기인 1byte.
- char은 자바에서 유니코드 (2byte 문자체계)를 사용하므로 2byte.
- byte는 크기가 1byte라서 byte.
- int (4byte)를 기준으로 짧아서 short (2byte), 길어서 long (8byte)
- float는 실수 값을 부동소수점 방식으로 저장하기 때문에 float.
- double은 float보다 2배의 크기 (8byte)를 갖기 때문에 double.
참조
n bit의 개수 : 2^n
n bit 중 부호없는 정수의 범위: 0 ~ 2^n -1
n bit 중 부호있는 정수의 범위: -2^(n-1) ~ 2^(n-1) - 1

- 위의 표를 달달 외울 필요는 없고 정수형 (byte, short, int, long)의 경우 -2^(n-1) ~ 2^(n-1) - 1 이라는 정도만 기억하자.
- 실수형은 정수형과 달리 같은 크기라도 훨씬 큰 값을 표형할 수 있으나 오차가 발생할 수 있다는 단점이 있다.
- 그래서 정말도가 중요한데, 정밀도가 높을수록 발생할 수 있는 오차의 범위가 줄어든다.
- float의 정밀도는 7자리인데, 이것은 10진수로 7자리의 수를 오차없이 저장할 수 있다는 뜻이다.

- 실수형에서는 저장 가능한 값의 범위뿐만 아니라 정밀도도 타입 선택의 중요한 기준이 된다.
상수 (constant)
- 상수는 변수와 같이 값을 저장할 수 있는 공간이지만 변수와 달리 다른 값으로 변경이 불가능하다.
- 상수는 한번만 값을 저장 가능한 변수
- 선언 방법은 변수와 같으며 단지, final 키워드만 붙여주면 된다.
final int MAX_SPEED = 10;
- 상수는 반드시 선언과 동시에 초기화 해야하며, 그 후, 상수의 값을 변경하는것은 허용하지 않는다.
- 상수의 이름은 모두 대문자 (Named Convention)로 하는 것이 관례이며
여러 단어로 이루어져 있으면 '_'로 구분한다.
JDK1.6부터 상수를 선언과 동시에 초기화하지 않아도 되며, 사용하기 전에 초기화하면 되지만, 왠만하면 선언과 동시에 초기화 하는 습관이 중요하다.
리터럴 (literal)
- 리터럴은 우리가 기존에 알고 있던 '상수'의 다른 이름이다.
- 그 자체로 값을 의미하는것을 말한다.
- 프로그램에서 사용하는 모든 숫자, 값, 논리 값 ex) 10, 3.14, 'A', true
- 상수풀에 저장될때 정수는 int, 실수는 double로 저장
final int MAX_VALUE = 100;
상수가 필요한 이유
- 나도 처음에는 왜 상수가 필요한가 생각이 들었다. 리터럴을 직접 쓰면 되는데 굳이 상수가 왜 필요할까 많은 생각이 들었다.
- 상수를 쓰는 이유는 복잡한 로직에서 리터럴에 '의미 있는 이름'을 붙여서
코드의 이해와 수정을 쉽게 만들수 있다.
리터럴의 타입과 접미사
- 변수의 타입이 존재하는 것처럼 리터럴에도 타입이 존재한다.

- 리터럴에 붙이는 접미사는 대소문자 구분이 없다.
- 정수형과 실수형에는 여러 타입이 존재하므로, 리터럴에 접미사를 붙여서 타입을 구분한다.
- long 타입의 리터럴 접미사는 'l' 또는 'L'을 붙이고 접미사가 없으면 int타입 리터럴로 간주한다.
- byte와 short 타입 리터럴의 접미사는 따로 존재하지 않으며 int 타입 리터럴을 대신 사용한다.
- 또한 10진수 이외에도 2,8,16진수로 표현된 리터럴을 변수에 저장할 수 있으며
16진수에는 '0x' 또는 '0X'를 사용하며 8진수에는 0을 붙인다.
2진수에는 JDK1.7부터 0b를 붙여서 사용한다.
- JDK1.7부터 정수형 리터럴의 중간에 구분자 '_'를 넣을 수 있게 되어 큰 숫자의 가독성이 쉬워졌다.
- 실수형에서 float 타입은 리터럴 접미사에 'f' 또는 'F'를 붙이고,
double 타입의 리터럴은 'd' 또는 'D'를 붙이지만, 일반적으로 생략이 가능하다.
- 리터럴에 소수점이나 10의 제곱을 나타내는 기호 E 또는 e, 그리고 접미사 f,F,d,DFMF 포함하고 있으면 실수형 리터럴로 간주한다.
| 자료형 | 실수형 리터럴 | 다른 형태의 동등한 표현 |
|---|
| double | 10. | 10.0 |
| double | .10 | 0.10 |
| float | 10f | 10.0f |
| float | 3.14e3f | 3140.0f |
| double | 1e1 | 10.0 |
| double | 1e-3 | 0.001 |
- 잘 사용하지는 않지만 기호 p를 통해 2의 제곱을 표현하기도 한다.
타입의 불일치
- 리터럴의 타입과 변수의 타입이 일치하는게 매우 일반적이지만,
타입이 달라도 저장범위가 넓은 타입의 값을 저장하는 것은 허용된다.
int i = 'A'
long l = 123
double d = 3.14f
- 그러나, 리터럴의 값이 변수의 타입의 범위를 넘어서면 에러가 발생한다.
참고
float은 접미사나 정밀도등 여러가지 신경쓸께 많으니, double을 그냥 사용하자.
문자 리터럴과 문자열 리터럴
- 작은따옴표로 문자 하나를 감싼 것을 '문자 리터럴', 두 문자 아싱은 큰 따옴표로 감싸야하며
'문자열 리터럴이라고 한다.'
- char 타입의 변수는 단 하나의 문자만 저장이 가능하며, 여러 문자 (문자열)를 저장하기 위해서는
String 타입을 사용해야한다.
- 문자열 리터럴에 "" 빈 문자열을 허용하지만, 문자 리터럴은 반드시 ''안에 하나의 문자가 있어야 한다.
- 원래 String은 클래스이므로, 아래와 같이 객체를 생성하는 new 연산자를 사용해야하지만, 특별히 new 연산자를 사용안해도 된다.
String name = new String("JAVA");
String name = "JAVA"
- 덧셈 연산자를 사용하여 문자열을 결합할 수 있다.
- 덧셈 연산자는 피연산자가 모두 숫자일때는 두 수를 더하지만, 피연산자 중 어느 한쪽이 String이면
나머지 한쪽을 먼저 String으로 형변환 후, 두 String을 결합한다.
문자열 + any type -> 문자열 + 문자열 -> 문자열
any type + 문자열 -> 문자열 + 문자열 -> 문자열
형식화된 출력 - printf()
- 화면에 출력할때 우리는 지금까지 System.out.println()을 써왔지만,
값을 그대로 출력하기 때문에 값을 특정 포맷으로 출력하고 싶을때는 매우 불편하다.
- 이 점을 해결할 함수가 System.out.printf()함수 이다.
- printf() 함수는 지시자를 통해 어떻게 출력할 것인지를 지정해주는 역할을 한다.
- 출력을 2개를 하고 싶으면, 지시자를 2개를 지정해줘야한다.
- println과 또 다른 차이는 printf는 자동으로 개행을 해주지 않아서 %n이라는 지시자를 넣어줘야한다.
| 지시자 | 설명 |
|---|
| %b | 불리언 (boolean) 형식으로 출력 |
| %d | 10진 정수의 형식으로 출력 |
| %o | 8진 정수의 형식으로 출력 |
| %x, %X | 16진 정수의 형식으로 출력 |
| %f | 부동 소수점의 형식으로 출력(소수점 아래 6자리까지) |
| %e, %E | 지수 표현식의 형식으로 출력 |
| %c | 문자로 출력 |
| %s | 문자열로 출력 |
| %g | 부동소수점을 간략히 표현하여 출력 |
참조
Integer.toBinaryString(int i) : 정수를 2진 문자열로 변환
%g: 실수형 값을 간략히 표현할때 사용
화면에서 입력받기 - Scanner
- Scanner 클래스를 이용하여 사용자가 직접 입력을 할 수도 있다.
- 방법
- import java.util.*; // Scanner 클래스를 사용하기 위해 추가
- Scanner scanner = new Scanner(System.in); // Scanner 클래스의 객체 생성
- String input = scanner.nextLine(); // 입력받은 내용을 input에 저장
- int num = Integer.parseInt(input); // 입력받은 내용을 input 타입의 값으로 변환