읽은 책 정리/자바의정석 3판

[Java] Chapter 02 변수

포포015 2020. 12. 6. 18:08

1. 변수와 상수

 1.1 변수란?

  - 값을 저장할수 있는 메모리상의 공간을 의미

   * 변수의 초기화 

  - 반드시 사용전 변수를 '초기화'해야함.

    메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 값이 남아 있을수 있음

 

1.3 변수의 명명규칙

 - 프로그래밍에서 사용하는 모든 이름을 '식별자'라고하며 , 서로 구분이 될수 있어야함. 

 그리고 식벽자를 만들때는 규칙이 몇개 있음.

1. 대소문자 구분됨,길이 제한X 

2. 예약어(키워드)를 사용 X (int,long,new와 같은)

3. 숫자로 시작 X

4. 특수문자는 '_'와 '$'만 허용

 - 필수적인것은 아니지만 프로그래머들만의 암묵적인 약속

1. 클래스 이름의 첫글자는 항상 대문자로

2. 여러단어로 이루어진이름은 단어의 첫글자를 대문자로 (StringBuffer,lastIndexOf)

3.상수의 이름은 모두 대문자로

 

2.변수의 타입

 우리가 주로 사용하는 값의 종류는 크게 '문자와 숫자'로 나눌수 있음. 

 숫자는 다시 '정수와 실수'로 나눌수 있음 

정수 - 123, 0 , -123 등

실수 - 3.14 , -3.0 등

 *기본형과 참조형

자료형은 크게 '기본형'과 '참조형' 두가지로 나눌수 있음.

 - 기본형변수는 실제값을 저장.( 논리형 boolean,문자형 char, 정수형 byte,short,int,long, 실수형 float,double )

 - 참조형변수는 어떤값이 저장되어있는 주소(memory adderss)를 값을 저장

    (참조형 변수를 선언할때는 변수의 타입으로 클래스의 이름을 사용함)

   클래스이름 변수이름;  // 변수의 타입이 기본형이 아닌것은 모두 참조변수임  

 

2.1 기본형

기본형에는 모두8개의 타입이 있으며 논리형,문자형,정수형,실수형으로 구분됨

* 기본 자료형의 종류와 크기(1byte = 8bit)  

 

종류/크기 1byte 2byte 4byte 8byte
논리형 boolean      
문자형   char    
정수형 byte short int long
실수형     float double

 

int 타입의 변수는 대략 10자리수(약20억)의 값을 저장할수 있음 , long타입 약 19개 자리수 값 저장 가능.

float의 정밀도는 7자리, 10진수로 7자리의 수를 오차없이 저장가능, double는 15자리 저장가능

 

연산중에 저장범위를 넘어서게되면 원하지 않는 값을 결과로 얻게됨.


2.2 상수와 리터럴(constant & literal)

 - 상수란? (모두 대문자로 하는것이 암묵적 관례)

  값을 저장할수 있는공간이지만 변수와 달리 한번값을 저장하면 다른값으로 변경불가 

 선언하는 방법은 변수앞 타입에 키워드 'final'을 붙여줌 // 반드시 선언과 동시에 초기화해야 함

- 리터럴이란 ? 

 그 자체로 값을 의미 하는것 - int year = 100; (리터럴)

  * 리터럴의 타입과 접미사

 정수형의 경우 long타입의 리터럴에 접미사 'l' 또는'L'을 붙이고 , 접미사가 없으면 int타입의 리터럴임

 실수형에서는 float타입의 리터럴에 접미사 'f'또는 'F'를 붙이고 ,double타입의 리터럴에는 'd'또는 'D'를 붙인다

 float pi = 3.14;   // X            float pi = 3.14f;   // O

 

리터럴의 타입과 접미사

변수에 타입이 있는것처럼, 리터럴에도 타입이 있다(리터럴에 접미사를 붙여서 타입을 구분)

long 타입의 경우 리터럴에 접미사 l , L 을 붙이고 없으면 int타입의 리터럴이다.

실수형에서는(접미사가없으면 기본 double타입)  float타입의 리터럴에 접미사 f, F를 붙이고 double은 d, D를 붙인다

 

타입의 불일치

리터럴의 값이 변수의 타입의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장범위가 넓으면 컴파일 에러

 

2.3 형식화된 출력 - printf()

'지시자'를 통해 변수의 값을 여러가지 형식으로 변환하여 출력하는기능을 가지고 있다

지시자 설명
%b  booelan의 형식으로 출력
%d 10진 정수의 형식으로 출력
%o 8진 정수의 형식으로 출력
%x,%X 16진 정수의 형식으로 출력
%f 부동소수점의 형식으로 출력
%e,%E 지수 표현식의 형식으로출력
%c  문자로 출력
%s 문자열로 출력

 

4 기본형 

 

4.1 논리형 - boolean

논리형은 'booelan' 한가지만 존재 (true, false중 하나의 값만 저장가능. default값은 false이다.)

1 bit 로만 충분하지만 , 자바에서는 데이터를 다루는 최소단위가 byte 이기 때문에 1byte이다.

ex)  boolean power = true; 

      boolean checked = False; //에러(대소문자 구분)

 

 

4.2 문자형 - char

문자형 역시 'char' 한가지 자료형만 존재 (char타입의 변수는 단 하나의 문자만 저장가능)

ex)   char = ch = 'A';

변수에 '문자'가 저장되는거같지만 사실은 문자가 아닌 '문자의 유니코드(정수)'가 저장된다.

이처럼 문자를 코드로 변환하는것을 '문자 인코딩',그 반대로 코드를 문자로 변환하는것 '문자 디코딩'이라함(유니코드표)

유니코드 인코딩에는 여러가지 종류가 있는데 ,

UTF-16은 모든문자의 크기가 동일해서 다루기는 편하지만 , 문서의 크기가 커진다는 단점이 있어서 

현재 웹문서들은 UTF-8인코딩으로 작성을 많이함

 

특수문자 다루기

영문자 이외 tab 이나 backspace 등 특수문자를 저장하려면 특별한 방법을 사용

특수문자 문자리터럴
tab \t
backspace \b
form feed \f
new line \n
carriage return \r
역슬래쉬(\) \\
작은따옴표 \'
큰따옴표 \"
유니코드(16진수)문자 \u유니코드 ( 예: char a='\u0041')

4.3 정수형 - byte, short, int, long

변수에 저장하려는 정수값의 범위에 따라 4개의 정수형중 하나를 선택하겠지만 byte나 short 보다 int를 사용하자

정수형 변수를 선언할때는 int타입으로하고 int의 범위를 넘어가는 수를 다뤄야할땐 long 타입 사용

 

5 형변환 (캐스팅,casting) 이란?

서로 다른 타입간의 연산을 수행해야하는경우가 있는데, 이럴때는 연산을 수행하기전 타입을 일치시켜야함.

이것을 형변환 이라함

형변환 연산자는 그저 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 결과를 반환만함.

피연산자의 변수의값은 영향X

5.2 형변환 방법

기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.

기본형과 참조형간의 형변환은 불가

 

변환 수식 결과
int -> char (char) 65 'A'
char -> int (int) 'A' 65
float -> int (int) 1.6f 1
int -> float (float) 10 10.0f

 

5.6 자동 형변환

 형변환을 하는 이유는 주로 서로 다른 두타입을 일치시키기 위해 한다

 그럼 컴파일러는 기존의값을 최대한 보존할수 있는 타입으로 판단해 자동형변환해 타입일치시킴

  서로 다른 타입의 변수간의 연산은 형변환을 하는것이 원칙이지만,

   값의 범위가 작은 타입에서 큰타입으로 형변환은 생략 가능 .