1. 변수
- 하나의 값을 저장할 수 있는 메모리 공간(RAM)
- 변수의 선언
2. 변수, 상수, 리터럴
변수(variable) - 하나의 값을 저장하기 위한 공간
상수(constant) - 한 번만 값을 저장 가능한 변수
리터럴(literal) - 그 자체로 값을 의미하는 것
int score = 100;
score = 200;
final int MAX = 100;
MAX = 200; // 에러
char ch = 'A';
String str = "abc";
3. 리터럴의 접두사와 접미사
종류 | 리터럴 | 접미사 |
논리형 | false, true | 없음 |
정수형 | int - 123, 0b0101, 077, 0xFF long - 100L |
L - 씀 |
실수형 | long - 3.14, 3.0e8, 0x1.0p-1 float - 1.4f |
f(float)- 씀, d(double) - 생략가능 |
문자형 | 'A', '1', '\n' | 없음 |
문자열 | "ABC", "123", "A", "true" | 없음 |
int i = 100; // 10진수
int b = 0b0101; // 2진수
int oct = 0100; // 8진수
int hex = 0x100; // 16진수
long l = 10_000_000_000L; // _ > jdk 1.7 부터 추가 됨 숫자가 큰 경우에 알아보기 쉽게 넣기
float f = 3.14f; // f생략불가
double d = 2.34d; // d생략가능
10. >> 10.0
.10 >> 0.10
-- 둘다 모두 실수형 접미사가 없기 때문에 double
10f >> 실수형 float
10e3 >> 1000.0 >> 접미사가 없기 때문에 double
4. 변수와 리터럴의 타입 불일치
- 범위가 '변수' > '리터럴' 인 경우 OK
- 범위가 '변수' < '리터럴' 인 경우 error
int a = 30_0000_0000; // int의 범위 +-20억이 벗어남
long l = 3.14f // long < float
- long이 8byte, float가 4byte 이기때문에 에러가 안날것 같지만 실수형이 정수형보다 크기때문에 에러 발생
float f = 3.14 // float < double 에러
- byte, short 변수에 int 리터럴 저장 가능
5. 기본형과 참조형
- 기본형(Primitive type)
boolean, char, byte, short, int, long, float, double
실제 값을 저장
- 참조형(Reference type)
기본형을 제외한 나머지(String, System 등)
메모리 주소를 저장(4byte(32bit) 또는 8 byte(64bit))
Date today; // 참조형 변수 today
todya = new Date(); // today 에 객체 주소를 저장
6. 기본형의 종류와 크기
논리형(boolean) - true와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다.
문자형(char) - 문자를 저장하는데 사용되며 변수당 하나의 문자만을 저장할 수 있다.
정수형 - 주로 int, long 사용
byte : 이진데이터에 사용 / short : c언어와의 호환을 위해 추가됨(잘 안쓰임)
실수형 - float, double
1 byte | 2 byte | 4 byte | 8 byte | |
논리형 | boolean(true, flase) | |||
문자열 | char(유니코드) | |||
정수형 | byte | short(int 보다 작아서 short) | int(기본) | long(int 보다 커서 롱) |
실수형 | float(부동소수점 | double(정밀도가 높아서 붙여짐) 실수형 기본 |
7. 기본형 표현범위
byte - 1byte - 8bit
byte b = 3; >> 00000011
비트 하나는 부호비트이다.
그래서 > byte -2^7 ~ 2^7-1
양수 : 0-7bit / 음수 : 1-7bit
2^7 = 128개 / 2^7 = 128개 >>> 256개 = 2^8 >> -128 ~ 127
short : - 2byte - 16bit
양수 - 15bit - 2^15
음수 - 15bit - 2^15 >> - 32768 ~ 32767
...
8. printf()의 지시자
System.out.printf("%d", 15); // 15 10 진수
System.out.printf("%0", 15); // 17 8 진수
System.out.printf("%s", Integer.toBinaryString(15)); // 1111 2 진수를 스트링으로 변호환하여 문자열로 출력 %s > 문자열
- 8진수 16진수에 접두사 붙이기
System.out.printf("%#o", 15); // 017
System.out.printf("%#x", 15); // 0x17
System.out.printf("%#X", 15); // 0X17
- 실수 출력
float f = 123.4567890f;
System.out.printf("%f", f); // 소수점 아래 6자리 까지 출력 123.456787
>>> 끝자리가 다르다
그 이유는 float 의 정밀도는 7자리
뒤에 87 은 의미가 없는 수. 그래서 이것을 표현하려면 flaot 보다 정밀도가 높은 double 을 사용하는것이 낫다 (double 는 15자리)
System.out.printf("%e", f); // 지수 형식 1.2345678e+02
>> 마지막수가 8 > 이유는 반올림되어 표시 실제 수는변화 없음.
System.out.printf("%g", 123.456789); // 123.457 간략히 보여줌 7자리
System.out.printf("%g",0.00000001); // 1.00000e-8 간략히 보여줌
System.out.printf("[%5d]%n", 10); // 5자리에서 10출력 오른쪽정렬 [ 10]
System.out.printf("[%-5d]%n", 10); // 5자리에서 10출력 왼쪽정렬 [10 ]
System.out.printf("[%05d]%n", 10); // 5자리에서 10출력 빈공간 0으로 채우기 [00010]
%전체자리.소수점아래자리f
System.out.printf("d=%14.10f%n", d); // 전체 14자리 중 소수점 아래 10자리
1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
1 | . | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 0 |
앞에 두칸은 공백 뒤에 두칸은 숫자 0 으로 채운다.
String url = "www.codechobo.com";
System.out.printf("[%s]%n", url); // [www.codechobo.com]
System.out.printf("[%20s]%n", url); // 전체 20칸에서 오른쪽정렬 [ www.codechobo.com]
System.out.printf("[%-20s]%n", url); // 전체 20칸에서 왼쪽정렬 [www.codechobo.com ]
System.out.printf("[%.8s]%n", url); // 앞에서 8글자 [www.code]
9. 타입간 변환 (문자 <> 숫자)
/* 문자를 숫자로 변환하여 계산 */
// 문자열 3 을 문자 3으로 바꿈 문자 3 - 문자 0 = 숫자 3
System.out.println("3".charAt(0) -'0');
System.out.println(3 + 1);
// 문자 3은 10진수 숫자로 51
// 51 -1 임
System.out.println('3' - 1);
System.out.println(3+'0');
System.out.println((char)(3+'0'));
- 실행 결과
10. 연산자 우선순위
산술 > 비교 > 논리 > 대입 대입은 젤 마지막!
단항 > 이항 > 삼항 단항 연산자의 우선순위가 이항 연산자보다 높다
단항 연산자와 대입연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
11. 형변환
int -> char : (char)65 >> 'A'
char -> int : (int)'A' >> 65
float -> int :(int)1.6f >> 1
int -> float : (float)10 >> 10.0f
12. 자동 형변환
float f = 1234; // int 타입의 값을 float타입의 변수에 저장 > 자동 형변환
float f = (float)1234; // 형변환
int i = 3.14f // 큰놈을 작은놈에 넣는다 값이 잘린다. >> 값 손실 발생
int i = (int)3.14f // 수동형변환
byte a = (byte)300;
System.out.println(a);
>> 실행결과 44 값 손실이 있다.
300 > 이진수로 > 100101100
이 수를 1바이트인 byte에 넣으면 맨 앞 숫자 1 이 삭제되어 00101100 이 들어간다
따라서 변수 a에는 44가 들어간다.
13. 산술 변환
연산 전에 피연산자의 타입을 일치시키는 것
- 둘 중 큰 타입으로 일치 시킨다.
long + int > long + long > long
float + int > float + float > float
double + float > double + double > double
- 피연산자의 타입이 int 보다 작으면 int 로 변환
byte + short > int + int > int
charb + short > int + int > int
ex) '2' - '0'
char - char > int - int >int
> 50 - 48 > 2
int a = 1_000_000; // 1백만
int b = 2_000_000; // 2백만
long c = a * b;
public class Ch3 {
public static void main(String [] args){
int a = 1_000_000; // 1백만
int b = 2_000_000; // 2백만
long c = a * b;
System.out.println(c);
c = (long)a * b;
System.out.println(c);
}
}
- 실행결과
두 연산 결과가 long 의 사이즈를 초과 하기 때문에 첫번재 결과는 잘못된 결과가 나왔다
따라서 산술 변환을 일으키기 위해 a, b 중 a를 long 으로 변환하여 연산하여 올바른 결과가 나왔다.
14. switch 문
- switch 문의 조건식 결과는 정수 또는 문자열이어야 한다.
- case 문의 값은 정수 상수(문자포함), 문자열만 가능하며 중복되지 않아야 한다.
int num, result;
final int ONE = 1;
....
switch(result){
case '1' : // 정수 49와동일
case ONE:
case "YES": // 문자리터럴 jdk 1.7 부터
case num : // 변수
}
- java 버전별 switch 문 변화는 아래 블로그에서 확인
congcoding.tistory.com/73
'개발' 카테고리의 다른 글
Java - 객체지향개념 (0) | 2021.05.30 |
---|---|
Java - 배열 (0) | 2021.05.10 |
Java (0) | 2021.05.05 |
클라우드 컴퓨팅의 이점 (0) | 2021.04.08 |
Azure AI (0) | 2021.04.06 |