1. 변수(variable)란?
변하는 수?
하나의 값을 저장할 수 있는 메모리 공간! 메모리 공간은 ram을 의미
각각의 메모리에 메모리 주소가 있다. 원래 숫자인데 사람이 외우기 어렵기 때문에 이름을 붙여준다.
2. 변수의 선언
1) 변수의 선언 이유
- 값(data)을 저장할 공간을 마련하기 위해서
2)변수의 선언 방법
변수를 선언하는 것도 하나의 자바 문장이기 때문에 뒤에 세미콜론 ; 을 붙여준다
변수타입 변수이름;
ex) 변수이름이 age라면?
변수이름 앞에 변수 타입을 적어줘야 한다
정수를 저장할 거라면 앞에 int를 붙여줘야 한다
정수(integer)
int age ; >> 변수의 선언 완성 // 정수(int)타입의 변수 age를 선언
3. 변수에 값 저장하기
1) 변수에 값 저장하기 ( '='는 등호가 아니라 대입)
int age ; // 정수(int)타입의 변수 age를 선언
age ???
변수를 선언하면 이렇게 age라는 저장공간이 만들어 진다.
이 변수에 25라는 값을 저장하려면
age=25; // 변수 age에 25를 저장 (오른쪽의 값을 왼쪽에 저장해라 이런 뜻)
변수 age에 25를 저장하고 나면
age ??? --> age 25
int age;
age = 25;
이 두 문장은 간단하게 int age = 25; 한 문장으로 나타낼 수 있다
2) 변수의 초기화 - 변수에 처음으로 값을 저장하는 것
int x = 0; //변수 x를 선언 후, 0으로 초기화
int y = 5; //변수 y를 선언 후, 5로 초기화
변수 타입이 같다면 int x = 0, y= 5; // 위의 두 줄을 한 줄로 바꿀 수 있다.
사용하기 전에 새로운 값을 저장함으로서 기존에 저장한 알 수 없는 값을 정리하는 게 바로 초기화
클래스 변수
인스턴트 변수
지역 변수 (다른 변수들과 달리 지역 변수는 자동 초기화가 되지 않기 때문에 수동으로 초기화 해야 한다 )
지역변수는 읽기 전에 꼭! 초기화해야 함
4. 변수의 값 읽어오기
1) 변수의 값이 필요한 곳에 변수의 이름을 적는다
int year = 0, age = 14;
year 0
age 14
year = age + 2000;
--> year = 14 + 2000;
--> year = 2014; (변수 year에 2014 저장)
age = age + 1; //변수의 값을 1증가시키는 방법
--> age = 14 + 1;
--> age = 15;
변수의 저장된 값을 출력하려면
System.out.println(age);
--> System.out.println(15);
(변수의 값을 증가시키면 변수의 값도 변한다)
변수를 저장하면 편리한 이유! 하나하나 다 고쳐주지 않고 변수에 저장된 값만 변경하면 쉽게 결과를 얻을 수 있기 때문이다
<2-4>
1. 변수의 타입
변수: 하나의 값을 저장하기 위한 메모리 공간
int age = 25;
age = 3.14; (이 경우는 3.14 실수이기 때문에 정수타입과 일치 하지 않아서 에러가 뜬다) 밥은 밥그릇에 담고 물은 물그릇에!
1) 변수의 타입은 저장할 값의 타입에 의해 결정된다
2) 저장할 값의 타입과 일치하는 타입으로 변수를 선언
chat(문자형) ch = '가' ; // char는 문자 타입
double(실수형) pi = 3.14; // double은 실수 타입
2. 값의 타입
값 data
- 문자 char
- 숫자
정수 - byte, short, int, long (저장하려는 값의 크기와 용도에 따라 선택함) 주로 int가 많이 쓰인다
실수 - float, double
-논리 boolean- true, false
값의 종류에 따라 8개의 기본형
----------------------------------------------------------------------------
<ch2-5> 상수와 리터럴
5. 변수, 상수, 리터럴
변수(variable) - 하나의 값을 저장하기 위한 공간 변경 o
상수(constant) - 한 번만 값을 저장 가능한 변수 변경 x
리터럴(literal) - 그 자체로 값을 의미하는 것 --> 기존의 상수와 같음.자바에서 상수를 한 번만 값을 저장 가능한 변수로 정했기 떄문에! 구분하기 위해 리터럴으로 표현. 어렵게 생각하지 않아도 된다
(변수)
int score = 100;
score = 200; (200을 저장하면 원래 스코어에 저장되었던 100이 지워지고 200이 저장됨)
(상수)
final int MAX = 100; // MAX는 상수
상수를 선언하는 방법은 변수를 선언하는 방법이랑 같고, 앞에 final을 붙여줘야 한다
MAX = 200; // 에러
char ch = 'A';
String str = "abc"';
(주황색은 리터럴, 노란색은 변수, 초록색은 상수)
score가 상수가 되었기 때문에 처음에 지정한 score의 값인 100을 바꿀 수 없다. 그래서 에러가 뜬 것
라인단위로 주석처리하는 단축기는 ctrl + /
옛날엔 상수를 선언과 동시에 반드시 초기화 해줘야 했는데 이제는 선언과 초기화를 따로 할 수 있도록 바뀌었다
<2-6>
6. 리터럴의 접두사와 접미사
종류 | 리터럴 | 접미사 |
논리형 | false, true | 없음 |
정수형 | 123, 0b0101, 077, 0xFF, 100L | L |
실수형 | 3.14, 3.0e8, 1.4f, 0x1.0p-1 | f, d |
문자형 | 'A', '1', '\n' | 없음 |
문자열 | "ABC", "123", "A", "true" | 없음 |
-L이 붙으면 long type
- f float, d double (실수형 리터럴 접미사는 2개 뿐이라 어느 한 쪽에만 붙여도 구분이 가능. 그래서 d는 생략을 허용. f를 많이 쓴다)
- 접미사는 대소문자 구별이 없기 때문에 소문자를 써도 되지만 L의 소문자는 숫자와 헷갈리기 때문에 대문자로 써주는 것이 좋다
--------------
boolean power = true; (논리형에는 true나 false만 저장할 수 있다. 다른 거 넣으면 에러 뜸)
char ch = 'A'; (캐릭터 타입에는 하나의 문자만 저장 가능)
String str = "ABC"; (여러 문자를 저장하려면 스트링 타입의 변수에 저장해야 한다)
---------------------------------
**개형문자
\n 2개의 문자처럼 보이지만 사실은 하나의 줄바꿈 문자 이다.
이 외에도 탭이나 백스페이스 같은 특수문자들은 앞에 \역슬래쉬를 붙여서 표현한다
하나의 문자도 큰 따옴표로 묶을 수 있다 -->"A" . 이 경우 하나의 문자이지만 문자열이다.
--------------------------------------------------------
byte b = 127; int 타입 (정수인데 접미사가 없으니 int타입이다)
바이트와 숏타입의 리터럴은 없다
-128 ~ 127 --> byte 타입에 입력할 수 있는 값의 범위
byte b = 128; // 에러. 값의 범위를 벗어났기 때문
--------------------------------------------------
int i = 100; //10진수
int oct = 0100; //8진수
int hex = 0x100; //16진수
접두사가 없으면 10진수
0이 붙으면 8진수
0에 x가 붙으면 16진수
정수형 리터럴 앞에 0b가 붙으면 2진수
접미사처럼 접두사도 대소문자 구별안함
---------------------------------------
long l = 10_000_000_000L; --> 100억. int값의 최대치가 대략 20억 정도기 때문에 그걸 넘으면 롱타입의 변수에 저장해야 한다. (밑줄은 알아보기 쉬우라고 )
long l = 100; //OK --> 롱 타입에 값을 저장할 때 이렇게 int타입의 값을 적어도 된다. 접미사를 붙이건 안 붙이건 상관 없다. 하지만 100억은 최대값을 넘기 때문에 반드시 접미사 L을 붙여야 한다. 안 붙이면 에러남 !!)
---------------------------------
float f = 3.14f; (f는 절대 생략 불가)
double d = 3.14d;
--------------------------
변수의 값을 저장할때는 기본적으로 변수의 타입과 리터럴이 일치해야 한다. but 일치하지 않지만 허용 되는 경우도 있다 (나중에 설명)
-------------------------------------------
잠시 퀴즈
1)
10. --> 10.0에서 뒤의 0이 생략
.10 --> 0.10에서 앞의 0이 생략
둘 다 접미사가 없으니 double타입의 리터럴
2)
10f --> 10.0f (실수형 접미사 f가 붙었기 때문에)
3) 1e3 --> 1000.0 (뒤에 접미사가 없으니 double 타입이다)
기호 e는 10의 n제곱을 의미
기호 e는 실수형에 사용되는 것
--------------------------------
7. 변수와 리터럴의 타입 불일치
1) 범위가 '변수>리터럴' 인 경우 가능
물건보다 물건의 담을 그릇이 크니까 괜찮다는 의미
int i = "A"; // int > char --> 문자 A가 변수 i에 저장되는 것이 아니라, 문자 A의 문자꼴인 65가 저장되는 것 (문자 'A'의 문자코드(숫자)가 65입니다. 외우실 필요는 없고요. 문자가 정수로 바뀔 때 문자코드로 바뀝니다) https://www.ibm.com/docs/ko/sdse/6.4.0?topic=administering-ascii-characters-from-33-126 참고
--------
long l = 123; // long > int --> int 타입의 123을 범위가 더 넓은 long type에 저장하면 아무런 문제가 없다
--------
double d = 3.14f; // double > float --> float타입의 값을 범위가 더 넓은 double에 저장하는 것이기 때문에 문제가 없다
** (float과 double의 차이는 표현할 수 있는 실수가 얼마나 정밀한가 입니다.
float보다 double은 더 많은 소숫점을 표현하여 계산할 수 있으며,
아무래도 더 정밀한 double을 사용하여 계산하는 것이 소수점 오차가 적겠죠.) --> 구글링해봄
-----
2) 범위가 '변수 < 리터럴'인 경우 에러
int i = 30_0000_0000 ; // int 범위 벗어남
-----
long l = 3.14f; // long < float --> long 타입은 8byte, float 타입은 4byte라 가능할 것 같지만, 실수형은 정수형보다 훨씬 범위가 넓기 때문에 에러가 뜬다
---------------
float f = 3.14; // float < double --> 접미사가 없으니 double타입!
3) byte, short 변수에 int리터럴 저장가능
단, 변수의 타입의 범위 이내이어야 함
byte b = 100; // 가능. byte의 범위 (-128~127)에 속함
byte b = 128; // 에러. byte의 범위를 벗어남
<실습>
(BIN (Binary) : 2진수 · OCT (Octal) : 8진수 · DEC (Decimal) : 10진수 · HEX (Hexadecimal) : 16진수.)
만약 10진수가 아닌 8진수나 16진수로 출력하려면 println 메서드가 아닌 printf 라는 메서드를 사용해야 한다
'자바의정석 > Chapter 2' 카테고리의 다른 글
ch2- 14 화면으로부터 입력받기 (0) | 2022.11.17 |
---|---|
ch2 12, 13 printf를 이용한 출력 (0) | 2022.11.15 |
ch2-9~ (0) | 2022.11.14 |
ch2~ (0) | 2022.11.10 |