프로그래밍/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를 선언
  • 변수 타입 
    • 변수에 저장될 값의 타입(정수형, 실수형, 문자형 등등)
    • 기본형과 참조형      ※ 기본형이 아니면 무족건 참조형         
      1. 기본형 : 계산을 위한 실제 을 저장(boolean, char, byte, short, int, long, float, double)
        • 메모리구조: stack에 직접 값이 저장된다.
      2. 참조형 : 8개 기본형을 제외한 나머지 타입, 객체의 주소(메모리 값, 4byte or 8byte)를 저장(String, system) 
        • 메모리구조: stack에 주소값(참조값)이 저장이 되고 heap에 값이 저장된다.
  • 변수 이름 : 값을 저장할 메모리 공간의 이름(담아놓는 것)
  • 변수 초기화: 변수를 사용하기에 앞서 적절한 값을 저장해주는 것이 필요하다. 이것을 초기화라고 한다.(변수에 처음(최초)으로 값을 저장.
  • 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