Chapter2
생성일: 2021년 9월 5일 오전 11:47
변수
변수란 단 하나의 값을 저장할 수 있는 메모리 공간.
변수의 초기화
변수를 사용하기 전에는 항상 변수를 초기화 해주어야 한다. (클래스 변수와 인스턴스 변수는 초기화를 생략할 수 있다.)
변수의 명명규칙
필수 규칙
- 대소문자가 구분되며 길이의 제한이 없다. (True ≠ true) ac ≠ AC
- 예약어(ex. if)를 사용할 수 없다
- 숫자로 시작해서는 안된다
- 특수문자는
_
와$
만 허용한다.
권장 규칙
- 클래스 이름의 첫 글자는 항상 대문자로 한다
- 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
- 카멜 케이스 : lastIndexOf (첫글자만 소문자 이후 단어마다 대문자로 시작)
- 스네이크 케이스: last_index_of (단어마다
_
를 사용) - 파스칼 케이스: LastIndexOf (모든 단어의 시작이 대문자)
- 상수의 이름은 모두 대문자로 한다. 여러단어일 경우는
_
를 사용하여 구분한다. (MAX_NUMBER) - 패키지 이름은 소문자로 한다
변수의 타입
변수의 타입은 크게 2가지로 나뉜다.
- 기본형(primitive type)
- 논리형(boolean), 문자형(char), 정수형(byte,short,int,long), 실수형(float,double) 계산을 위한 실제 값을 저장
- 참조형(reference type)
- 객체의 주소를 저장한다. 기본형을 제외한 나머지 타입 (변수 타입이 클래스)
- 참조변수는 null 또는 객체의 주소를 값으로 가진다.
// 참조형의 선언
**클래스이름** 변수이름; -> 주소할당이전
// 참조형의 초기화
Date today = new Date(); // Date객체 생성후 주소를 today에 저장
상수(Constant) & 리터럴(literal)
상수란?
변수와 마찬가지로 '값을 저장할 수 있는 공간' 이지만 한번 값을 저장하면 다른 값으로 변경 불가능
상수를 사용하기 위해서는 final
을 붙여주면 된다
final int MAX_SPEED = 10;
MAX_SPEED = 11; -> (x)
상수를 사용할 때는 선언과 동시에 초기화를 항상 해줘야한다.
또한, 상수의 이름은 모두 대문자로 하는 것이 암묵적 관례이다.
리터럴(literal)이란?
그 자체로 값을 의미하는 것이다.
기본적으로 상수는 숫자 (1,221,123) 또는 문자 ('a','B')같이 그 자체로 값인 것을 의미 하는데 ****
프로그래밍에서의 상수는 따로 의미가 있기 때문에 리터럴이라는 단어를 사용하여 기본 상수의 의미를 구별하기로 하였다.
리터럴의 접미사
리터럴을 사용할 때는 항상 접미사를 붙여줘야한다.
// 정수형 접미사 사용 예제
long number = 10; // (x) -> 실행이 되긴함 권장 x
Long number = 10; // (x) -> 실행이 안됨
long number = 10L; // (o)
long number = 10_000L; // (o) JDK 1.7부터
//실수형 접미사 사용 예제
float pi = 3.14; // (x) 실수형의 기본 접미사는 double의 D이다
float pi = 3.14f; // (o)
float pu = 3.14F; // (o)
double rate = 1.618; // (o)
double rate = 1.168D; // (o)
double rate = 1.168d; // (o)
타입이 불일치 할때
기본적으로 리터럴의 타입은 변수의 타입과 일치하는 것이 보통이지만 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용이 된다.
// 모두 큰 범위
int i = 'A'; // 65가 저장
long l = 123;
double d = 3.14f
문자 리터럴 , 문자열 리터럴
- 문자 리터럴
- 작은 따옴표 (``)로 문자 하나를 감싼 것
- 무조건 작은 따옴표 안에 적어도 하나의 문자를 넣어야한다
- 문자열 리터럴
- 큰 따옴표 ("")로 두 문자 이상 감싼것
- 큰 따옴표 안에 문자가 없어도 된다
String str = ""; // 내용이 없는 빈 문자열
char ch = ''; // (x) 적어도 하나의 문자가 있어야한다
char ch = ' '; // 공백이 있기 때문에 (o)
String의 클래스 선언
String은 클래스 입으로 객체를 생성 할 때 new
를 사용 해야하지만 그냥 할당도 특별히 허용된다
String name = new String("java");
뿐만아닌 String name = "java"
도 허용한다.
문자열의 덧셈
문자열은 기본적으로 기본형과 참조형의 구별 없이 어떤 타입의 변수도 문자열과 덧셈 연산을 수행하면 문자열이 된다.
그렇기 때문에 문자열로 형변환을 시켜줄 때 ""
만 더해줘도 문자열이 된다.
문자열 + Any Type = 문자열
// 예시
String name = "java";
String str = name + 0.8; // "java0.8"
int temp = 10;
Printf()
자바에서의 출력은 C언어와 비슷하다.
System.out.printf();
를 사용하여 출력을 진행한다
Printf 예제
// 지시자 사용 예제
int age = 20;
System.out.printf("age:%d", age);
// 간격 맞추는법
System.out.printf("[%5d]",age); // [ 20]
System.out.printf("[%05d]",age); // [00020]
System.out.printf("[%-5d]",age); //[20 ]
화면에서 입력받기
C언어에서 scanf
를 사용하는것과 같이 자바에는 Scanner
라는 객체가 있다.
사용하기 위해서는 import java.util.*;
를 import해야한다
그 후 Scanner 객체를 생성하고 nextLine()
매소드를 호출하면 받을 수 있다.
// 사용 예제
import java.util.*;
// 또는
import java.util.Scanner;
Scanner scanner = new Scanner(System.in); // 객체생성
String input = scanner.nextLine(); // input에 입력받는 내용 저장 문자열로 저장
int num = Integer.parseInt(input); // 입력받은 내용을 num에 int 타입으로 변환
// 숫자만 입력했을때 변환가능
//입력받자마자 변환 없이 정수로 받는법
int num = scanner.nextInt();
//입력 받자마자 실수로 받는법
float num = scanner.nextFloat();
//공백으로 받는법
String num = scanner.next();
int num = scanner.next(); // (x)반환형이다름
nextInt()
나 nextFloat()
매서드를 사용해 입력을 받으면 연속적인 값을 얻기 힘들기 때문에
nextLine()
을 사용해서 받고 변환하여 사용하는 것을 책에서는 권장하고 있다.
진법 변환
- 2의보수법을 사용하여 진법 변환을 한다.
- 실수의 진법 변환
- 10진 소수에 2를 곱한다
- 위의 결과에서 소수부만 가져와서 다시 2를 소수부가 0이 될때까지 곱한다.
- 나온 결과에서 정수부만 위에서 아래로 순서대로 적고 0.을 붙인다.
0.625를 변환
0.625 *2 = 1.25
0.25 * 2 = 0.5
0.5 * 2 = 1.0
0.101이 된다.
바이트 와 비트 와 워드
- 8bit를 1Byte라 한다.
- 1bit는 한자리의 2진수를 나타낸다.
- 워드는 Cpu가 한번에 처리 할 수있는 데이터의 크기를 의미한다.
- 32비트 컴퓨터의 워드는 4바이트이다.
문자형에서 유니코드 사용법
// 3 문장 다 '가'를 나타낸다.
char hch = '가';
char hch = 0xAC00;
char hch = '\uAc00';
// 특수문자 다룰 때는 c언어와 같다
// 2 문장은 같다
char ch = 'A';
char ch = 65;
오버플로우
- 타입이 표현할 수 있는 값의 범위를 넘어서면 Overflow가 발생하면 제일 낮은값이 나온다.
- 예를들어 2진수 0000에서 1을 뺴면 1111이 된다. 2의보수법으로 고쳐 표현하면 제일 낮은 값이 나온다.
- 최대값 + 1 → 최소값 / 최소값 - 1 → 최대값
실수형에서의 오버플로우
- 실수형은 저장할 수 있는 범위를 넘어나면 오버플로우가 발생하는데 정수형과 달리 변수의 값이 무한대가 된다.
- 또한 언더플로우가 정수형과 달리 존재한다. → 자바에서 언더플로우 C언어랑
- 실수형으로 표현할 수 없는 아주 작은 값을 넣었을 때의 변수의 값은 0이 된다.
- float는 7자리 까지 double은 15자리 까지 표현이 가능하다.
실수형의 값 저장 방식
실수형은 값을 저장하기 위해서 부동소수점형태로 값을 저장한다.
부동소수점은 부호와 지수와 가수로 이루어져있다.
- 부호
- 1 bit를 차지하고 0이면 양수, 1이면 음수를 나타낸다
- 지수
- 부호가 있는 정수라고 생각하면 된다. 지수의 범위는 10의 n승 할때 제곱을 의미한다
- flaot는 -127
128까지 double은 -10231024까지 나타낸다.
- 가수
- 실제 값을 저장하는 부분으로 정밀도를 저장할 수 있다.
- float는 2진수 23자리를 저장할 수 있다 = 약 7자리 (10진수로 고쳤을때)
- double은 2진수 52자리를 저장할 수 있다. 약 15자리 (10진수로 고쳤을 때)
부동소숫점의 오차
- 부동소수점은 기본적으로 2진수 이기 때문에 오차가 발생 할 수있다.
- 파이 같은 무한소수를 정확하게 나타낼 수 없다.
- 또는 예를들면 float같은 경우 7자리 수까지 밖에 나타내지 못하는데 7자리를 넘어가는 유한소수 일 경우에 오차가 발생 할 수 있다.
형변환(casting) 이란?
- 형변환은 변수 또는 상수의 타입을 다른 타입으로 변환하는 것이다.
형변환을 하기 위해서는 변수나 리터럴 앞에 변환하고자 하는 타입을 괄호화 함께 붙여주면 명시적 형변환이 가능하다
double d = 85.4;
int score = (int)d; // 명시적 형변환
// 2진 정수로 변환한 문자열 얻는 법
Integer.toBinaryString(int i);
// 상수를 보다 작은 타입으로 변환 했을 때
double d = 1.0e100;
float f = (float)d; // INFINITY가 출력된다
double d = 1.e-50;
float f = (float)d; // 0.0이 출력된다.
// 실수형과 정수형의 변환
float f = 1.666;
int i = (int)f; // 1 **반올림이 되지 않는다**
자동형변환
서로 다른 타입간의 대입이나 연산을 할 때, 형변환으로 타입을 이치시키는 것이 원칙이지만 편의상 형변환을 생략할 수 있다. 이때 컴파일러가 이를 자동적으로 형변환 해주는 것을 자동형변환 이라고 한다.
자동 형변환은 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환 한다. 즉 표현 범위가 좁은 타입에서 넓은 타입으로 형변환이 된다.
int i = 3;
double d = 1.0 + i; // i 가 3.0으로 자동형변환 된다.
Reference
자바의 정석
'Java > Java' 카테고리의 다른 글
[Java/Study] 오버라이드 (0) | 2021.09.07 |
---|---|
[Java/Study] 상속 (0) | 2021.09.07 |
[Java/Study] 생성자 (0) | 2021.09.07 |
[Java/Study] 변수와 메서드 (0) | 2021.09.07 |
[Java/Study] 클래스와 객체 (0) | 2021.09.06 |