[개념정리] Java의 정석 Chapter 2 변수

SW/Java

2020. 7. 24. 17:28

1. 변수(variable)

1.1. 변수란?

      수학에서 변수는 변하는 수이지만,

      프로그래밍에서는 단 하나의 값을 저장할 수 있는 메모리 공간이라는 의미이다.

 

1.2 변수의 선언과 초기화

# 변수 선언

- 변수타입 : 변수에 저장될 것의 type을 지정하는 것 ex) int

- 변수이름 : 변수에 붙인 이름

                같은 이름의 변수가 여러 개 존재해선 안된다.

# 변수 초기화 : 변수를 사용하기 전에 처음으로 값을 저장하는 것

 

1.3 변수의 명명규칙

- 식별자(identifier) : 프로그래밍에서 사용하는 모든 이름

# 식별자 만들 때의 규칙

① 대소문자가 구분되며 길이에 제한이 없다.

    true와 True는 서로 다른 것으로 간주된다.(대소문자 구분됨)
② 예약어(키워드)를 사용해서는 안된다.

    ex) true는 예약어라서 사용할 수 없지만, True는 가능

         (하지만 헷갈릴 수 있으므로 지양할 것)

 

// Tip : 예약어 = 키워드 = 리져브드 워드 : 프로그래밍 언어 내 구문에 사용되는 단어

 

- Java에서 사용하는 키워드 리스트

Java에서 사용하는 키워드
abstract const final int public throw
assert continue finally interface return throws
boolean default float long short transient
break do for native static true
byte double if new strictfp try
case else goto null super void
canativtch enum implements package switch volatile
char extends import private synchronized while
class false instanceof protected this  

③ 숫자로 시작해서는 안된다.

   ex) top10은 허용하지만, 7up은 허용되지 않는다.
④ 특수문자는 _와 $만을 허용한다.

    ex) $harp은 허용되지만, S#arp은 허용되지 않는다.

 

- 프로그래머 권장 규칙 (의무는 아니나 암묵적 약속) 카멜케이스(Camel Case)

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

    변수와 메소드 이름의 첫 글자는 항상 소문자로 한다.

② 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다. 

    ex) lastIndexOf, StringBuffer
③ 상수의 이름은 모두 대문자로 한다.

    여러 단어로 이루어진 경우 _로 구분한다.

    ex) PI, MAX_NUMBER

 

2. 변수의 타입

# 기본형과 참조형

기본형 : 계산을 위한 실제 값을 저장(data)

               boolean, char, byte, short, int, long, float, double 총 8개만 해당된다.

참조형 : 객체의 주소를 값으로 갖는다.(memory adress)

               8개의 기본형을 제외한 나머지 타입으로 클래스의 이름이나 String이 해당된다.

 

- new : 객체를 생성하는 연산자

 

2.1 기본형(primitive type)

# 기본자료형 정리표

분류 이름 설명 저장가능범위 크기
논리형 boolean true와 false 중 하나를 값으로 가지며,
조건식과 논리적 계산에 사용된다.
true, false 1byte
문자형 char 문자를 저장하는 데 사용되며,
변수에 하나의 문자만 저장할 수 있다.
0 ~ 65535 2byte
정수형 byte 정수를 저장하는데 사용
주로 이진 데이터 다룰 때 사용
-128 ~ 127 1byte
short C언어와의 호환을 위해 추가 -32,768 ~ 32,767 2byte
int 주로 사용 (cpu가 가장 효율적으로 처리할 수 있는 타입) -2,147,483,648
~ 2,147,483,647
4byte
long int보다 긴 범위 시 사용 -9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
8byte
실수형 float 실수를 저장하는데 사용
소수점 앞 + 소수점 이하 6자리까지 오차없이 저장
1.4E-45 ~ 3.4E38
(음의 범위는 -만 붙이기)
4byte
double 주로 사용
소수점 앞 + 소수점 이하 14자리까지 오차없이 저장
4.9E-324 ~ 1.8E308
(음의 범위는 -만 붙이기)
8byte

- 기본 자료형 암기 이해 내용

이름 암기를 위한 설명
boolean true와 false 두 가지 값만 표현할 수 있으면 되므로 가장 작은 크기인 1byte다
char 자바에서 유니코드를 사용하므로 2byte (유니코드는 2byte)
byte 크기가 1byte여서 byte
short int보다 짧아서 2byte
int int가 기준
long int보다 길어서 8byte
float 실수 값을 부동소수점(floating-point) 방식으로 저장하기 때문에 float
double float의 두 배 크기를 갖기 때문에 double (float 4byte , double 8byte)

 

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

- 변수 : 하나의 값을 저장하기 위한 공간

- 상수 : 값을 한번만 저장할 수 있는 공간

          변수와 다르게 단 한번만 저장 가능하며

          변수 앞에 final 키워드를 붙여주면 된다.

          상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이며,

          여러 단어로 이루어져 있는 경우 _로 구분한다.

[ 참고 ] JDK 1.부터는 상수를 선언과 동시에 초기화하지 않아도 되게 변경됐으나,

          선언과 동시에 초기화하는 습관을 들이는 것이 좋다.

 

- 리터럴 : 그 자체로 값을 의미하는 것

             ex) int year = 2020; (2020이 리터럴!)

 

# 리터럴 타입과 접미사

데이터 타입 리터럴 접미사
정수형 123, 0b0101, 077, 0xFF, 100L L
실수형 3.14, 3.0e8, 1.4f f, d

 - 정수형 : long 타입의 리터럴에 접미사 l나 L을 붙여준다.

              숫자 1과 혼동될 수 있어 소문자보단 대문자 L을 사용한다.

              JDK 1.7 부터 중간에 구분자로 _를 넣을 수 있게 되어 큰 숫자를 편하게 읽을 수 있게 되었다.

 

// Tip : 8진수 - 0, 16진수 - 0x나 0X로 리터럴을 표현하여 변수에 저장한다.

- 실수형 : float 타입 리터럴은 f를 

             double 타입 리터럴은 d를 붙여준다.

             (double의 경우 기본 자료형이기 때문에 접미사 생략이 가능하다.)

 

# 타입의 불일치 : 리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 

                       타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.

                       byte와 short 타입의 리터럴은 따로 존재하지 않기 때문에 int타입의 리터럴을 사용한다.

                       단, shor타입의 변수가 저장할 수 있는 범위에 속해야 한다.

 

# 문자 리터럴과 문자열 리터럴

- 문자 리터럴 : 작은따옴표로 문자 하나를 감싼 것 ex) 'A'

- 문자열 리터럴 : 두 문자 이상을 큰 따옴표로 감싼 것 ex) "Java"

- String : new를 사용하지 않고 예외적으로 " "만으로도 객체 생성함

 

- 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 된다.

  문자열 + any type → 문자열 + 문자열  문자열

  any type + 문자열  문자열 +문자열  문자열

 

2.3 형식화된 출력 - printf()

- printf() : 지시자(specifier)를 통해 변수의 값을 여러 가지 형식으로 변환하여 출력하는 기능

             println()과 달리 줄바꿈을 하지 않기 때문에 줄바꿈을 원하는 경우 %n을 사용해야 한다.

             ex) System.out.printf("age:%d year:%d);

 

# 자주 사용되는 printf() 지시자 목록

지시자명 설명
%b 불리언(boolean) 형식으로 출력
%d 10진(decimal) 정수의 형식으로 출력
%o 8진(octal) 정수의 형식으로 출력
%x, %X 16진(hexa-decimal) 정수의 형식으로 출력
%f 부동소수점(floating-point)의 형식으로 출력
%e, %E 지수(exponent) 표현식의 형식으로 출력
%c 문자(character)로 출력
%s 문자열(string)로 출력

 // Tip : 지시자 전체 목록은 Java API 내 java.util 패키지 - Formatter클래스 찾기

 

- 10진수를 2진수로 출력해주는 지시자가 없기 때문에,

  정수를 2진 문자열로 변환해주는 

  Integer.toBinaryString(int i)를 사용해야 한다.

  ex) System.out.printf("binNum=%d",  Integer.toBinaryString(int binNum));

 

- 실수형 값 출력시 시용되는 지시자 %f, %e, %g가 있는데,

  %f가 주로 쓰이고,

  %e는 지수형태로 출력할 때,

  %g는 값을 간략하게 표현할 때 사용한다.

 

2.4 화면에서 입력받기 - Scanner

- import.java.util.Scanner;  // Scanner 클래스 사용 위해 추가

- Scanner sc = new Scanner(System.in); // Scanner 클래스의 객체 생성 (sc는 변수명으로 변경 가능)

★ int num = Integer.parseInt(input); // 입력받은 내용을 input 타입의 값으로 변환

                                                   (실무에서 많이 사용하므로 암기하기!)

 

3. 진법

3.1 10진법과 2진법

- 10진법 : 사람의 일상생활에 사용하는 진법

- 2진법 : 컴퓨터가 사용하는 진법

 

3.2 비트(bit)와 바이트(byte)

- 비트(bit) : 컴퓨터가 값을 저장할 수 있는 최소단위

- 바이트(byte) : 1비트가 8개 묶인 것, 데이터의 기본단위

 

3.3 8진법과 16진법

     2진법이 길어지는 단점을 보완하기 위해 만들어짐

 

# 2진수를 8진수, 16진수로 변환

- 2진수를 8진수로 변환 시 : 뒤에서 3자리씩 끊어서 그에 해당하는 8진수로 변환

- 2진수를 16진수로 변환 시 : 뒤에서 4자리씩 끊어서 그에 해당하는 16진수로 변환

 

3.4 정수의 진법 변환

- 10진수를 n진수로 변환

  n(2, 8, 16) 중 필요로 하는 n진수로 나누어 몫과 나머지를 아래에서 위 방향으로 적으면 된다.

- n진수를 10진수로 변환

  각 자리의 수에 해당 당위의 값을 곱해서 모두 더하면 된다.

 

3.5 실수의 진법변환

- 10진 소수점수를 2진 소수점수로 변환

  소수부가 0이 될 때까지 2를 곱해주면 된다.

- 2진 소수점수를 10진 소수점수로 변환하는 방법

  2 대신 10을 곱한다.

  정수부가 있는 경우 정수부 + 소수부로 나누어 따로 변환한 후 더한다. 

 

3.6 음수의 2진 표현 - 2의 보수법

- 2의 보수법

  더해서 2가 되는 두 수의 관계

  2진수로 '10'은 자리올림이 발생하고 0이 되는 수를 뜻하며,

  2의 보수 관계에 있는 두 2진수를 더하면 (자리올림이 발생하고) 0이 된다.  

 

- 2의 보수 구하기

  2의 보수 = 1의 보수 + 1

// Tip : 1의 보수 구하는 법 : 2진수의 1은 0으로, 0은 1로 바꾸면 된다.

 

4. 기본형(primitive type)

 

4.1 논리형 - boolean

     true와 false 중 하나를 저장할 수 있으며, 기본값(default)은 false이다.

 

4.2 문자형 - char

     단 하나의 문자만을 저장할 수 있다.

     변수에 문자가 저장될 때 해당 문자의 유니코드인 숫자가 저장된다.

 

- 특수 문자 표현 방법

  ex) char tab = '\t'; // 변수 tab에 탭 문자를 저장

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

 

# char타입의 표현방식

ex) char ch = 'A'; // char ch = 65; 결과 : A

     short s = 65; // 결과 : 65

println()은 변수의 타입이 정수형이면 변수에 저장된 값을 10진수로 해석하여 출력하고,

  문자형이면 저장된 숫자에 해당하는 유니코드를 출력하므로 결과가 다르다. 

 

# 인코딩과 디코딩(encoding & decoding)

- 문자 인코딩(encoding) : 문자를 코드로 변환하는 것 ex) A → 65

- 문자 디코딩(decoding) : 코드를 문자로 변환하는 것 ex) 65 → A

 

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

byte(1) < short(2) < int(4) < long(8)

byte부터 long까지 1byte부터 시작해서 2배씩 크기가 증가한다.

 

# 정수형의 표현형식과 범위

- 정수형의 표현방식

s n-1 bit

- n비트로 표현할 수 있는 정수의 개수 : 2^n개(= 2^n-1개+ 2^n-1개)

- n비트로 표현할 수 있는 부호있는 정수의 범위 : -2^n-1 ~ (2^n-1) -1

타입의 크기만 알면 모든 정수형의 표현범위를 쉽게 계산해낼 수 있다.

 

- 정수형의 선택기준

  정수형 변수를 선언할 때는 int타입으로 하고, int의 범위(약±20억)을 넘어서는 수를 다뤄야 할 때는 long을 사용한다.

// Tip : long타입 범위도 벗어나는 경우 실수형 타입이나 BigInteger클래스를 사용하면 된다.

 

# 정수형의 오버플로우

- 오버플로우란? 

  연산과정에서 해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것

  에러가 발생하진 않으나 예상했던 결과를 얻을 수 없다.

 

- 정수형 타입이 표현할 수 있는 최대값, 최소값

  최대값+1 → 최소값

  최소값 -1 → 최대값

 

# 부호있는 정수의 오버플로우

   부호없는 정수는 2진수로 '0000'이 될 때 오버플로우가 발생하고,

   부호있는 정수는 부호비트가 0에서 1이 될 때 오버플로우가 발생한다.

 

4.4 실수형 - float, double

# 실수형의 범위와 정밀도

Q. 실수형도 정수형처럼 저장할 수 있는 범위를 넘게 되면 오버플로우가 발생하나요?

A. 실수형도 오버플로우가 발생하나, 변수 값이 무한대(infinity)가 된다.

   또한 정수형에 없는 언더플로우(underflow)가 있는데, 

   언더플로우는 실수형으로 표현할 수 없는 아주 작은 값 즉, 양의 최소값보다 작은 값이 되는 경우 변수 값은 0이 된다.

   

  실수형은 오차가 발생할 수 있다는 단점도 있기 때문에

  표현할 수 있는 값의 범위 뿐만 아니라 정밀도도 중요한 요소이다.

 

∴ 연산속도의 향상이나 메모리를 절약하려면 float

   더 큰 값의 범위라던가 더 높은 정밀도 필요 시 double을 선택해야 한다.

 

# 실수형의 저장형식

기호 의미 설명
S 부호(Sign bit) 0이면 양수, 1이면 음수
E 지수(Exponent) 부호있는 정수.
지수의 범위는 -127 ~ 128(float), -1023 ~ 1024(double)
M 가수(Mantissa) 실제값을 저장하는 부분.
10진수로 7자리(float), 15자리(double)의 정밀도로 저장 가능

① S - 부호(Sign bit) : 저장된 수의 양/음수 구분 목적

                             1bit로 정수형처럼 2의 보수법을 사용하지 않기 때문에 

                             양의 실수를 음의 실수로 바꾸고 싶으면 부호비트만 변경하면 된다.

② E - 지수(Exponent) : float의 경우, 8 bit의 저장공간을 갖는다.

③ M - 가수(Mantissa) : 실제 값을 저장하는 부분

                               float은 2진수 23자리 저장 가능, 7자리 10진수가 정밀도

                               double은 float의 2배 저장 가능, 2배 정밀도를 가짐

 

5. 형변환

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

     변수 또는 상수의 타입을 다른 타입으로 변환하는 것

- 형변환 될 수 있는 순서

byte → short → int → long → float → double

           char   

 

5.2 형변환 방법

(타입)피연산자

 

5.3 정수형간의 형변환

     작은 타입에서 큰 타입으로의 변환은 저장공간의 부족으로 잘려나가는 일이 없으므로 값 손실이 발생하지 않는다.

728x90