일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 연산자 끼워넣기
- 크롬설치
- chromeSetup.exe꺼짐
- 크롬 설치 안됨
- 로봇청소기
- ChromeStandaloneSetup64안됨
- 크롬설치파일꺼짐
- 삼성 sw 역량테스트
- 백준 14888번
- 바로꺼짐
- 백준 14503번
- chromeSetup.exe 안됨
- C++
- Today
- Total
공대생의 개발 일기장
ch02 변수 - 복습 및 정리 본문
2장에서 배웠던 변수에서 내가 생각했을 때 중요했던 부분을 정리하는 글이다. 일단 가장 중요한건 '수학'적 개념과 굉장히 유사하지만 그러면서 수학이 아니다. 이걸 꼭 명심하자.
그리고 여기는 내가 그냥 중요하다고 생각하는 거 혹은 새로 깨달은 것을 작성하는 블로그라서 간단한거나 충분히 숙지해서 관에 묻히기 전까지 누가 물어봐도 말할 수 있는 개념은 적지 않았다.
1. 변수(variable)
사실 변수라고 하면 누구나 바로 머리 속에 떠오르는 개념인 '변하는 수' 일텐데 여기서는 다른 개념이다. 변수는 하나의 값을 저장하는 메모리 즉, 기억공간을 말한다. C++을 하면서 혹은 자바 공부를 시작하면서 가장 많이 다뤄본 개념인데 이런식의 개념은 처음이였다. 중요하니 꼭 기억하자!
2. 변수의 타입
1) 기본형 : 논리형boolean, 문자형char, 정수형byte, short, int, long, 실수형float, double2) 참조형 : 기본형을 제외한 나머지 (String, System 등등)
기본형의 경우 C++에서 사용하는 개념과 똑같았다. 당연히 메모리 사용의 정도도 똑같았고 이에 따라 표현할 수 있는 수의 범위도 내가 알던 그대로였다.
참조형의 경우에는 내가 알던 개념과는 약간 달랐는데 쉽게 C++에서는 객체로 다루었던 것들이라고 생각하니 편했다. 처음 접하는 사람이라면 아마 햇갈리는 개념이 없어서 기본형을 제외한 나머지 전부라고 생각해 더더욱 쉬울 것이다.
2-1. 변수 메모리 할당
기본형은 순서대로 1, 2, 1, 2, 4, 8, 4, 8byte씩을 차지하고 참조형은 4byte를 차지한다. 단, 64bit의 JVM의 경우 참조형은 8byte이다.
1byte = 8bit인 것을 명심하자. 또, 변수는 2진법으로만 저장된다는 것을 꼭 명심하자. 2진법의 하나의 자리당 1bit이 할당된다.
그렇다면 4byte인 int의 2진법 자리는 모두 몇개일까? 32bit이므로 32자리가 주어져 2ⁿ(n=32)개수의 수만큼 int가 표현할 수 있는 수의 범위인 것이다. 이를 꼭 기억하고 다음을 보자.
문자형인 char만 0이상의 정수를 표현하고 정수형과 실수형의 경우 음수를 포함한 정수를 모두 표현 가능하다. char의 경우 2byte 즉, 16bit이므로 표현할 수 있는 수의 개수는 2^16개. 즉, 0~(2^16-1)의 범위의 수를 표현 가능하다.
정수형인 int의 경우 음수까지 표현할 수 있고 표현할 수 있는 수의 개수가 2^32개임을 알고 있으니 -(2^31)~(2^31-1)의 범위의 수를 표현 가능하다는 것을 유추할 수 있을 것이다. 같은 논리로 다른 정수형들의 범위를 알 수 있다. (boolean의 경우 true or false만 확인하기 때문에 제외)
문제는 실수형인데 실수형은 S, E, M의 세 파트로 메모리를 분할해 저장한다. S는 부호, E는 지수, M은 가수이다.
부호는 0이면 양수, 1이면 음수기 때문에 1bit만을 할당하고 float와 double에 대하여 E 할당 메모리는 각각 8bit, 11bit이고 M 할당 메모리는 23bit, 52bit이다. (이것은 그냥 외워라)
M인 가수의 할당 메모리에 의해 float의 정밀도가 10진수로 7자리, double의 15자리가 되는 것이다.
2-2. 부호가 있는 변수
이건... 굉장히 애매한데 정말 다행히 나는 학부 수업 중 '디지털 논리회로'에서 2진수의 계산방법 중 2진수의 음수 표현방법을 배웠고 여기서 '보수(complement)'라는 방법을 배워서 쉽게 이해했다. 일단 앞서 말했듯 음수를 표현할 수 있는 기본형들은 S 부호를 결정하는 메모리 파트가 1bit있다. 보통은 맨 앞 첫번째가 부호를 결정한다.
예를 들어보자. 1000 의 2진수가 있다. 원래라면 10진수로 8이겠지만 1을 부호라고 생각하고 읽는다면? 지금 -0인가 라고 생각했다면 틀렸다. '보수'에 대한 개념을 다시 공부해야한다. 정답은 -8이다.
보수에 대한 부분을 설명하자면 너무 길어서... 나는 충분히 학부시절에도 공부했고 다시 한번 공부해 이해를 완전히 끝맞췄기 때문에 여기다가는 기술하지 않겠다. 혹시 이해가 안되는 사람이라면 따로 공부하자.
오버 플로우와 실수형에서만 발생하는 언더플로우 같은 경우에도 보수를 공부할 때 같이 공부할 수 있으므로 여기서는 작성하진 않겠다. 간단하게 말하면 표현할 수 있는 자릿수를 넘어가면 실제로 존재하고 표기되야 하는 부분이 그냥 통째로 날라가 값이 표현될 수 있는 부분에서만 나오는 것을 말한다. 이해가 안된다면 공부하고 다시 본다면 아마 무슨 말인지 알거다.
3. String 문자열
문자와 문자열은 엄연히 다른것이다. 'A'는 문자, 'AB'는 문자열이다!! 당연히 char ch = 'AB'는 에러가 뜬다. char는 문자형이기 때문이다. 그래서 String으로 저장해줘야하는데 String은 참 신기하게 C++에는 없던 기능같은데... (확실하진 않음. 내가 잘 몰라서)
String str = " " + 8 을하면 str이 " 8"로 출력된다. 문자열이 아닌 것을 문자열로 바꾼 다음에 출력해주는 것!
4. 리터럴과 접미사
리터럴은 그냥 '값'을 생각하면 된다. 쉽게 말해서 등호에 우변에 있는 것. 이것도 마찬가지로 C++에는 없던 것 같은데 리터럴에는 접미사와 접두사가 붙는다.... 사실 근데 어려운건 없다.
long타입인 경우에만 l, L의 접미사를 (정수형에서) float인 경우에만 f, F의 접미사를 사용한다. 쉽다.
k(e)n의 접미사가 붙으면 k 곱하기 10ⁿ을 말한다. e대신 p면 2의 제곱형태이다.
생각보다 접미사가 엄청 중요한데 타입이 불일치하면 에러가 나타난다. 꼭 명심해야 한다!
5. 변수의 기본값
이 부분은 C++과 크게 다를게 없지만 중요해서 써보겠다.
boolean, char, byte, short, int, long, float, double, 참조형 순으로 false, '/u0000' (공백), 0, 0, 0, 0l, 0.0f, 0.0, null의 기본값을 가진다.
6. 형변환
가장 중요한 건 boolean을 제외한 변환이라는 점과 기본형끼리는 가능하지만 참조형과 기본형 사이의 형변환은 불가능하다는 것. 마지막으로 변환 과정에서 자료형의 표현 가능한 수의 변화에 따라 저장된 수가 왜곡될 수 있다는 것! 아주 중요하다 꼭 기억하자.
1) 변환하려는 값이 음수이고 byte->int와 같이 더 넓은 수범위를 가진 자료형으로 변환하면 빈칸을 모두 1로 채운다. (양수라면 0으로 채운다)
int->byte로 채우는 경우 앞에서부터 8자리만 남기는 것이 아니라 뒤에 8자리만 남긴다. (byte는 8bit) 그렇기 때문에 엄청난 값손실이 발생할 수 있다.
2) 실수형의 경우 '기저법'을 알아야한다.
float에서 double로 변환하면 E에서 127을 빼고 1023을 더해서 변환한다. M은 double이 더 공간이 넓으므로 23자리의 float 표현수를 그대로 채우고 나머지는 0으로 한다.
double에서 float로 변환하는 경우 기저법을 반대로 한다. 즉, 1023을 빼고 127을 더하여 변환한다. 가수 M의 경우 앞에 23자리 빼고 다 버린다. 이때 버려지는 수들에서 첫번째 자리 그러니까 가수에서 24번째 자리 수가 1이면 반올림이 일어난다!! 아주 중요하다.
정수형과 달리 한가지 더 중요한 점이 double에서 float로 변환할 때 값이 float를 넘는 값이라면 형변환 시 +-무한대 혹은 0의 결과를 얻게 된다.
3) 형변환 방법은 (타입)피연산자 이다. 잊지말자! 매우 간단하다!! 참고로 피연산자의 타입이 바뀌어서 어떤 변수에 새롭게 저장되는 것이지. 피연산자 자체가 바뀌는 것은 아니다. 무슨 말이냐
d라는 피연산자의 타입을 int에서 double로 바꿔서 c에 저장한 다음 d를 호출하면 d는 double이 아니라 여전히 int로 호출된다는 것이다.
7. printf
이거는 내가 처음 본 매서드인데 워낙 지시자가 많아서 따로 정리하려 한다.
-%b, %d, %o, %x, %f, %e, %c, %s는 뒤에 딸려오는 변수를 각자 의미하는 boolean, decimalm, float 등등으로 표현하라는 지시자이다.
-println과 달리 줄바꿈을 하지 않아 %n(new line)을 이용해 줄바꿈을 해주어야한다.
-%뒤에 숫자가 들어가 있는 경우가 있는데 %5d인 경우 뒤의 변수를 5칸을 차지하게 출력하라는 것이다. 즉 뒤의 변수가 10이면
10, 이거이고 %-5d면 10 이다. %05d라면 공백을 0으로 채워서 00010이 된다.
-%#x 혹은 %#o의 경우 접두사 0x, 0을 붙여서 16진수와 8진수임을 표현해준다. 안해주면 출력결과만 보았을 때 이것이 10진수인지 무엇인지 파단이 쉽지않다.
-10진수를 2진수로 출력해주는 지시는 없어 integer.toBinaryString(int i)를 통해 10진수를 2진 '문자열'로 바꿔서 %s의 지시자로 출력해주어야 한다. 더불어 C++에서는 char가 그냥 형변환 없이 출력이 가능했는데 자바에서는 (int)c처럼 앞서 배운 형변환을 이용해 변환 후 %d의 지시자로 출력이 가능하다.
-만약 %14.10f라는 지시자라면 무엇일까? 앞에 14는 앞서 말한 것처럼 총 14칸을 차지하라는 의미이다. 그럼 뒤에 .10은 무엇일까? 쉽게 이해하면 소수점 뒤에가 10칸을 차지하라는 것이다. 이 경우에는 앞에처럼 빈칸이 아니라 0으로 소수점 아래를 채운다.
**특수문자를 저장하는 방법.
중요한건 \ 역슬래시! 이것 뒤에 특수문자를 입력해 저장한다. 책에서는 57p에 정리되었으니 참고하고 어떻게 쓰느냐?
println의 괄호안의 ''혹은 ""안에서 \특수문자가 입력되면 이 특수문자가 시전된다.
예를 들어 System.out.println("\n")이면 \n이 출력되어야 할 것 같지만 new line이 출력 된다. 즉 한줄을 띄게 된다!
아니면 그냥 순수 문자로 저장도 된다.
char tab = '\t' // 변수 tab에 탭 문자를 저장 <- 이렇게 말이다.
오늘은 여기까지! 다음 포스팅은 변수 문제풀이를 올릴까 했는데 음... 코드를 작성하는게 아니라 개념을 물어보는 시험지 같아서 나의 풀이를 포스팅하기가 어려워졌다... 다음 포스팅이 언제 올라올지는 모른다.
'Java 공부' 카테고리의 다른 글
ch03 연산자 - 연습문제 풀이 (0) | 2023.02.08 |
---|---|
ch03 연산자 - 복습 및 정리 (0) | 2023.02.08 |
ch03 연산자 - github (0) | 2023.02.08 |
ch02 변수 - 연습 문제 풀이 (0) | 2023.02.02 |
ch02 변수 - github (0) | 2023.02.01 |