[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 라고도 불렸답니다) 이라고 부릅니다. 우리말로는 단말장치 또는 단말기 라고 부르죠. 좀더 의미를 구체화 하자면 콘솔이라는 말은 명확하게 입출력 장치라는 물리적인 의미를 갖고 있다면, 터미널이라는 의미는 물리적 장치를 뿐아니라 서버와 연결되어 데이터를 주고 받고 일을 처리할 수 있는 환경 또는 장치라는 좀 더 광범위한 개념을 포함하고 있습니다. ...

[JAVA] 변수란? 변수타입?

이미지
프로그램 언어를 배울때 항상 먼저 배우거나 집고 넘어가는 것이 있죠? 네 맞습니다.  변수 라는 것입니다. C언어나 Java에서는 int, char, float 등 자료형에 따라 다르고, Javascript에서는 모든 변수를 그냥 var로 사용하죠. 물론 또 개발 언어마다 조금씩 차이가 있습니다. 하지만, 기본적으로 "변수"라는 기본 개념은 모든 언어에서 모두 동일합니다. 이번 포스팅은 이 변수에 대하여 낱낱이 파헤쳐 봅시다.  아! 참고로 변수에 대하여 정말로 낱낱이 땅끝까지 파헤치자면 이 한번의 포스팅으로는 부족합니다. 따라서 오늘은 일차적으로 가장 기본이 되는 변수의 정의와 원시타입에 대해서만 낱낱이 살펴보도록 하겠습니다. 변수란 무엇일까? 자! 일단 변수란 무엇일까요? 변수란? 물어보면 가장 먼저 사람들은 당당히 말을 하죠.  "변하는 수" 물론 이 말도 틀린 말은 아닙니다. 우리 프로그래밍에서는 변수라는 공간에 값이 항상 변하는 그리고 그런 용도로 사용하려는 것이 변수니까요. 변수는 영어로 "Variable"라고 읽습니다. 이것을 사전에서 찾아보면 "변화하기 쉬운, 변덕스러운, 다양한" 이라는 의미를 갖습니다. 뭐 이 말도 틀린 말은 아니네요. 하지만! 우리는 개발자로도 더 프로그래밍 적인 의미를 원합니다. 그래서 이렇게 정의를 했죠. 변수란? 데이터(값)을 저장할 수 있는 프로그램의 저장 공간! 서론이 길었네요. ^^. 항상 무언가 정의를 내리기란 쉽지 않습니다..ㅎㅎㅎ 변수를 좀 더 이해하기 위해 아래의 그림을 예를 들어 보겠습니다. 위와 같이 우리가 물을 마셔야 한다면, 물을 마시기 위해 당연히 물 컵이 있어야겠죠.  아! 물통에 입을 대고 드시는 분들도 계시지만... 그러면 엄마한테 혼납니다. ㅎㅎ 아무튼 이렇게 물을 마시기 위해 물을 담을 컵을 준비하는 것을 프로그래밍에서는 "데이터를 사용하기 위해 변수를 선언한다" 라고 이야기 할 수 있습니다.  그럼 ...

[JAVA] JVM, JRE, JDK 이해하기

이미지
오늘은 JVM, JRE, JDK에 대하여 알아보려고 합니다. 이들은 모두 앞의 글자 J로 시작하는 부분이 모두 Java의 약자입니다. 따라서 여러분들도 알다시피 모두 Java와 관련된 파일이라는 것을 짐작할 수 있을 거라 생각합니다. 일단 긴 설명은 이어서 하기로 하고 제가 열심히 그림 그림부터 보고 가겠습니다. 간단히 먼저 살펴보시면 좋을 거 같습니다. 자 위에서 보는 그림을 간단히 순서대로 설명하자면 아래와 같습니다 Java가 실행이 되려면 먼저 JVM(Java Virtual Machine)이라는 일명 자바 가상 머신이 필요하다. JVM에는 크게 ClassLoader, Excution Engine, Garbage Collector(GC)가 존재한다. ClassLoader : 실행에 필요한 클래스 파일 또는 라이브러리 파일들을 하나로 모아준다. Excution Engine : 모아준 파일의 내용을 적절히 실행을 위해 메모리에 분산 배치한다. Garbage Collector : 실행중에 발생하는 메모리 파편(사용하고 난 쓰레기 메모리)를 정리한다. JVM을 포함하고 있는 JRE(Java Runtime Enviroment) 자바실행환경을 통해(설치된) OS(운영체제 : Linux, Windows, Mac 등등)에서 실행 파일이 동작한다. JDK(Java Development Kit) 자바개발킷은 자바가 실행되는 사용 환경에서는 필요 없으나 개발자가 Java를 통해 개발하기 위해 필요한 라이브러리 및 각종 파일들을 가지고 있다. 또한 개발자가 JDK를 설치하면 그 안에 JRE가 포함되어 있다. 이렇게 전체적인 그림에 대한 흐름을 간단히 설명 드렸습니다. 그럼 이제 구체적으로 하나씩 하나씩 더 상세히 살펴보기로 하죠. JVM(Java Virtual Machine) JVM은 앞서 살펴본 대로 Java에서 가장 핵심 코어인 자바가상머신입니다. 단어에서 딱 보기에도 머신이라는 말이 먼가 코어스럽죠? ^^ 위 그림에서 보면 JVM은 "플랫폼 독립적(이식성)이다...

[JAVA] 아카이브 파일 Export/Import 방법

이미지
오늘은 Eclipse에서 작업한 소스 코드를 통으로 내보내고 가져오기 위한 방법에 대한 포스팅을 준비했습니다.  물론 파일 탐색기를 통하여 디렉토리를 통째로 압축하고 다시 사용할 곳에 압축해제하여 사용해도 문제는 없습니다.  다만 우리는 Eclipse를 이용하여 내보내기(Export) 및 가져오기(Import)를 제공하므로 이를 이용하는 방법을 간단히 살펴보도록 하겠습니다. Export 메뉴를 이용한 데이터 내보내기 먼저 소스 파일을 내보내기 위해 아래와 같이 File > Export 메뉴를 선택합니다. 그러면 우측과 같이 Export 팝업 창이 표시가 되겠죠. 여기서 우리는 Archive File을 선택한 후 Next를 클릭합니다. 이후에 표시되는 화면에서 아래와 같이 왼쪽에서 모든 파일을 체크합니다. 그러면 오른쪽의 파일들은 자동으로 모두 선택된 상태로 표시됩니다. 여기서 물론 좀 사용해 보신 분들을 본인의 생각에따라 내보내고 싶은 파일만 오른쪽에서 선택하여 내보내기해도 상관 없겠죠? 그리고나서 Browse... 를 선택하여 내보내고 싶어하는 디렉토리(폴더)를 선택합니다.  주의 : 여기에서 주의할 점은 파일이름을 작성할 경우 현재 디렉토로 안에 동일한 파일 이름과 동일한 이름의 폴더( 아래에서는 day01 )가 존재한다면 저장을 누를 경우 저장이 아닌 해당 폴더로 이동한다는 것에 주의하세요. 즉 파일 이름을 day01로 하고 day01이라는 폴더가 존재한다면 이와 같은 현상이 발생합니다. 자! 그럼 우리는 아래와 같이 내보낼 디렉토리를 선택하고 파일이름을 day01_ex 처럼 주도록 하겠습니다. 그리고 "저장"을 클릭하세요. "To archive file"의 디렉토리 및 파일명을 확인하고 "Finish"를 클릭합니다. 그래면 아래와 같이 day01_ex.zip라는 압축파일이 생겼다는 것을 알 수 있습니다. 이제 그다음으로 내보내기 한 파일을 읽어들일 차례입니다. Import 메뉴를 이용한 데이터 ...