CH 2. 변수
1. 변수와 상수
1.1. 변수란?
-단 하나의 값을 저장할 수 있는 메모리 공간
1.2. 변수의 선언과 초기화
-int age;
-int: 변수 타입
-age: 변수 이름
-변수의 초기화: 메모리는 여러 프로그램이 공유하는 자원이므로 알 수 없는 쓰레기 값이 남아있을 수 있기 때문
-두 변수의 값 교환하기
1.3. 변수의 명명규칙
-프로그래밍에서 사용하는 모든 이름: 식별자
1. 대소문자가 구분되며 길이에 제한이 없다.
2. 예약어를 사용해서는 안 된다.
3. 숫자로 시작해서는 안 된다.
4. 특수문자는 ‘_’와 ‘$’만을 허용한다.
-추가로 자바에서 권장하는 규칙
1. 클래스 이름의 첫 글자는 항상 대문자로 한다.
2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 ‘_’로 구분한다.
-변수의 이름은 약간 길더라도 의미있는 이름으로 하자.
-변수는 한글로 선언되어도 괜찮다.
2. 변수의 타입
-기본형과 참조형
● 기본형 변수: 실제 값
● 참조형 변수: 주소(4byte, 기본값 null)
● 참조형 변수 간의 연산을 할 수 없다
● 변수의 타입으로 클래스의 이름을 사용한다.
● I.e. Date today = new Date();
2.1. 기본형
-논리형: boolean
-문자형: char
-정수형: byte, short, int, long
-실수형: float, double
2.2. 상수와 리터럴
-상수: 한번 값을 저장하면 다른 값으로 변경할 수 없는 저장 공간
-i.e. final int MAX_SPEED = 10;
-반드시 선언과 동시에 초기화 해야 한다.
-리터럴: 그 자체로 값을 의미하는 것
-상수가 필요한 이유: 리터럴에 의미있는 이름을 붙여서 코드의 이해와 수정을 쉽게 함.
-키워드: int, long, final, float 등 모두 포함하는 개념
-리터럴의 접미사
● 논리형: 없음
● 정수형: L
● 실수형: f, d
● 문자형, 문자열: 없음
-정수형의 경우 접미사 없으면 int타입의 리터럴 사용
-실수형의 경우 접미사 없으면 double타입의 리터럴 사용
-long에 대한 점미사 L은 웬만하면 대문자로 쓰자.
-리터럴에 소수점, E, f, F, D, d 있으면 실수형 리터럴로 간주됨
-타입의 불일치: 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.
-문자 리터럴과 문자열 리터럴
-String은 클래스이므로 연산자 new를 사용해야 하는 것이 원칙이지만 String str = “”같은 형식도 된다.
-문자열 리터럴은 덧셈 연산이 가능하다.
-어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 된다.
-i.e 7 + “” == “7”
2.3. 형식화된 출력 – printf()
-같은 값이라도 다른 형식으로 출력하고 싶을 때 사용
-지시자를 통해 여러 가지 형식으로 변환하여 출력.
-println()과 달리 줄바꿈하지 않는다 –> %n 필요하다.
● %b: 불리언 값
● %d: 10진수
● %o: 8진수
● %x, X: 16진수
● %f: 10진수 실수
● %e, E: 지수 형태 표현
● %c: 문자
● %s: 문자열
-%#x: 접두사
-%-5d: 왼쪽 정렬, – 없으면 오른쪽 정렬
-Integer.toBinaryString(binNum): 정수를 2진 문자열로 변환
-‘%g’: 값을 간단하게 표현
-‘%f’: 소수점 이하 6자리까지만 출력, 7자리에서 반올림한다.
but %전체자리.소수점이하자리f로 사용할 경우 자리수 지정 가능
-%.8s: 문자열의 일부만 출력할 수 있다.
2.4. 화면에서 입력받기 – Scanner
import java.util.*;
class ScannerEx{
public static void main (String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println(“두 자리 정수를 하나 입력해주세요: ”)
String input = scanner.nextLine();
int num = Integer.parseInt(input);
System.out.println(“입력 내용: ”+input);
System.out.printf(“num = %d%n”, num);
}
}
3. 진법
3.1. 10진법과 2진법
-2진법을 알지 못하면 컴퓨터의 동작원리나 데이터 처리방식을 온전히 이해할 수 없다.
3.2. 비트와 바이트
-비트: 컴퓨터가 값을 저장할 수 있는 최소 단위
-바이트: 데이터의 기본 단위
-워드: CPU가 한 번에 처리할 수 있는 데이터의 크기
-n 비트로 2^n개의 값 표현 가능하다.
3.3 8진법과 16진법
-2진법은 자리수가 상당히 길어진다.
-2진수를 3자리씩, 4자리씩 끊어서 바꾸면 된다.
3.4. 정수의 진법 변환
-중학교 때 배운 방법으로 하자.
3.5. 실수의 진법변환
-10진 소수점수를 2진 소수점수로 변환하는 방법
1. 10진 소수에 2를 곱한다.
2. 위의 결과에서 소수부만 가져다가 다시 2를 곱한다.
3. 1과 2의 과정을 소수부가 0이 될 때까지 반복한다.
4. 위의 결과에서 정수부만을 위에서 아래로 순서대로 적고 ‘0.’을 붙인다.
3.6. 음수의 2진 표현 – 2의 보수법
-n의 보수: 더했을 때 n이 되는 수
-두 2진수를 더하면 자리 올림이 발생하고 0이 된다.
-2의 보수 = 1의 보수 + 1
4. 기본형
4.1. 논리형 – boolean
-논리구현에 주로 사용
-1byte
4.2. 문자형 – char
-단 하나의 문자만을 저장할 수 있다.
-문자의 유니코드가 저장된다.
-특수문자 \u: 유니코드
-음수를 나타낼 필요가 없으므로 다른 정수형과 표현 가능 값의 범위가 다르다 .
-문자를 코드로 변환하는 것: 문자 인코딩 문자 디코딩
-유니코드: 전 세계의 모든 문자를 하나의 통일된 문자집합으로 표현하고자 한 방법
● UTF-16: 모든 문자를 2byte 고정 크기로 표현. Java에서 사용. 문서의 크기가 커진다.
● UTF-8: 모든 문자를 1~4 byte의 가변 크기로 표현. 웹문서에서 많이 사용.
4.3. 정수형 – byte, short, int, long
-왼쪽 첫 번째 비트를 부호 비트로 사용하고 나머지는 값을 표현하는 데 사용
-n비트로 표현할 수 있는 정수의 범위:-2^n-1 ~ 2^n-1 -1
-웬만하면 int를 사용하자.
● byte, short는 연산 시에 범위를 넘어서 잘못된 결과 얻기 쉽다.
● 피연산자 스택이 4byte 단위로 저장하기 때문에 int 사용이 효율적이다.
-타입이 표현할 수 있는 값의 범위를 넘어설 때 오버플로우 발생 –> 계수기랑 비슷
-부호있는 정수와 없는 정수 사이에 오버플로우 발생 시점이 다르다.
4.4 실수형 – float, double
-얼마나 큰 값을 표현할 수 있는지 뿐 아니라 얼마나 0에 가깝게 표현할 수 있는가도 중요하다.
-부호(S), 지수(E), 가수(M)의 세 부분으로 이루어져 있다.
-부동 소수점의 형태로 저장.
● 부호: 0이면 양수, 1이면 음수
● 지수: float의 경우 실제 사용 가능한 범위는 –126~127까지.
● 가수: 실제 값을 저장하는 부분
-부동 소수점의 오차: 무한소수, 10진수는 유한소수인데 2진수는 무한소수인 경우, 유한소수더라도 범위 내에서 저장되지 못할 경우
5. 형변환
5.1. 형변환(캐스팅)이란?
-서로 다른 타입간의 연산 수행할 때 사용
5.2. 형변환 방법
-(타입)피연산자
-기본형에서 boolean 제외한 나머지 타입들은 서로 형변환 가능
-기본형과 참조형간의 형변환은 불가능
-float타입을 int로 변환할 때 버림 발생
5.3. 정수형간의 형변환
-값 손실 발생 가능성
5.4. 실수형간의 형변환
-double을 float으로 바꿀 때 가수 부분의 24번째 자리에서 반올림 발생할 수 있다.
5.5. 정수형과 실수형 간의 형변환
-정수형을 실수형으로 변환: 실수형의 정밀도의 제한으로 인한 오차 발생 가능성
-실수형을 정수형으로 변환: 실수형의 소수점이하 값은 버려진다.
5.6. 자동 형변환
-편의상의 이유로 형변환 생략 가능
-컴파일러가 생략된 형변환 자동 추가
-서로 다른 타입간의 덧셈에서 두 타입 중 표현범위가 더 넓은 타입으로 형변환하여 타입을 일치시킨 다음에 연산을 수행한다.
–> 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환
byte –> short, char –> int –> long –> float –> double
-같은 크기일지라도 실수형이 정수형보다 표현범위가 크기 때문에 float이 long보다 오른쪽에 위치한다.
-int보다 작은 타입(byte, char, short)은 int형으로 변환된 후에 덧셈연산이 진행됨