Java 2일차
변수와 타입
변수
변수란
- 하나의 값을 저장할 수 있는 메모리 공간
- 다양한 타입의 값을 저장할 수 없고 한 가지 타입의 값만 저장
선언
- 어떤 타입의 데이터를 저장할 지, 변수 이름이 무엇인지 결정
- 같은 타입의 변수는 콤마(,)를 이용해 한번에 선언할 수 있음
- 규칙
    - 첫번째 글자는 문자이거나 $, _ 이어야 하고 숫자로 시작할 수 없음
- 영어 대소문자 구분
- Camel Case
- 문자 수 제한 없음
- 자바 예약어 사용 불가
 
사용
- 변수에 값을 저장하고 읽는 행위
- 저장
    - 대입 연산자(=) 사용
- 
        우측의 값을 좌측 변수에 저장한다는 의미 int score; // 변수 선언 score = 90; // 값 저장 int score = 90;
 
- 리터럴 : 상수와 같은 의미지만 프로그램에서 상수는 다른 뜻이 있어 구분하기 위해 사용
- 정수 리터럴
    - 소수점 없는 정수 리터럴은 10진수로 간주 ⇒ 0, 75, -100
- 0으로 시작되는 리터럴은 8진수로 간주 ⇒ 02, -04
- 0x, 0X로 시작하고 0~9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 구성된 리터럴은 16진수로 간주 ⇒ 0x5, 0xA, 0xB3, 0xAC08
 
- 실수 리터럴
    - 소수점 있는 리터럴은 10진수 실수로 간주 ⇒ 0.25, -3.14
- E 또는 e가 있는 리터럴은 10진수 지수와 가수로 간주 ⇒ 5E7 = 5 10^7, 0.12E-5 = 0.1210^-5
 
- 문자 리터럴(char)
    - 
        작은 따옴표로 묶은 텍스트 ⇒ ‘A’, ‘한’, ‘\t’, ‘\n’ 이스케이프 문자 용도 유니코드 ‘\t’ 수평 탭 0x0009 ‘\n’ 줄 바꿈 0x000a ‘\r’ 리턴 0x000d ‘\”’ 큰따옴포 0x0022 ‘\” 작은따옴표 0x0027 ‘\’ \ 0x005c ‘\u16진수’ 16진수 유니코드 0x0000 ~ 0xffff 
 
- 
        
- 문자열 리터럴(string)
    - 큰따옴표로 묶은 텍스트 ⇒ 문자열 리터럴
- 문자열 리터럴 내에서 이스케이프 문자 사용 가능
 
- 논리 리터럴(boolean)
    - true, false
 
변수값 읽기
- 변수는 초기화 되어야 읽을 수 있음
변수 사용 범위
- 중괄호 내에서 선언되고 사용 ⇒ 클래스, 생성자, 메소드
- 로컬 변수 : 블록 내에서 선언된 변수
- 변수는 선언된 블록 내에서만 사용 가능
데이터 타입
기본 타입
| 종류 | 타입 | 메모리 사용 크기 | 저장되는 값 범위 | 
|---|---|---|---|
| 정수 | byte | 1byte | -128 ~ 127 | 
| char | 2byte | 0~2^16-1 | |
| short | 2byte | -32,768 ~ 32,767 | |
| int | 4byte | -2147483648 ~ 2147483647 | |
| long | 8byte | 2^63 ~ 2^63-1 | |
| 실수 | float | 4byte | (+/-)1.4E-45 ~ (+/-)3.4028235E38 | 
| double | 8byte | (+/-)4.9E-324 ~ (+/-)1.7976931348623157E3087 | |
| 논리 | boolean | 1byte | true, false | 
- 정수 타입
    - byte
        - 색상 정보, 파일 또는 이미지 등의 이진 데이터 처리
- 정수 중 가장 작은 범위 (-128 ~ 127) ⇒ 0이 포함되어 128이 아닌 127
 
- short
        - C 언어와의 호환을 위해 사용. 자바에서는 잘 안씀
 
- int
        - 일반적으로 쓰임
 
- long
        - int 타입의 저장 범위를 넘으면 소문자 l이나 대문자 L을 붙임
 
- 실수 타입
        - 기본값 : double
- 가수 표현에 있어서 double가 약 두 배의 자리수 ⇒ 더 정밀한 계산
 
 
- byte
        
- 문자
    - 자바는 모든 문자를 유니코드로 처리
- 하나의 유니코드 : char 타입(2byte)
- 유니코드는 음수가 없기 때문에 char 타입에 음수 안됨
- 작은 따옴표 문자, 유니코드 정수값 저장
- 문자열(string)
        - 클래스 타입, 참조 변수
- 문자열이 변수에 직접 저장되는 것이 아닌 string 객체가 생성되고 string 변수는 string객체의 번지를 참조
 
 
타입 변환
자동 타입 변환
- 프로그램 실행 도중 자동적으로 타입 변환이 일어나는 것
    - 작은 크기를 가지는 타입이 큰 크기를 가진 타입에 저장될 때
- 에외 : 음수가 저장될 수 있는 byte 타입을 char 타입으로 자동 변환시킬 수 없다.
 
- 연산식
    - 서로 다른 타입일 경우 크기가 큰 타입으로 자동 변환
 
강제 타입 변환
- 큰 데이터 타입을 작은 데이터 타입으로 쪼개서 저장하는 것
    - 캐스팅 연산자() 사용
- 강제 반환해도 값이 보존되어야 함
 
- 입력값을 변환할 때 값의 손실이 발생하면 안됨
    - 타입.MAX_VALUE, 타입.MIN_VALUE로 검사
 
연산자
종류
| 종류 | 연산자 | 피연산자 수 | 산출값 | 기능 설명 | 
|---|---|---|---|---|
| 산술 | +, -, *, /, % | 이항 | 숫자 | 사칙연산, 나머지 계산 | 
| 부호 | +, - | 단항 | 숫자 | 음수, 양수 | 
| 문자열 | + | 이항 | 문자열 | 두 문자열 연결 | 
| 대입 | =, +=, -=, *=, /=, %=, &=, ^=, |=, «=, »=, »>= | 이항 | 다양 | 우변의 값을 좌변의 변수에 대입 | 
| 증감 | ++, — | 단항 | 숫자 | 1만큼 증가 / 감소 | 
| 비교 | ==, !=, >, <, >=, <=, instanceof | 이항 | boolean | 값 비교 | 
| 논리 | !, &, |, &&,|| | 단항, 이항 | boolean | 논리 연산 | 
| 조건 | (조건식) ? A : B | 삼항 | 다양 | 조건에 따라 A 또는 B | 
| 비트 | ~, &, |, ^ | 단항, 이항 | 숫자, boolean | 비트 연산 | 
| 쉬프트 | », «, »> | 이항 | 숫자 | 비트를 좌우측으로 밀어서 이동 | 
연산 방향, 우선순위
| 연산자 | 연산 방향 | 우선순위 | 
|---|---|---|
| 증감(++, —), 부호(+,-), 비트(~), 논리(!) | 좌 ← 우 | 높음 | 
| 산술(*, /, %) | 좌 → 우 | |
| 산술(+, -) | 좌 → 우 | |
| 쉬프트(«, », »>) | 좌 → 우 | |
| 비교(<, >, <=, >=, instanceof) | 좌 → 우 | |
| 비교(==, !=) | 좌 → 우 | |
| 논리(&) | 좌 → 우 | |
| 논리(^) | 좌 → 우 | |
| 논리( |) | 좌 → 우 | |
| 논리(&&) | 좌 → 우 | |
| 논리( ||) | 좌 → 우 | |
| 조건(? :) | 좌 → 우 | |
| 대입(=, +=, -=, *=, /=, %=, &=, ^=, |=, «=, »=, »>=) | 좌 ← 우 | 낮음 | 
- 괄호를 사용해 우선순위 표시하자 ⇒ 최우선 연산
단항 연산자
- 부호 연산자(+, -)
    - 양수 및 음수 표시
- boolean, char 타입 제외한 나머지 기본 타입에 사용
- 부호 연산자 산출 타입 ⇒ int
 
- 증감 연산자(++, —)
    - ++ / — 피연산자 : 다른 연산을 수행하기 전에 증감
- 피연산자 ++ / — : 다른 연산 수행 후 증감
 
- 논리 부정 연산자(!)
    - boolean 타입에만 사용
- true, false 반대로 출력
 
- 비트 반전 연산자
    - 정수 타입(byte, short, int, long) 피연산자에만 사용
- 2진수로 표현했을 때 1과 0을 반전
- 부호 비트를 포함해서 모든 비트가 반전되기 때문에 부호가 반대인 새로운 값 산출
- int 타입 산출
 
이항 연산자
- 산술 연산자(+, -, /, *, %)
    - 사칙연산, 나머지 구하기
- 가장 큰 숫자 타입으로 변환 후 연산
- char 타입도 정수 타입이므로 산술 연산 가능(int 타입으로 변환) ⇒ ‘A’ + 1 = 66
- 정확한 숫자 계산을 위해서는 int 형으로 바꿔 계산하고 다시 원래 형태로 변환
 
- NaN, Infinity
    - 어떤 수와 연산하더라도 NaN, Infinity 값 산출 ⇒ 데이터 엉망
- NaN은 falsy 값이기 때문에 Double.isNaN() 메소드로 검사
 
- 문자열 연결 연산자(+)
    - 문자열 서로 연결
 
- 비교 연산자(<, <=, >, >=, ==, !=)
    - boolean 타입 산출
- == : 모든 타입에 사용
- 대소 연산자 : boolean 타입 제외한 기본 타입에 사용
- 이진 포맷의 가수를 사용하는 모든 부동소수점 타입은 0.1 정확히 표현할 수 없음 ⇒ 0.1 == 0.1f → false
        - float 강제 변환 후 비교 연산 or 정수로 변환해서 비교
 
- String 객체의 문자열이 같은지 비교 ⇒ equals() 메소드 사용
 
- 
    논리 연산자( &&,||,&,|,^,!)- boolean 타입에만 사용
- 
&&/&: &&는 앞의 피연산자가 false면 뒤의 피연산자 평가하지 않고 바로 false 출력. &는 두 피연산자 모두 평가해서 산출
- 
||/|:||는 앞의 피연산자가 true면 뒤의 피연산자 평가하지 않고 바로 true.|는 두 피연산자 모두 평가해서 산출
 
- 비트 연산자(&,|,~,<<,>>,>>>)- 정수 타입 연산
- int 타입 산출
 
- 비트 이동 연산자(«, », »>)
    - 1 « 3 : 32비트 전체를 왼쪽으로 3비트 이동. 왼쪽 3비트 버려지고 맨 오른쪽에 새로 생기는 3비트는 0으로 채움 ⇒ 8
- -8 » 3 : 32비트 전체 오른쪽으로 3비트 이동. 오른쪽 3비트 빌려서 버려지고, 맨 왼쪽에 새로 생기는 3비트는 최상위 부호 비트와 동일한 값 ⇒ -1
- -8 »> 3 : 오른쪽 3비트 버려지고, 맨 왼쪽에 새로 생기는 3비트 무조건 0으로 채워짐 ⇒ 536870911
 
- 대입 연산자
    - 오른쪽 피연산자 값 좌측 피연산자인 변수에 저장
- 모든 연산자 중 가장 낮은 연산 순위
 
- 삼항 연산자
    - 조건식 ? 값 또는 연산식(true) : 값 또는 연산식(false)