오늘도 끄적끄적

느리더라도 꾸준하게

가상 기계(Virtual Machine)

기계를 추상화한 것.
소프트웨어일 수도, 하드웨어일 수도 있다.
각각의 가상 기계는 대응되는 언어들이 존재한다.
아래의 표에서 레벨에 해당하는 것들이 가상 기계이다.

LevelLanguage
High-Level LanguageJava, C, etc.
Assembly Languagex86 ASM, 65c816 ASM, etc.
Instruction Set Architecture(ISA)Machine Code
Digital Logic???

어셈블리어(Low-Level Language)

더 읽어보기 »

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main() {
int num2 = 11;
int num = 11;
int num3 = num;
// 같은 값이던 변수를 참조하던 다른 메모리 공간을 차지함.
cout << &num2 << endl; // 0x7FFF5322DAD8
cout << &num << endl; // 0x7FFF5322DAD4
cout << &num3 << endl; // 0x7FFF5322DAD0
return 0;
}

형변환(캐스팅, Casting)

기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 형변환이 가능.
역시 자스를 먼저 배우고 나니 자스의 자유로운 형변환이 그리울 때가 있다.
또한 기본형과 참조형(reference type)간의 형변환은 불가능하다.
또한 실수형을 정수형으로 바꾸면 반올림 하지 않고 소수점 이하를 다 짜른다.
왜냐하면 정수형에서는 소수점 이하를 표현할 방법이 없기 때문이다.
형변환을 할 때 캐스팅 연산자를 써줘야하지만 생략하면 자동으로 컴파일러가 붙여준다.
하지만 손실이 발생할 수 있는 경우에는 오류가 발생한다.
따라서 손실이 발생하는 경우에는 무조건 캐스팅 연산자를 써줘야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class test {
public static void main(String[] args) {
char ch = 'A';
short num = 255;
int num2 = num;
num2 = ch;
long num3 = 12345678781234L;
// float은 4byte지만 부동 소수점 형태로 표현되기 때문에 8byte인 long보다 더 넓은 범위를 표현할 수 있다.
// 하지만 정밀도 때문에 오차가 발생할 수는 있다.
float num4 = num3;
double num5 = num3;
// ch와 num은 둘 다 2byte지만 ch는 unsigned short와 같이 부호가 없으므로 표현 범위가 다름.
// 따라서 서로 손실이 발생하므로 형변환 연산자가 꼭 존재해야함.
ch = (char)num;
num = (short)ch;
}
}

십진수를 2진수로 보기

더 읽어보기 »

char의 연산자별 형변환.

전위&후위 연산자는 형변환을 하지 않고
기타 연산자는 int로 형변환을 함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class test {
public static void main(String[] args) {
char ch = 65;
System.out.println(ch++); // 'A'
System.out.println(ch); // 'B'
System.out.println(++ch); // 'C'
ch = 65;
System.out.println(ch); // 'A'
System.out.println(ch+0); // 65
System.out.println(+ch); // 65
System.out.println(-ch); // -65
System.out.println(ch << 1); // 130
System.out.println(ch); // 'A'
short num = 0;
// num = ch + 1; // error
int num2 = 0;
num2 = ch + 1; // 에러가 나지 않음.
}
}
  • 170102 내용 수정
    형변환은 쉬프트 연산자(<<, >>), 증감 연산자(++, –)에서만 일어나지 않음.
더 읽어보기 »

컴퓨터는 왜 2진수를 사용할까?

10진법이 익숙한 이유는 손가락이 10개이기 때문이지 않을까?
에니악은 10진법 체계였지만 전기회로는 전압이 불안정해서 전압을 10단계로 나누어 처리하는데 한계가 있음
에드박은 단 두가지 단계, 전기가 흐르면 1, 전기가 흐르지 않으면 0만으로 동작하게 설계되었다
따라서 컴퓨터와 같은 전기회로는 2진 체계를 사용하게 되었다.

그렇다면 8진수와 16진수는 왜 생겼을까?

2진수는 숫자를 표현하기 위해 상당히 많은 자릿수를 차지한다.
코딩할 때도 이렇게 많은 자릿수는 가독성을 해칠 수 있다.
따라서 이런 단점을 보완하기 위해 8진수와 16진수가 등장했다.
그렇다면 왜 8진수와 16진수일까?
2진수 2자리로는 4진수를
2진수 3자리로는 8진수를
2진수 4자리로는 16진수를 표현할 수 있다.
2진수 2자리는 그닥 많은 자릿수를 절약할 수 없어서 사용을 안 하게 된 게 아닐까 싶다…
8진수를 사용하는 대표적인 예는 리눅스나 FTP 등에서 파일이나 폴더에 관한 권한을 표현하기 위해 많이 쓰인다.
777 을 예로 들면
r 읽기 허용(4) w 쓰기 허용(2) x 실행 허용(1) 을 다 더하면 7이 나오고
u 사용자(소유자) g 그룹 o 기타(사용자와 그룹을 제외한 사람) 순서로 기술하면 된다.
16진수를 사용하는 대표적인 예는 rgb 컬러 코드(#ff00ff), 유니코드(\u0061, U+0061, 0x0061 등등)에서 쓰인다.

더 읽어보기 »

이 포스트는 GDG 2016에서 발표하신 맹기완 님의 발표를 듣고 감명을 받아 정리해본 글이다.
이터레이터 인터페이스와 이터러블 인터페이스는 다음 포스트에서 정리할 예정이다.
이 글을 읽고난 후에 (ES6) Symbol에 대한 글부터 읽어보길 바란다.
다소 짧아서 어디 공유하기 부끄럽지만 이렇게 짧은 내용들이 집중해서 읽기에 참 좋은 것 같다.

Interface

ECMAScript2015(이하 ES6) 들어서서 인터페이스고유 명사가 되었다.

고유명사(固有名詞)
낱낱의 특정한 사물이나 사람을 다른 것들과 구별하여 부르기 위하여 고유의 기호를 붙인 이름.

더 읽어보기 »

여름방학에 현장실습을 하면서 다음과 같은 경험을 했다.

A: 권성 씨, 에디터 좋다. 뭐 써요?
나: 저 웹스톰이요. 저희 학교는 교직원에게만 이메일을 줘서 친구 걸로 인증했어요.
A: 뭐 같은 대학생이니까 상관 없으려나…
(잠시 후…)
A: 어, 웹스톰은 기업용이 아니면 기업에서는 쓰면 안 된다고 하는데요?
나: (나니?!)

국내 유통 업체에서 팔고있는 웹스톰 개인용 라이센스
 
내가 느끼기에는 ‘개인용’이란 단어를 교묘하게
‘가정용/학생용’이라는 단어로 바꿔치운 상술로 밖에 보이지 않았다.
이 당시에는 서로 바빠서 그냥 무시하고 웹스톰을 계속 썼었는데,
나중에 취직을 하게 되면 계속 써야할텐데 그 비싼 기업용 라이센스를
사야하나 싶어서 이번에 집중적으로 알아보았다.

더 읽어보기 »
0%