일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- React Native
- 백준 4358번
- 정리
- 백준 4358 자바
- 모두를위한딥러닝
- 모두의네트워크
- 문자열
- 머신러닝
- 네트워크
- 지네릭스
- 딥러닝
- 깃허브 토큰 인증
- 모두를 위한 딥러닝
- HTTP
- 스터디
- 깃 연동
- 자바
- 백준 5525번
- 팀플회고
- 백준 4949번
- SQL
- 데베
- 깃허브 로그인
- 모두의 네트워크
- 리액트 네이티브 프로젝트 생성
- 리액트 네이티브
- 리액트 네이티브 시작하기
- 백준
- 데이터베이스
- 깃 터미널 연동
- Today
- Total
솜이의 데브로그
Chapter 02 ) 변수 본문
참고 책 : Java의 정석
1. 변수란?
변수란, 단 하나의 값을 저장할 수 있는 메모리상의 공간을 의미한다.
변수를 선언할 때는 '변수타입' 과 '변수 이름' 을 선언해야한다. ex) int age;
- 변수의 초기화
변수를 사용하기 전에는 반드시 초기화를 해야한다.
이 때 지역변수는 사용 전에 반드시 초기화를 해야하지만, 클래스변수와 인스턴스 변수는 초기화를 생략 할 수 있다.
(개인적으로 내가 여러가지 언어를 배우면서 개념이 섞여 헷갈렸던 부분인데, 초기화를 안해줘도 되는 부분이 기억나지 않아서 나는 그냥 항상 초기화하고 사용했다.)
자바에 있어서 대입연산자 '=' 의 뜻은 다음과 같다.
오른쪽의 값을 왼쪽 (변수)에 저장하라.
따라서 일반적으로는 우변의 모든 계산이 끝난 후 대입연산을 마지막으로 수행한다.
예시)
class VarEx1{
public static void main(String[] args){
int year = 0;
int age = 14;
year = age + 2000;
age = age + 1;
}
}
다음 코드에서 year = age + 2000; 이 처리되는 단계는 다음과 같다.
(1) year = age + 2000;
(2) year = 14 + 2000;
(3) year = 2014;
-변수의 명명 규칙 (식별자)
1. 대소문자가 구분되며 길이에 제한이 없다.
2. 예약어를 사용해서는 안 된다.
3. 숫자로 시작해서는 안 된다.
4. 특수문자는 '_'와 '$'만을 허용한다.
그 외 권장사항 (암묵적인 약속)
1. 클래스 이름의 첫 글자는 대문자로 한다.
2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다. ex)StringBuffer
3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_' 로 구분한다. ex) MAX_NUMBER
2. 변수의 타입
자료형은 크게 '기본형'과 '참조형'으로 나눌 수 있다.
(1) 기본형 (primitive type) : 실제 값을 저장. 실제 연산에 사용하는 것은 모두 기본형 변수이다.
- 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
- 문자형 char는 문자를 내부적으로 정수로 저장하므로 다른 기본형과 연산이 가능하다.
1 byte | 2 byte | 4 byte | 8 byte | |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int (기본 자료형) | long |
실수형 | float | double (기본 자료형) |
(C와 헷갈리지 말자!!)
정수형의 저장 값의 범위는 다음과 같다.
n = bit 수 일 때,
$$ -2^{n-1} \thicksim 2^{n-1} -1 $$
정수형의 범위를 잘 기억하고, 실수형 float와 변환 할 때 주의하자. 실수형 float는 큰 값을 저장하지만, 정밀도가 7자리이므로 오차가 크다. 따라서 높은 정밀도가 필요할 때는 double 타입을 선택해야한다.
(2) 참조형 (reference type) : 값이 저장되어있는 주소를 값으로 갖는다. C와 달리 자바에서는 참조형 변수간 연산을 할 수 없다. - 8개의 기본형을 제외한 나머지 타입. 참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용한다.
참조변수의 선언 및 초기화는 다음과 같이 수행한다.
Date today = new Date();
참조변수 today 에는 새로 생성된 Date 객체의 주소가 저장된다.
상수(constant) : 한번 값을 저장하면 다른 값으로 변경할 수 없으며, 선언 할 때 변수 타입 앞에 'final'을 붙인다.
final int MAX_SPEED = 10;
리터럴 : 그 자체로 값을 의미하는 것. 일반적으로 상수라고 부르는 값을 의미한다.
=> 리터럴 타입과 변수 타입이 일치하지 않을 때, 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.
그러나 리터럴 값이 변수 타입의 범위를 넘어서거나 저장범위가 넓으면 컴파일 에러가 발생한다.
ex)
double d = 3.14f; //OK
float f = 3.14; //Error
문자리터럴 : 문자 하나를 작은따옴표로 감싼다. 반드시 ' ' 안에 하나의 문자가 있어야함.
문자열 리터럴 (String) : 큰 따옴표 안에 두 문자 이상. 빈 문자열 허용. String은 클래스이다.
-화면에서 입력받기 : Scanner
Scanner 클래스를 사용하려면 import java.util.*; 를 추가한다.
그 후 Scanner 클래스의 객체를 생성한다.
Scanner keyboard = new Scanner(System.in);
int num = keyboard.nextLine();
int num = Integer.parseInt(input); // 입력받은 내용을 int 타입 값으로 변환
클래스의 nextLine()이라는 메서드를 호출해 입력받은 내용을 저장한다.
3. 진법
2의 보수체계
어떤 수의 'n의 보수' 는 더했을 때 n이 되는 수를 말한다. 즉, 2의 보수관계에 있는 두 수를 더하면 0이 된다.
4비트의 2진수로 부호있는 정수를 표현하고자 할 때는 왼쪽의 첫 번째 비트 (MSB)가 0이면 양수, 1이면 음수로 표현한다.
ex) 0101 (binary) == 5 (dec) / 1011 (binary) == -5 (dec)
음수의 2진 표현을 구하는 법
(1) 음수의 절대값을 2진수로 변환한다.(2) (1)에서 구한 2진수의 1을 0으로, 0은 1로 변환한다. (1의 보수 구하기)
4. 기본형
(1) 논리형 - boolean
(2) 문자형 - char
char ch = 'A';
short s = 65;
다음과 같이 저장할 때, 둘 다 2진수로 같은 값이 저장된다.
System.out.println(ch); //A 출력
System.out.println(s); //65 출력
그러나 다음과 같이 출력하면 변수 타입에 따라 출력하므로 값이 다르게 출력된다.이는 유니코드의 인코딩과 디코딩 때문이다.
(3) 정수형 - byte, short, int, long
정수형은 왼쪽의 첫번째 비트를 부호비트로 사용하고, 나머지 비트로 값을 표현한다. 정수형을 사용할 때는 byte, short 보다는 int가 기본형이므로 int를 사용하는 것을 권장하며, int의 범위를 넘어가는 경우에는 long을 사용하도록 한다.
(byte, short는 성능보다 저장공간 절약이 중요할 때 사용)
타입이 표현할 수 있는 값의 범위를 넘어서는 것을 오버플로우 라고 한다.
정수형의 타입이 표현할 수 있는 최대값에 1을 더하면 최소값이 되고, 최소값에서 1을 빼면 최대값이 된다.
따라서 오버플로우가 발생하지 않도록 충분한 크기의 타입을 선택해서 사용해야한다.
(4) 실수형 - float, double
실수형은 표현범위도 중요하지만, 정밀도 역시 중요한 요소이다. 즉, '얼마나 0에 가깝게 표현할 수 있는가' 를 확인해야한다.
정수형과 달리, 오버플로우가 발생하면 변수의 값은 무한대가 된다. 또한 '언더플로우' 개념이 있는데, 실수형으로 표현할 수 없는 아주 작은 값, 즉 양의 최소값보다 작은 값이 되는 경우로, 변수의 값은 0이 된다.
float 타입은 정밀도가 7자리로, 7자리의 10진수를 오차 없이 저장 할 수 있다는 뜻이다.
float f = 9.12345678901234567890f;
float f2 = 1.2345678901234567890f;
double d = 9.1234567890d;
따라서 위와 같이 저장했을 때, float 형태로 저장된 값들은 정밀도가 7자리이므로 원래 값에서 7자리만 오차 없이 저장된다.
또 위의 f 를 %f 형태로 출력했을 때, '%f' 는 기본적으로 소수점 이하 6자리까지만 출력하므로, 7번째 자리에서 반올림하여 출력한다.
따라서 더 큰 값의 범위나 높은 정밀도를 필요로 한다면 double을 선택해야 한다.
5. 형변환 (캐스팅)
: 변수나 리터럴의 타입을 다른 타입으로 변환하는 것.형변환 하는 방법은 다음과 같다.
(타입) 피연산자
기본형에서 boolean 타입을 제외한 나머지 타입들은 서로 형변환이 가능하며, 큰 타입에서 작은 타입으로 변환하는 경우 크기의 차이만큼 잘려나가 '값 손실(loss of data)'이 발생할 수 있다.
ex) 실수형 간의 형변환 시, float 타입의 범위를 넘는 값을 float로 형변환 하는 경우, ' ±무한대' 또는 '±0'을 결과로 얻는다.
- 정수형→실수형 변환 시 주의 할 점 : int 는 최대 10자리의 정밀도를 요구하므로, 7자리의 정밀도만 제공하는 float로 변환 시 정밀도 차이에 의한 오차가 발생 할 수 있다.
- 실수형→정수형 변환 시 주의 할 점 : 실수형의 소수점 이하 값은 버려지고, 반올림이 발생하지 않는다. 실수의 소수점을 버리고 남은 정수가 정수형의 저장범위를 넘는 경우, 정수의 오버플로우가 발생한 결과를 얻는다.
자동형변환
작은 크기 → 큰 크기 : 형변환 생략 가능
실수형은 정수형보다 더 큰 표현 범위를 갖기 때문에 float와 double이 같은 크기인 int 와 long보다 오른쪽에 위치한다.
byte b = 1000; //에러
그러나 위와 같이 값 손실이 발생하는 경우에 형변환을 생략하면 에러가 발생한다.
산술 변환
int i = 3;
double d = 1.0 + i; //double d = 1.0 + (double)i;
위와 같이 서로 다른 두 타입간의 연산에서는 두 타입 중 표현범위가 더 넓은 타입으로 형변환하여 타입을 일치시킨 후 연산을 수행한다.
'책을 읽자 > Java의 정석' 카테고리의 다른 글
Chapter 06 ) 객체지향프로그래밍(1) (0) | 2021.09.04 |
---|---|
Chapter 05 ) 배열 array (0) | 2021.09.03 |
Chapter 04 ) 조건문과 반복문 (0) | 2021.09.03 |
Chapter 03 ) 연산자 operator (0) | 2021.09.03 |
Chapter 01 ) 자바를 시작하기 전에 (0) | 2021.09.02 |