1월, 2022의 게시물 표시

[JAVA] Bit vs Byte, 2진수 ~ 16진수

이미지
이번에 알아볼 내용은 컴퓨터 공학에서 가장 기초적이면서도 가장 기본이되는 Bit 및 Byte에 대하여 알아보려고 합니다. 그러나 그 전에 먼저 2진수 및 16진수를 알아야합니다. 하지만, 이걸 배우기 전에 또 먼저 진법에 대하여 간단히 살펴보고 가도록 하겠습니다. 우리말로 진법은 영어로 Radix라고도 표현을 하기도 합니다. 컴퓨터 용어에서 진법이란 수학에서 진법과 동일(?)한 개념입니다. 수의 표현에 사용될 수 있는 숫자기호의 개수와 그 자리수를 의미한다.  또는 위치에 대한 값을 정의해주는 수의 체계 정의가 참 어렵죠? 간단히 말해 우리가 일상에서 0,1,2,3,4,5,6,7,8,9 까지 수를 셀수 있는 방법을 진법 즉, 10진법(10진수) 이라고 합니다. 10개의 개수로 수를 셀수 있는 체계라는 말이죠. 그러면 여기서 2진수(2진법) 은 뭘까요? 뭔진 몰라도 위 10진수의 정의를 빌리자면 2진법은 2개의 개수로 수를 셀수 있는 체계 이겠죠? 그래서 2진수는 2개 즉, 0,1로 수를 세는 체계입니다. 일단 여기까지만 생각하죠. 더 자세한건 좀 더 있다 상세히 설명하도록 하겠습니다. 자 그럼 또 16진수란 뭘까요? 16진수를 알기전에 먼저 8진수라는 것도 존재하니 이걸 먼저 알아보고 가도록 하겠습니다. 8진수(8진법) 란 0,1,2,3,4,5,6,7 까지 8개의 숫자로 수를 셀수 있는 체계입니다. 그럼 마지막으로 16진수(16진수)란 뭘까요? 당연히 16개의 숫자로 수를 셀수 있는 체계이겠죠? 그런데 여기서 잠깐 0~9까지는 알겠는데 그럼 10은 10으로 표현하나? 라고 눈치 빠르신 분들은 의문을 가졌겠죠? 물론 그렇게 표현할수도 있었을거 같은데 먼저 정의내린 저 영미권 선인(?)들께서 10은 A or a로 11은 B or b로 12는 C or c로 13는 D or d로 14는 E or e로 15는 F or f로 표현하자고 규칙을 정했습니다. 그래서 아마도 간혹 이런 것들을 봤을 겁니다. 0x00FA 이것이 16진수로 표현된 10진수의 값 250을 1...

[JAVA] 문자열 비교[== vs equals()]의 차이

이미지
자바에서 기본 자료형(원시타입)의 비교 연산은 일반적으로 == 연산자를 사용합니다. 하지만 String의 경우는 == 연산자를 사용하여 비교하면 안전하지 않죠? 안전하지 않다는 말은 무슨 뜻일까요? String의 경우 여러분들이 편하게 아무생각(?) 없이 사용하는 리터럴 즉, 대입 연산자를 이용해 바로 상수를 대입하는 방식으로 사용할 경우에는 일반적으로 == 를 이용해 값을 확인해도 문제가 없습니다. 하지만 사용자로 부터 입력을 받아 사용할 경우 동일한 값을 입력 받더라도 비교 연산자(==)는 동일한 값인데도 false를 반환하죠. 즉 아래와 같이 코드를 작성했다고 가정합시다.  Scanner sc = new Scanner(System.in); String id = sc.next();      // 사용자한테 ‘abc’를 입력 받았다고 가정. System.out.println(id == “abc”); // 비교연산자(==)를 이용해 비교하면 false. // 그래서 우리는 String의 메소드인 equals()를 이용해 비교하면 true를 반환합니다. System.out.println(id.equals("abc")); 이처럼 비교연산자(==)와 equals()는 왜 차이가 나는 것인지 한번 살펴보기로 하겠습니다. 먼저 그림을 보도록 하겠습니다. 위 그림에 대한 결론부터 이야기 하자면 String과 같은 클래스에서의 비교연산자(==)는 객체의 주소을 비교하는 것이고, equals()는 주소가 가리키는 실제의 값, 즉 문자열을 비교하는 메소드입니다. 따라서 우리는 String를 사용할 때 항상 안전하게 그리고 생각하지 말고 equals()를 사용하라고 배우죠. 위의 그림에서 선언한 각각의 변수들 주소를 이클립스에서 출력해보면 다음과 같습니다. String str1 = "Hello"; String str2 = "Hello"; String str3 = new String("World...

[JAVA] 문자셋(Charset)

이미지
문자셋의 역사 2022년 현재를 기준으로 가장 많이 사용되고 많이들 알고 있는 문자셋(Charset)은 UTF-8일 것이라 생각합니다. 물론 여러분들이 프로그래밍을 공부했거나 컴퓨터 공학을 전공했다면 ASCII 뿐만 아리나 UNICODE 등 다양한 문자셋을 알고 있겠죠. 그래서 이렇게 많은 문자셋들이 왜 생겨서 우리를 괴롭히는지 그리고 다 공부해야하는지 궁굼해 하는 분들이 많으실거라 생각하여 짧게 문자셋의 역사와 자주 사용되는 문자셋 몇개를 정리해 보려 합니다. 일단 문자셋의 대략적인 역사 또는 발전기를 아래와 같은 그림으로 살펴보도록 하죠. 위에서 보는 바와 같이 최초의 컴퓨터는 알파벳권에서 처음 개발 및 사용되었다고 합니다. 그래서 초기에 컴퓨터를 만들 당시 알파벳만 사용하면 되었던 것이죠. 그 시대 배경을 보더라도 글로벌 시대도 아닌 냉전 시대였으니 뭐 당연한거라고 생각할 수 있었을거 같습니다. 그렇게 시작되었던 초기 컴퓨터에서 0과 1밖에 모르던 컴퓨터에서 사람이 사용하기 위해 글자를 표시할 방법을 컴퓨터 과학자들이 의논하게 되죠. 고민끝에 컴퓨터에서는 데이터를 부호화하는 방법으로 숫자를 문자로 치환하는 방법을 생각하게 됩니다. 예를 들어 0은 NULL 이라는 아무것도 없다라는 기호로 그리고 숫자 65면 문자 알파벳 대문자 ‘A’로 66면 대문자 ‘B’ 이렇게 쭈욱 이어지다가 소문자 ‘a’는 97로 정하게 되죠.  이렇게 사람이 볼수 있는 문자를 컴퓨터 언어인 코드번호로 변경 또는 ‘부호화’하는 방법을 ‘인코딩(Encoding)’ 이라고 하고. 코드번호를 사람이 알아들을 수 있는 문자로 다사 되돌리는 것을 복호화 또는 ‘디코딩(Decoding)’이라고 합니다. 인코딩 : 문자, 숫자, 기호 등을 컴퓨터의 내부처리를 위해 숫자코드번호로 변경하는 것. 디코딩 : 컴퓨터의 내부처리 숫자코드번호를 문자, 숫자, 기호 등을로 다시 복원하는 것. 그래서 처음으로 이러한 기준을 만들었던 것이 ASCII(American Standard Code for Info...

[JAVA] Console vs Terminal vs Shell

이미지
이번 블로그에서는 몇몇분들이 Eclipse에서 자바를 개발할 경우 또는 웹에서 디버깅을 할 경우 아래와 같이 Console이라는 화면을 자주 만나게 되는데요. 이 콘솔이 왜 콘솔로 불리게 되었는지 또는 콘솔이 왜 콘솔인지에 대하여 컴퓨터의 역사와 함께 잠시 살펴보겠습니다. 아마도 자바 또는 웹 개발자들에겐 참 친숙한 그리고 친해져야 하는 화면 중 하나죠? 우리 개발자들에겐 없어서는 안될 화면입니다. ^^ 자 이 콘솔이 왜 콘솔이라고 불리게 되었느냐면 아주 오래전 그것도 호랑이 담배피던 시절 아마도 제가 태어나기도 전 일 꺼라 예상합니다. 그 시절에는 그림과 같이 컴퓨터가 어마어마하게 고가였고 크기도 어마어마 했다고 합니다. 전해지는 이야기로는 현재 가치로 따지면 몇억씩 했다고 합니다. 그것도 현재 가장 느린 스마트 폰보다도 수십배 또는 수천배(?) 느린 컴퓨터 였는데도 말입니다. 아마도 100여년(?)도 안된 역사가 십만배 천만배 더 좋은 스마트 폰을 만들어내고 이제는 이걸 넘어서 스마트 워치니 스마트 글라스니 ~~ 세상의 발전 속도가 날이 갈수록 어마어마해 지네요.. 제가 또 서론이 길어졌습니다. 요약하자면 아래 그림과 같이 예전엔 콘솔이라는 장치 지금의 입출력 장치만을 가진 콘솔장치를 통해 조금 멀리 떨어진 학교내의 컴퓨터(지금의 서버라고 생각해도 될 거 같네요)실 또는 직장내의 컴퓨터실에 본체를 연결하여 텍스트를 통해 입력하고 결과를 출력 받는 식의 장치를 사용했던 거죠. 이렇게 연결한 장치를 콘솔(Console)이라고 불렀습니다. 그리고 이처럼 서버 컴퓨터와 연결된 장치를 터미널(예전엔 Dummy Terminal 라고도 불렸답니다) 이라고 부릅니다. 우리말로는 단말장치 또는 단말기 라고 부르죠. 좀더 의미를 구체화 하자면 콘솔이라는 말은 명확하게 입출력 장치라는 물리적인 의미를 갖고 있다면, 터미널이라는 의미는 물리적 장치를 뿐아니라 서버와 연결되어 데이터를 주고 받고 일을 처리할 수 있는 환경 또는 장치라는 좀 더 광범위한 개념을 포함하고 있습니다. ...