DAY - 4
벌써 4일차 수업이 시작이다.
오늘은 chapter2를 마무리한다.
전에 배운 변수의 타입에 대해 보다 세부적인 내용을 한번 더 짚고 간다.
기본형
1. 논리형 (boolean)
기본값은 true라고 생각하기 쉽지만 사실 false가 기본값이다.
true와 false만 가능하고 대소문자를 구분하니 유의해야한다.
2. 문자형 (char)
char ch = 'A';
문자가 저장되는 것 같지만 사실은 문자가 아닌 문자의 유니코드(정수)가 저장된다.
so,
위의 내용은 char ch = 65; 와 같다.
특수문자의 경우 \(역슬래시)를 이용한다.
\t = tab
\n = 줄바꿈
이외에도 여러가지가 있지만 이역시 자주쓰는 것은 외워질것이다.
앞서 기본형들의 크기를 봤었듯이 char타입은 2byte = 16bit의 크기이므로 2^16개의 코드를 사용할 수 있다.
위의 예를 들면, 문자 'A'는 2진수 0000000001000001[2]로 저장되는 것이다.
즉 컴퓨터는 숫자밖에 모르기 때문에 문자를 숫자로 바꾸어 저장되는 것인데
여기서 인코딩과 디코딩의 개념이 나온다.
이에 대해 기준이 되는 것이 유니코드이다.
유니코드에는 하나의 숫자에 하나의 문자가 매칭되어있다.
여기서 문자를 유니코드를 통해 숫자로 바꾸는 것을 인코딩, 그 반대의 과정을 디코딩이라고 한다.
모든 코드들은 미국 표준 코드인 ASCII코드에서 파생되었다.
하지만 ASCII는 2^7개의 문자를 제공하는 7bit부호이기 때문에 다른 언어들이 포함되어있지 않다.
이런 점들을 보완하여 세계의 모든 문자를 하나의 통일된 문자집합으로 표현하고자 노력한 결과가 바로 유니코드이다.
이 유니코드에도 종류가 있는데
> UTF-16은 모든 문자를 2 byte의 고정크기로 표현하고
> UTF-8은 영문과 숫자는 1 byte, 한글은 3 byte로 표현한다.
=> 이때문에 UTF-16으로 인코딩할경우 코딩에 압도적으로 많이 사용되는 영어와 숫자의 크기가 커서 결론적으로 문서 자체의 크기가 커진다는 단점이있다. -> 이때문에 UTF-8인코딩으로 작성된 웹문서가 늘고있다.
네이버나 구글 등에서 Ctrl + u (소스보기) 를 눌러서 charset을 찾아보면 UTF-8을 사용중인 것을 확인해볼 수 있다.
3. 정수형 ( byte, short, int, long )
자바에는 JVM(Java Virtual Machine)이라는 것이 있다.
여기에 가장 핫한 기능이 바로 메모리 자동해제라는 기능이다.
원래 코딩을 할 때에는 생성자를 이용해 메모리를 할당해서 쓰고 다 쓴 후에는 소멸자를 이용해 할당받은 메모리를 반납해주어야 한다.
but JVM은 소멸자를 써야하는 과정 자체를 자동으로 해버려 생략하게해준다. -> 코딩이 간소화된다.
이 부분에 대한 상세한 내용은 뒤의 챕터에서 다루게 될 것이다.
앞서 배운 정수형의 네가지 타입 중에서도 int타입이 주로 사용된다.
이 이유에 대해 책에 기술된 내용은 이제는 맞지 않는다.
현재 설치되어있는 JVM이 64비트 기준이라 오히려 long타입을 쓰는것이 효율적이다.
>cmd > java -cersion에서 몇 비트 기준의 JVM을 쓰는지 확인가능하다.
정수형의 오버플로우
각 타입의 정해진 메모리를 넘어선 경우 발생한다.
연산과정에서 해당 타입이 표현할 수 있는 값의 범위를 넘어서는것을 말한다.
>>에러가 아니다.
각 타입의 최대값에서 1을 더하면 최소값이, 최소값에서 1을 빼면 최대값이 나오는 것을 위의 예제에서 확인할 수 있다.
저장범위를 넘어선 값은 버려지기 때문에 이런 결과가 나온다.
-> 카운팅 할때 사용하는 기계인 카운터를 예시로 생각해보면 편하다.(상한이 되면 초기화됨)
위의 예제를 작성할때 팁
비슷한 형식일 경우 복사해 세부적인 변수들만 바꿔주면 되는데 이때 바꿀 행만 블럭처리하고 Ctrl + F를 누르면 다음과같은 창이 뜬다.
여기서 찾을 단어, 바꿀 단어를 입력하고 Wrap search에 체크되어있는지 확인하고 Replace All을 누르면 블럭 안의 모든 해당 단어가 바뀌게된다.
일일이 입력하는 것에 비해 코딩 시간을 단축시키는데 훨씬 도움이 된다.
부호있는 정수의 오버플로우
부호가 있는 정수는 맨앞의 부호비트가 0에서 1이될 때 오버플로우가 발생한다.
4. 실수형 ( float, double )
float타입은 소수점 아래 7자리까지, double타입은 15자리까지의 정밀도를 나타낼 수 있다.
이 범위는 음의 범위에서도 동일한데 이때문에 0은 표시할 수 없다.
즉 실수형은 얼마나 큰 값을 표현할 수 있는가 뿐만 아니라 얼마나 0에 가깝게 표현할 수 있는가가 중요하다.
정수형과 달리 실수형에서는 오버플로우가 발생하면 변수의 값은 무한대가 된다.
또, 언더플로우라는 개념이 있는데 이 역시 실수형으로 표현할 수 없는 아주 작은값, 즉 양의 최소값보다 자긍ㄴ값이 되는 경우를 말한다.
실수형의 저장가능한 값의 범위를 보면 같은 크기의 정수형인 int와 long에 비해 훨씬 큰 값을 저장한다.
이 이유는 바로 값을 저장하는 방식이 다르기 때문인데 거의 사용되지 않으므로 어느 정도만 기억해주면 된다.
한가지 예만 들어보고 넘어가자.
-----------------------------------------
ex) 60.626f[10] 이 어떻게 저장되는지 보자.
실수형은 정규화 라는 과정을 거쳐 저장된다.
그러기위해서는 우선 2진화를 한다. > 111000.101[2]
이를 정규화하면 > 1.11000101 * 2^5 가 된다.
여기에 float의 중간값(기저)가 필요한데 이는 127이다.
실수형은 3파트로 나뉘어 저장되는데 맨앞은 부호를 뜻하고 중간은 지수, 마지막은 가수를 뜻한다.
이번 예시에서는 양수이니 맨앞은 1,
정규화한 예시의 지수는 5인데 기저법에 의해 127 + 5 = 132. 이 132를 2진수로 나타낸 수를 가운데 적는다,
마지막으로 가수인 11000101을 적되 빈자리엔 0을 채운다.
=> 0 10000100 11000101000000000000000 실제로 컴퓨터에는 60.626f이라는 실수형 리터럴이 이렇게 저장된다.
여기서 자리수는
4byte의 float는 1 , 8 , 23
8byte의 double은 1 , 11 , 52
-----------------------------------------
형변환
형변환이란 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 의미하며 방법은 아주 간단하다.
형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주기만 하면 된다.
작은 타입에서 큰 타입으로의 변환에는 값손실이 없기에 별도의 언급이 없어도 된다.
기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다. 그리고 기본형과 참조형간의 형변환은 불가능하다.
실수형의 값을 정수형의 값으로 변환할 때엔 소수점 이하의 값은 반올림이 아닌 버림으로 처리한다.
정수형간의 형변환
큰 타입에서 작은 타입으로의 변환에는 초과되는 값이 잘려나간다.(버림) => 값손실이 발생한다.
System.out.println(300);
System.out.println((byte)300);
이 코딩을 출력해보면 위의 경우엔 int형이라 300이 출력되지만 아래의 경우는 byte형이라 값이 손실되어 44가 출력된다.
정수형을 실수형으로 형변환
정수형은 소수값이 없어 실수형으로 변환하는것이 매우 간단하다.
정규화를 거치고 난 후 실수형으로 저장되게 된다.
실수형을 정수형으로 변환
실수형은 정수형으로 변환될 때 소수점 아래의 값은 버려진다.
자동형변환
자동형변환이란 서로 다른 두 타입을 일치시키기 위해 일어나는 형변환이 컴파일러에 의해 자동으로 일어나는 것을 말하는데
기존의 값을 최대한 보존할 수 있는 타입으로 일어난다.
위의 방향에서 중요한것이 long타입과 float타입의 관계인데, 분명 크기는 long타입이 크지만 위의 방향이 된 데에는 이유가 있다.
앞서 배운 타입별 값의 범위를 보면, 실수형타입(float, double)이 정수형타입(byte, short, int, long)보다 나타낼 수 있는 값의 범위가 크기 때문이다.
오늘은 여기까지 함으로써 chapter 2를 끝내고 어제수업의 마지막에 했던 setting을 이어했다.
cloudflare의 DNS로 들어가서
형식 이름 콘텐츠
A @(내 도메인이 뜬다) 서브컴퓨터의 ip
A np(none proxy) 서브컴퓨터의 ip -> 프록시 꺼야한다.
CNAME www 내 도메인
=> 이렇게 세팅을 하면 원격 데스크톱 연결에서 서브컴퓨터의 ip를 입력하지 않고 np.도메인 을 입력해 연결이 가능하다.
원격 데스크톱은 처음에 영어로 되어있고 시간도 영국에 맞춰져있다.
윈도우키와 R을 눌러 Run창을 띄우고 language settings에서 한국어팩을 다운받는다. -> 시간이 좀 걸린다.
또한 현재 원격 데스크톱을 연결할 때 아이디와 비밀번호가 복잡하니 새로 계정을 만든다.
control paner(제어판)을 열어 user account -> add a user account를 통해 계정을 추가해준다.
이렇게 생성된 계정은 관리자계정이 아니므로 클릭해 들어가준 뒤 change the account type -> administrator로 바꿔주면 관리자계정이 된다.
주의할 점으로.. 서브컴퓨터는 무조건 Restart(재부팅)을 해야한다. 절대 종료하면 안된다.. 복잡해진다..
오늘은 여기까지!!
아직까지도 하라는대로 따라가기는 하지만.. 완벽한 이해는 힘들다.
하나둘 더 배운 후 이 글을 다시 본다면 어떤 감정을 가지고 보게 될지 궁금하다.
같은 수업을 듣는 다른 사람들은 어떤생각일지도 궁금하다. 나처럼 다들 어려워할지, 잘 따라가고 있는지..
뒤쳐지지말고 바짝 따라가려면 매일 잊지말고 블로그작성하며 복습하자.