[Day- 16] 변수와 타입
파이썬은 밀려서 블로그를 썼더니 순서가 뒤죽박죽이다...
자바는 꼭 매일매일 작성해보겠다.
2023.01.12(목)
<수업 내용>
chap.01 자바 시작하기
01-1. 자바 설치 및 환경변수 설정
01-2. 이클립스 설치
01-3. 이클립스 모듈 패키지 클래스
chap.02 변수와 타입
02-1 변수
02-2 기본 타입
02-3 타입 변환
01. 변수와 타입
1) 변수
: 값을 지정할 수 있는 메모리의 특정 번지에 붙이는 이름
ㆍ변수 선언
: 어떤 타입의 데이터를 저장할 것인지, 변수 이름이 무엇인지를 결정
- 변수이름으로 예약어 사용불가
ㆍ변수 초기화
: 변수에 최초로 값이 저장되는 것 (변수에 값이 저장되어야 변수가 생성됨)
- 대입 연산자(=)를 사용해 값을 저장
- 하나의 변수에는 하나의 값만 저장할 수 있음
- 변수 선언 시 사용한 타입의 값만 저장할 수 있음
int score; //변수 선언
score = 90; //변수 초기화
int score = 90; //한 줄로 작성 가능
ㆍ변수 사용
: 변수의 값을 읽거나 변경하는 것.
- 출력문이나 연산식 내부에서 변수에 저장된 값을 출력하거나 연산할 때 사용
// 값 복사
int x = 10;
int y = x;
//값 교환
int x = 3;
int y = 5;
int temp = x; //새로운 변수 선언
x = y;
y = temp;
ㆍ변수 사용범위
: 변수는 변수가 선언된 중괄호{} 안에서만 사용 가능
※ 선언 위치에 따라 사용가능한 범위가 다름
- 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에,
- 특정 블록 내부에서만 사용하고 싶다면 해당 블록 내에 선언
2) 기본 타입
- 정수타입: byte, short, char, int, long
- 실수타입: float, double
- 논리타입: boolean
ㆍ 정수타입
타입 | 메모리 사용크기 | 저장되는 값의 허용 범위 | ||
byte | 1byte | 8bit | -2^7 ~ (2^7-1) | -128 ~ 127 |
short | 2byte | 16bit | -2^15 ~ (2^15-1) | -32.768 ~ 32.767 |
char | 2byte | 16bit | 0 ~ (2^16-1) | 0 ~ 65535(유니코드) * 음수x |
int | 4byte | 32bit | -2^31 ~ (2^31-1) | -2,147,483,648 ~ 2.147.483,647 |
long | 8byte | 64bit | -2^63 ~ (2^63-1) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
+ 진수입력도 자바가 정수로 인식함
2진수 | 0B 또는 0b로 시작하고 0과 1로 구성 | 0b1011 | 11 |
8진수 | 0으로 시작하고 1~7로 구성 | 013 | 11 |
10진수 | 소수점이 없는 0~9로 구성 | 11 | 11 |
16진수 | 0X 또는 0x로 시작하고 0~9와 a~f로 구성 | 0xB3 | 179 |
<int와 long 타입>
- 기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주함
- 타입의 범위를 초과하면 컴파일 에러가 발생함
- 허용범위 초과할 경우 long타입임을 컴파일러에게 알려줘야 함(대문자 L 붙이기)
long var1 = 10; // int타입의 허용범위 이내 L붙이지 않아도 됨
long var2 = 20L;
//long car3 = 100000000000; ← 컴파일 에러
long var4 = 1000000000000L; //컴파일러에서 정수 리터럴을 int타입으로 간주 허용범위 넘어가면 L붙여줘
<char 타입>
- 작은 따옴표(')로 감싼 문자 리터럴은 유니코드로 변환되어 저장됨
- 10진수 또는 16진수 형태로도 유니코드 저장 가능
- 유니코드: 세계 각국의 문자를 2byte로 표현할 수 있는 숫자로 매핑한 국제 표준 규약
char c1 = 'A'; //문자를 직접 저장
char c2 = 65; //10진수로 저장
char c3 = '\u0041'; //16진수로 저장
char c4 = '가'; //문자를 직접 저장
char c5 = 44032; //10진수로 저장
char c6 = '\uac00'; //16진수로 저장
char var1 = 'A';
int var2 = 'A'; //유니코드는 정수 int타입 변수에도 저장 가능
System.out.println(var1); //A를 출력
System.out.println(var2); //65를 출력 유니코드 자체가 출력됨
※ 참고
String 타입 - 클래스 타입
- 큰따옴표(")로 감싼 문자들
- 이스케이프 문자
이스케이프 문자 | 출력 용도 |
\t | 탭만큼 띄움 |
\n | 줄 바꿈 |
\r | 캐리지리턴 |
\" | "출력 |
\' | '출력 |
\\ | \출력 |
\u16진수 | 16진수 유니코드에 해당하는 문자 출력 |
ㆍ 실수타입
타입 | 메모리 사용크기 | 저장되는 값의 허용 범위 | 정밀도 | |
float | 4byte | 32bit | (1.4*10^-45) ~ (4.3*10^38) | 7자리 |
double | 8byte | 64bit | (4.9*10^-324) ~ (1.8*10^308) | 15자리 |
- 실수 리터럴을 기본적으로 double 타입으로 해석
- float 타입으로 저장하기 위해서 f 또는 F 붙여야 함
- double 타입 float타입 보다 2배 정밀도가 높아 더 정확한 데이터 저장 가능
- 특별한 이유가 없는 한 double타입으로 저장하는 것이 좋음
ㆍ 논리타입
- boolean 타입변수 1byte 크기
- 논리 리터럴로 true와 false를 사용
boolean stop = true;
boolean state = false;
03. 타입 변환
1) 자동 타입 변환
: 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생
ㆍ 타입의 크기
byte < short < int < long < float < double
큰 허용 범위 타입 = 작은 허용 범위 타입
byte byteValue = 10;
int intValue = byteValue;
// 정수 타입이 실수 타입으로 자동 타입 변환
long longValue = 5000000000L;
float floatValue = longValue; //5.0E9f로 저장
double doubleValue = longValue; //5.0E9로 저장
2) 강제 타입 변환(casting)
: 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장
- 캐스팅 연산자 괄호()를 사용
작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입
double doubleValue = 3.14;
int intValue = (int) doubleValue; //정수 부분인 3만 저장
3) 연산에서 타입 변환
ㆍ 정수 연산에서 자동 타입변환
- int타입보다 작은 byte, short 타입은 int 타입으로 자동 변환 (연산 결과 int 변수에 저장해야 함)
- 두 피연산자 중 허용 범위가 큰 타입으로 변환되어 연산을 수행
byte result1 = 10 + 20; //연산을 먼저해 30을 만들고 변수에 30을 저장
//피연산자가 변수가 아니므로 int타입 변환 필요없음
byte x = 10;
byte y = 20;
int result2 = x + y; //int타입 변환 필요
ㆍ 실수 연산에서 타입변환
- 피연산자 연산 시 허용범위가 큰 타입으로 변환
int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; //int타입의 피연산자가 double타입으로 자동 변환
- 정수 연산을 실수 연산으로 강제 변경
int x = 1;
int y = 2;
double result = x / y; //정수 연산의 결과는 정수이므로 0.5가 아닌 0이 저장됨
System.out.println(result);
>>> 0.0
int x = 1;
int y = 2;
double result = (double) x / y; //x,y 중 하나 이상을 타입 변환
System.out.println(result);
>>> 0.0
4) 문자열 타입 변환
ㆍ + 연산에서 문자열의 자동 타입변환
※ +연산자
- 피연산자가 모두 숫자일 경우에는 덧셈연산
- 하나가 문자열일 경우 나머지 피연산자도 문자열로 자동 변환 (결합연산)
- 앞에서분터 순차적으로 + 연산을 수행, 수행된 연산이 결합연산이라면 이후 +연산은 모두 결합연산
- 괄호()는 최우선으로 연산을 수행
int value = 1 + 2 + 3
> int value = 6;
String str1 = 1 + 2 + "3";
> String str1 = "33"
String str2 = 1 + "2" + 3;
> String str2 = "123";
String str3 = "1" + 2 + 3;
> String str3 = "123";
String str4 = "1" + (2 + 3);
> String str4 = "15"
ㆍ 문자열을 기본 타입으로 강제 타입변환
- Integer.psrseInt() / Double.parseDouble() 등 메소드 사용
- 숫자로 되어있는 문자열을 기본 타입으로 변환
- 숫자가 아닌 한글, 알파벳, 특수문자 등이 포함되어있을 경우 숫자 형식 예외 발생
- char타입은 강제 타입변환 불가능
String str = "300000";
int value = Integer.parseInt(str);
ㆍ 기본타입을 문자열로 강제 타입변환
String str = String.vlaueof(기본타입값);
String.vlaueof(3)
> "3"