변수
- 변하는 수
- 변수를 사용하기 위해 어떤 형태의 자료를 저장할 것인지 정해야 함. 이 형태를 '자료형'이라고 함.
- 변수를 선언한다 = 선언한 변수 이름으로 어떤 위치에 있는 메모리를 얼마 만큼의 크기로 사용하겠다
- 영문자나 숫자 사용 가능. 특수 문자 중에는 $, _만 사용 가능. 예약어는 사용 불가능
기본 자료형/프리미티브 타입(primitive)
- 자바 라이브러리에서 기본으로 제공. cf) 참조데이터타입
정수형 | 문자형 | 실수형 | 논리형 | |
1바이트 | byte | - | - | boolean |
2바이트 | short | char | - | - |
4바이트 | int | - | float | - |
8바이트 | long | - | double | - |
1. 정수 자료형
- 양수, 음수, 0을 나타낼 때 사용하는 자료형
- byte형: 바이트 단위의 정보를 저장하거나 통신할 때 주로 사용. 동영상이나 음악 파일을 재생할 때 또는 네트워크로 데이터를 전송할 때 사용 (-128~127)
- short형: -32,768~32,767
- int형: 컴퓨터에서 정수로 연산을 할 때 4바이트 단위로 처리하는 것이 가장 효율적이기 때문에 가장 많이 사용
- long형: 자바는 모든 정수 값을 기본으로 int 형으로 처리하기 때문에 long형으로 처리하라고 컴파일러에게 알려줘야 함. long형을 나타내는 식별자인 L이나 l 을 사용하려는 숫자 뒤에 붙인다. ex) long num = 12345678900L; (* long num = 1000; 의 경우에는 오류가 발생하지 않음 -> int 형 범위를 넘지 않고 int형이 long형으로 자동형 변환되기 때문. 즉, 범위 내부에 있는 값을 사용할 때는 식별자가 필요없음)
2. 문자 자료형
* 문자 인코딩: 문자를 정해진 코드 값으로 변환하는 것.
* 문자 디코딩: 코드 값을 다시 문자로 변환하는 것.
- 아스키코드(ASCII): 영문자, 숫자, 특수 문자 등을 나타내는 문자 세트. 1바이트만 사용
- 유니코드(unicode): 각 언어의 표준 인코딩을 정의해놓은 것. 유니코드의 1바이트는 아스키코드 값과 호환되고, 그 밖의 문자를 2바이트나 그 이상의 조합으로 표현함. 자바는 유니코드에 기반하여 문자를 표현한다. (참고: 유니코드 찾는 사이트, 유니코드 한글 )
- 유니코드를 표현하는 인코딩 방법에는 크게 UTF-8과 UTF-16이 있음. 자바의 기본 인코딩 방식은 모든 문자를 2바이트로 표현하는 UTF-16이지만 메모리가 낭비될 수 있기 때문에 UTF-8을 더 많이 사용. UTF-8은 각 문자마다 1바이트에서 4바이트까지 사용하여 문자를 나타내는 방식. UTF-16에 비해 메모리 낭비가 적고 전송 속도가 빠름. 인터넷에서 많이 사용
char myChar = 'A';
- 문자를 변수에 대입하면 문자 그대로 저장되는 것이 아니라, 그 문자에 해당하는 정수값(아스키 코드값)이 저장됨
- 프로그램에서 문자를 사용할 때는 작은 따옴표(' ')를 사용.
- 문자를 여러 개 이은 문자열을 사용할 때는 큰따옴표(" ")를 사용. 문자열의 끝에는 항상 널 문자('\0')가 있음.=> 기본 자료형으로는 표현할 수 없음(String 클래스 사용)
- 문자와 문자열은 전혀 다른 값을 가짐. 'A'는 정수 값 65로 정해져 있는 문자이고, "A"는 "A \0"과 같이 쓰임.
- char형은 문자 자료형이지만 컴퓨터 내부에서는 정수 값으로 표현되기 때문에 정수 자료형으로 분류하는 경우도 있음. 다른 정수 자료형과 차이점은 char형은 음수 값을 표현할 수 없다는 것.
package hello;
public class CharEx1 {
public static void main(String[] args) {
char ch1 = 'A';
System.out.println(ch1); // 결과값: A
System.out.println((int)ch1); // 결과값: 65
char ch2 = 66;
System.out.println(ch2); // 결과값: B
int ch3 = 67;
System.out.println(ch3); // 결과값: 67
System.out.println((char)ch3); // 결과값: C
}
}
package hello;
public class CharEx2 {
public static void main(String[] args) {
char ch1 = '한';
char ch2 = '\uD55C'; // 유니코드값을 직접 사용 가능
System.out.println(ch1);
System.out.println(ch2); // 결과값: 한
}
}
3. 실수 자료형
- 부동 소수점 방식: 실수 값 0.1은 1.0 X 10^1 로도 표현할 수 있음 => 가수 부분(1.0)과 지수 부분(-1)을 나누어서 실수를 나타내는 방식을 부동 소수점 방식이라고 함. 무한의 실수를 표현하기 위한 방식.
- float형: 부호 1비트 + 지수부 8비트 + 가수부 23비트 = 총 32비트 (4바이트)
- double형: 부호 1비트 + 지수부 11비트 + 가수부 52비트 = 총 64비트 (8바이트). 자바에서 실수는 double형을 기본으로 사용. double형이 더 정밀하게 실수 표현 가능.
package hello;
public class DoubleEx1 {
public static void main(String[] args) {
double dnum = 3.14;
float fnum = 3.14F; // double형이 아닌 float형 값이 대입된다는 의미로 F나 f를 붙여서 식별해줌
System.out.println(dnum); // 출력 결과: 3.14
System.out.println(fnum); // 출력 결과: 3.14
}
}
- 실수의 오차가 존재하는 것은 프로그램의 문제가 아니라 컴퓨터 구조 상의 문제
package hello;
public class DoubleEx2 {
public static void main(String[] args) {
double dnum = 1;
for (int i = 0; i < 1000; i++) {
dnum = dnum + 0.1;
}
System.out.println(dnum); // 출력 결과: 100.99999999999854
}
}
4. 논리 자료형
- 어떤 변수의 참, 거짓의 값을 나타내는 데 사용
- 1바이트로 값 저장. true / false 두 가지 값만 가짐
package hello;
public class BooleanEx {
public static void main(String[] args) {
boolean isMarried = true;
System.out.println(isMarried);
}
}
자료형 없이 변수 선언하기
- 자바의 모든 변수를 사용할 때는 사용할 자료형을 정확히 명시해야 함. 즉, 어떤 변수가 얼마만큼의 메모리를 사용하고 어떤 방식으로 그 값을 저장할지 자료형으로 선언해주는 것.
- 자바 10부터는 자료형을 쓰지 않고도 변수 사용 가능 => 지역 변수 자료형 추론(local variable type interface): 변수에 대입되는 자료를 보고 컴파일러가 추측하여 알 수 있음
- 자바에서 var를 사용할 때
1) 한번 선언한 자료형 변수를 다른 자료형으로 사용 불가
2) 지역 변수만 가능 (* 지역변수: 프로그램의 { } 에서 사용할 수 있는 변수)
상수(constant)
- 항상 변하지 않는 값
- 상수를 사용할 때는 상수라는 것을 구분하기 위해서 변수와 다르게 전체를 대문자로 사용하는 것이 관례.
- 프로그램 내부에서 반복적으로 사용하고, 변하지 않아야 하는 값을 상수로 선언하여 사용하면 좋음.
- 참고: 자바의 final 는 언제 사용할까 | 룰라랄라코딩
final double PI = 3.14;
final int MAX_NUM = 100;
package hello;
public class Constant {
public static void main(String[] args) {
final int MAX_NUM = 100; // 선언과 동시에 초기화
final int MIN_NUM;
MIN_NUM = 10; // 사용하기 전에 초기화. 초기화하지 않으면 오류 발생
System.out.println(MAX_NUM);
System.out.println(MIN_NUM);
}
}
리터럴(literal)
- 프로그램에서 사용하는 모든 숫자, 문자, 논리값(true, false)을 일컫는 말.
- 리터럴은 프로그램이 시작할 때 시스템에 같이 로딩되어 특정 메모리 공간인 상수 풀(constant pool)에 놓인다. 예를 들어 int num = 3; 문장에서 값 3이 메모리 공간 어딘가에 존재해야 num 변수에 그 값을 복사할 수 있음. 즉, 숫자가 변수에 대입되는 과정은 일단 숫자 값이 어딘가 메모리에 쓰여 있고, 이 값이 다시 변수 메모리에 복사되는 것.
- 참고: 위키백과
형 변환(Type Conversion)
정수와 실수는 컴퓨터 내부에서 표현되는 방식이 다르기 때문에 정수와 실수를 더한다고 할 때 하나의 자료형으로 통일한 한 우에 연산을 해야 한다. 이때 형변환을 해줘야 함.
1. 묵시적 형 변환/자동 형 변환
- 바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우
byte bNum = 10; // 1 byte
int iNum = bNum; // 4 byte - 남은 3byte는 0으로 채워짐
- 덜 정밀한 자료형(정수)에서 더 정밀한 자료형(실수)으로 대입하는 경우: 같은 4 byte 라도 float형이 더 정밀하게 데이터 표현 가능
int iNum2 = 20;
float fNum = iNum2;
- 연산 중에 자동 변환되는 경우
int iNum = 20;
float fNum = iNum;
double dNum;
// fNum + iNum 에서 int형이 float형으로 변환. 두 변수를 더한 값이 dNum에 대입되면서 double형으로
dNum = fNum + iNum;
2. 명시적 형 변환/강제 형 변환
* 캐스팅 연산자 사용: (byte) num
- 바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우
// * 이 경우 대입된값이 10을 1바이트 안에 표현할 수 있으므로 자료 손실이 없음
int iNum = 10;
byte bNum = (byte)iNum;
// * 1000은 byte형 범위(-128-127)을 넘기 때문에 자료 손실이 발생해 대입된 값이 -24로 출력됨
int iNum = 1000;
byte bNum = (byte)iNum;
- 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우
double dNum = 3.14;
int iNum2 = (int)dNum; // 출력값: 3 (소수점 이하 부분 생략됨)
- 연산 중 형변환
double dNum1 = 1.2;
float fNum2 = 0.9F;
int iNum3 = (int)dNum1 + (int)fNum2; // 두 실수가 각각 형 변환 => 1, 0 -> 1
int iNum4 = (int)(dNum1 + fNum2); // 두 실수의 합이 계산된 후 형 변환 => 2.1 -> 2
* 내용 출처: 자바 프로그래밍 입문(박은종)
'Web > Java' 카테고리의 다른 글
코딩테스트와 실무 역량 모두 잡는 알고리즘 스터디(Java반) (2) 스터디 1,2주차 (0) | 2021.10.26 |
---|---|
코딩테스트와 실무 역량 모두 잡는 알고리즘 스터디(Java반) (1) 후기 (0) | 2021.10.26 |
[Java] 값을 입력 받았을 때, 조건문을 건너 뛰는 경우 (0) | 2021.06.11 |
[Java] 반복문에서 break를 사용해야할 때 (0) | 2021.06.04 |
[Java] Eclipse (이클립스) 단축키 (0) | 2021.06.03 |