프로그래밍/Java
Java 자료형과 변수, 형 변환
브이몬
2021. 8. 11. 14:59
▶ 식별자 규칙
- 대소문자 구분
- 예약어 사용 불가(키워드, 리져브드워드: 클래스나 변수, 메서드 이름으로 사용불가)
- 숫자로 시작해서는 안된다.
- 첫 글자는 특수문자 '_'와 '$'만 허용
- 영문자(A~Z, a~z)와 숫자(0~9)와 밑줄(_)의 조합으로 사용 가능.
- 공백 불가
- 클래스 : 이름의 첫 글자는 항상 대문자. 두 단어가 합쳐지면 두 번째 첫 단어에도 대문자:Game Test
- 메서드(동사) : 첫 글자는 소문자, 두번째 단어 첫단어는 대문자 : go(), getTime()
- 변수(명사) : 첫글자는 소문자, 두 단어 합쳐지는 경우 두 번째 단어 첫 단어 대문자. 단어 사이에 '_'추가 : lastIndexOf, student_number
- 상수(변하지 않는 수) : 모두 대문자. 여러 단어로 이루어진 경우 '_'로 구분: PI, MAX_NUMBER
- 패키지 : 모두 소문자. 나중에 도메인이 된다. ex)com.naver : workspace안에 src안에 com폴더 안에 naver폴더가 만들어진다.
▶ 상수
- 한 번만 값을 저장 가능한 변수, 변하지 않는 수
- 원주율 3.14, 1년 12개월 등
- final 예약어를 사용하여 선언(final int MAX=100;)
- 상수를 사용하면 변하지 않는 값을 반복하여 사용할 때 의미있는 문자로 인식하기 쉽고, 변하더라도 선언한 부분만 변경하면 되므로 부분만 변경하면 되므로 여러부분을 수정할 필요가 없다.
- 상수는 사용하기전에 값을 초기화를 해야하고 바꿀 수 없다.
- 상수는 다른 변수와 구별하기위해 대문자로 사용한다.(MAX, MIN, PI)
▶ 변수(Variable)
- 단 하나의 값을 저장할 수 있는 메모리상(RAM)의 공간.
- 값을 여러번 저장하면 마지막에 저장한 값을 갖게 된다.
▶ 변수 선언
변수타입 변수이름;
int number // 정수형 변수 number를 선언
- 변수 타입
- 변수에 저장될 값의 타입(정수형, 실수형, 문자형 등등)
- 기본형과 참조형 ※ 기본형이 아니면 무족건 참조형
- 기본형 : 계산을 위한 실제 값을 저장(boolean, char, byte, short, int, long, float, double)
- 메모리구조: stack에 직접 값이 저장된다.
- 참조형 : 8개 기본형을 제외한 나머지 타입, 객체의 주소(메모리 값, 4byte or 8byte)를 저장(String, system)
- 메모리구조: stack에 주소값(참조값)이 저장이 되고 heap에 값이 저장된다.
- 기본형 : 계산을 위한 실제 값을 저장(boolean, char, byte, short, int, long, float, double)
- 변수 이름 : 값을 저장할 메모리 공간의 이름(담아놓는 것)
- 변수 초기화: 변수를 사용하기에 앞서 적절한 값을 저장해주는 것이 필요하다. 이것을 초기화라고 한다.(변수에 처음(최초)으로 값을 저장.
- int a=1; : 정수형 변수 a를 선언하고 변수의 값을 1로 초기화(1이 a에 할당).
▶ 자료형
프로그램을 작성하기 위한 자료의 형태.
기본형 | 1byte | 2byte | 4byte | 8byte |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
1. 정수형
- byte, short, int, long
- 소수점이 없는 단순한 수치형
- 주로 int 사용
- long 타입의 리터럴에는 접미사 'L' 또는 'l'(소문자 L)을 붙여야 한다.
- 리터럴에 접미사가 없으면 int타입으로 간주
- 'ㅣ'(소문자 L)는 숫자'1'과 혼돈할 수 있기 때문에 'L'로 사용하는 것이 좋다.
2. 실수형
- float, double
- 주로 double 사용 - 기본 자료형
- float형 리터럴에는 접미사 f가 사용 : 1.06f
- double형 리터럴에는 접미사 d가 사용 : 1.03d
- 접미사는 대소문자를 구분하지 않는다.
- 접미사를 생략하면 double형으로 간주한다.
3. 문자형
- char
- 변수에 하나의 문자를 저장 시 사용.
- ''사용
- 유니코드 대문자 A는 65, 소문자 a는 97, 숫자 0은 48.
- 기본형
4. 문자열
- String
- 객체형(클래스)
- "A"+"B"; //"A+B"
- ""+'7'; //"7"(문자열 7)
5. 논리형
- boolean
- true와 false 중 하나를 값으로 갖는다.
- 1byte 사용.
- 조건식과 논리적 계산에 사용.
- 값이 존재하는지, 배열이 비어있는지, 결과가 참인지 거짓인지
6. 지역변수 자료형 없이 사용(자바 10부터 지원)
- var i =10;
- Local variable type inference
- 추론 가능한 변수에 대한 자료형을 선언하지 않음
- Java Script, python 등 언어에서만 제공해왔었다.
- 한번 선언하여 추론된 변수는 다른 타입의 값을 대입할 수 없다.
- 스크립트 언어에서는 다른 타입 값을 대입할 수 있는데 자바에서는 가능하지 않다.
- 지역 변수만 사용 가능
var i =5;
var j =5.0;
var str="Hello world"
System.out.println(i);
System.out.println(j);
System.out.println(str);
str=3; //다른타입을 넣으면 오류. 스크립트언어는 가능.
※ 리터럴
- 그 자체 데이터인 것
- 프로그램에서 사용하는 숫자, 문자, 논리값을 뜻한다. : 'A', "AB", 123
- 리터럴은 상수 풀(constant pool)에 있다.
- 정수 리터럴을 int로 실수 리터럴은 double로 저장된다. 범위들이 넘어가면 접미사 L,l 또는 F,f 식별자를 써줘야 함.
- 리터럴은 상수와 의미가 같지만 프로그램에서 상수는 '값을 한번 저장하면 변경할 수 없는 저장 공간'으로 정의하기 때문에 이와 구분하기 위해 '리터럴'이라는 용어를 사용.
※ 확장 특수 문자 출력: printf
\n | (New Line) 줄을 바꿈 :Enter |
\t | (horizontal tap) 일정한 간격을 띄움 |
\b | (backspace) |
\r | (carriage teturn) 동일한 줄의 맨앞으로 커서만 옮긴다. |
\f | (form feed) 출력용지를 한 페이지 넘긴다. |
\a | (alert) 경고음이 난다. |
\u | 유니코드(16진수)문자 char a='\u 0041' |
\\ | (back slash) \문자를 출력한다. |
\' | '문자를 출력한다.(single quote) |
\'' | ''문자를 출력한다.(double quote) |
\0 | null 문자 |
※ 지시자 개행 문자 :printf
%d | 숫자(십진수) |
%s | 문자열, 출력을 문자랑 하기 때문에 %d도 문자가된다.(문자열+%d+문자열) |
%o | 8진수 |
%x, %X | 16진수 |
%c | 문자 |
%b | boolean형식 |
%e, %E | 지수형태표현 |
System.out.printf("[%5d]%n",10); //[00010], 나머지부분을 0으로 채운다.
System.out.printf("[%-5d]%n",10); //[10000], 왼쪽정렬이 되고 나머지는 0으로 채운다.
System.out.printf("%14.10f %n",d); //전체 14자리 중 소수점 아래 10자리
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
1 | . | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 0 |
앞에 빈자리는 공백으로 채운다.
. ~ 뒤에 14자리까지 10자리이다.
▶ 타입 간의 변환 방법(형 변환, casting)
- 서로 다른 자료형 간에 연산 등의 수행을 위해 하나의 자료형으로 통일.
- 묵시적 형 변환과 명시적 형변환이 있다.
- 바이트 크기가 작은 자료형에서 큰자료형으로 형 변환은 자동으로 이루어 진다.
- 덜 정밀한 자료형에서 더 정밀한 자료형으로 형 변환은 자동으로 이루어 진다.
1. 문자('5')와 숫자(5) 간의 형 변환
5 + '0' → '5'
'5'-'0' → 5
2. 문자열("5")로 변환, 문자열을 숫자(5)로 변환.
5 +"" → "5" ※" " 공백도 문자열. 스페이스가 문자열 한 개가 있는 것
Integer.parseInt("5"); → 5
'5'+"" → "5"
"5".charAt(0) →'5'
Double.parseDouble("3.4"); → 3.4
System.out.println(""+5); //문자열 7
System.out.println(5+5+""); //문자열 14, 왼쪽에서 오른쪽계산
System.out.println(""+5+5); //문자열 55, ((""+5)+5)
1. 강제 형 변환 (implicit type conversion)
- 변수 또는 상수의 타입을 다른 타입으로 변환
- (바꿀 타입)피연산자
double d = 85.4;
int score = (int)d; //(int)85.4 →85
2. 자동 형 변환(묵시적 형 변환, explicit type conversion)
float f = 1234;
//1234는 int타입
//작은타입 int 1234를 float(큰타입)에 저장.(문제없음)
int i = 3.14f;
//에러. flat 3.14f가 큰타입인데 작은타입으로 자동형변환 못한다.
//수동으로 직접 (int)3.14f →3.
// 값손실 생긴다.
1byte | → | 2byte | → | 4byte | → | 8byte | → | 4byte | → | 8byte |
byte | short (±3만표현) |
int | long (10^19 표현) |
float (10^38표현) |
double | |||||
↕ 자동형변환 못함. 수동으로 형변환. char |
└ →자동형변환가능→┘ ※ → 자동으로 형변환 가능. |
byte b= 100; | 100은 int이지만 byte타입의 범위가 -128~127안에 들어왔기 때문에 byte타입으로 형변환후 값을 대입. | |
byte b=(byte)100; | byte타입으로 범위안에 들어왔기때문엥 형변환. | |
byte b=(byte)1000; | 값손실로 -24가 저장됨 | |
byte b=1000; | 에러. 127을 넘기때문에 에러이다. | |
int i = 100; byte b =i; |
에러. i는 변수여서 컴파일러가 어떤값인지 알 수 없기 때문에 에러이다. | |
int = 100; byte b=(byte)i; |
변수 i를 byte타입으로 형변환 후 대입하면 에러가 없다. |
▶ 정수형의 오버플로우
0000 │
0001 │
0002 │
.... │
9998 │
9999 ↓
1 0000 오버플로우 발생(멈춤)
1 은보이지 않고(없어짐) 0으로 초기화된다.
0001 다시 시작
0002
오버플로우 발생
1111 0000↑
최대값 +1 → 최소값
최소값 -1 → 최대값
0000 1111
10진수 ↑
↑2진수 ↑
↑0002 0010 0001 0001 0000 ←최소값→ 0000 9999 ←최대값→ 1111 9998 1110 9997 1101