Java 개선된 비트 변환기

4. 개선된 비트 변환기 이전의 비트 변환기는 양의 정수만을 대상으로 하기때문에 음수값은 변환할 수 없는 치명적인 단점이 있었기 때문에 이번에는 음수 값 까지 포함하여 변환을 수행하는 메서드를 만들어 보도록 하겠다. 이 메서드의 처리 과정은 이전 과정과 동일 하고 다른 점은 메서드 내부처리 로직부분이다. 코드는 아래와 같다.     public static boolean[] convertToBits(int value) {      boolean[] arr = new boolean[Integer.SIZE];      int idx = 0;      for(int i=arr.length-1; i>=0; i--) {      if(((value >>> i) & 0x01) == 1) {      arr[idx++] = true;      } else {      arr[idx++] = false;      }      }      return arr;     }

Java 간단한 bit 변환기

3. 간단한 bit 변환기 간단한 bit 변환 함수를 만들어 보자. 일단은 int형의 값을 인자로 갖고 boolean 배열의 형태로 값을 리턴하는 형식을 취할 것이다.  이 메소드의 처리과정을 나열해 보면 1. 비트를 표현하는 boolean[]을 리턴 값으로 갖는다. 2. int값과 얻을 비트수를 메소드의 파라미터로 갖는다. 3. 메소드(함수)의 내부에서 int 값을 boolean[]로 변환하는 로직을 구현한다. 4. 비트수 만큼 루프(loop)를 돌려서 비트값을 얻는다. 5. 해당 비트값은 int값을 2로 %연산한 값이 1인지 아닌지로 판별한다. 6. 5번의 처리 후 값을 2로 나누어 준다. 7. int 값은 양의 정수만을 대상으로 한다. 코드는 다음과 같다. public class Example1 {     /**      * 인자로 주어진 int 값을 boolean 배열로 얻는다.      * @param value 값      * @param bitNum 비트갯수      * @return boolean 배열      */     public static boolean[] convertToBits(int value, int bitNum) {         boolean[] arr = new boolean[bitNum];         long temp = value;         for(int i=bitNum-1; i>=0; i--) {             if(temp%2 == 1) { ...

Java bit연산자와 shift연산자

2. bit연산자와 shift연산자 bit 연산자 -  정수형 기본형 데이터 타입에서 각 비트를 개별적으로 조작한다. - 양쪽 피연산이 되는 각각의 비트를 참, 거짓 연산을 수행한다. &   : 비트 AND연산자로 양쪽 비트 모두 참(1)일 경우에만 참(1)이다. 그렇지 않으면 거짓(0)이다. (참:참=참, 참:거짓=거짓, 거짓:참=거짓, 거짓:거짓=거짓) |   : 비트 OR연산자로 양쪽 비트 중 어느 하나라도 참(1)이면 참(1)이다. 거짓(0)에 거짓(0) 일때만 거짓(0)이다. (참:참=참, 참:거짓=참, 거짓:참=참, 거짓:거짓=거짓) ^  : 비트 EXCLUSIVE OR연산자로 양쪽 비트의 상태가 다를 경우에만 참(1)이다. 나머지는 거짓(0). (참:참=거짓, 참:거짓=참, 거짓:참=참, 거짓:거짓=참) ~  : 비트 NOT연산자로 양쪽이 아닌 단항 연산자 이다. 참(1)을 거짓(0)으로 거짓(0)을 참(1)으로 만든다. (~참=거짓, ~거짓=참) ex) 177 & FF = 177    ->    10110001 & 11111111 = 10110001 ex) 177 | FF = FF    ->     10110001  | 11111111 = 11111111 ex) 177 ^ FF = 78    ->      10110001  ^ 11111111 = 01001110 ex) ~177 = 78    ->    ~ 10110001  = 01001110 shift 연산자 - Java의 기본 정수는 반드시 첫 비트에 부호...

부재와 존재(0과 1)

1. 부재와 존재(0과 1) 비트(bit, Binary Digit)는 존재와 부재를 의미하며 이는 서로 배타적인 상태를 구분짓는 단위이다. 전산적으로는 가장 기초적인 정보의 단위이며 논리적으로는 이질적인 상태의 경우의 수를 표현하는 도구로도 쓰일 수 있다. 즉 있음(1)과 없음(0)의 구분이 있기에 그것의 나열로 생기는 다양한 경우의 수로 우리는 바이너리의 위력을 현재도 몸으로 체감 할 수 있다.(실체로 존재하지만 체감하는 사람들은 많지는 않은 듯) 일단 전기적으로는 전기가 흐르는 상태인 1과 흐르지 않는 상태인 0으로 재현될 수 있는데 이 상태를 병렬로 연결하여 다양한 경우의 수를 처리하게 되는 것이다. 이후 반도체의 발전은 디지털 저장 및 연산 체계에 혁명적인 변화를 이끌어 왔고 현재도 그 변화는 계속적인 진화에 진화를 거듭하고 있다. 비트의 논리는 생각보다 단순한데 비트의 자릿수가 하나 증가할 수록 표현 할 수 있는 범위가 2의 제곱승으로 증가한다는 것이다. 그럼 그 논리로 나올 수 있는 경우의 수 또한 그 처럼 단순할까? 간단한 예로 두께 0.1mm짜리 A4지를 접는 것을 예로 들어보자. 한번 반으로 접으면 종이의 두께는 2배수로 증가할 것이고 이것을 42번 접는 다고 가정해 보자. 그 두께는 어느 정도나 될까? 한 1m정도 될까? 아님 많아야 한 10m? 답은 예상 외로 지구와 달 까지의 거리보다 긴 439,804.7Km 이다. 지구와 달과의 거리가 약 38만 Km인것으로 보면 거리상으로 한참은 더 긴 결과이다. 참으로 놀라운 결과다. 0.1, 0.2, 0.4.........43만 Km.... 이처럼 바이너리(binary)가 가질 수 있는 수의 범위는 저장공간이 허용하는 한 거의 무한대에 가까운데 무한대의 수에서 표현할 수 있는 경우의 수 또한 무한대 임을 가만 할 때 각각의 수를 하나의 정보로 보면 저장 처리할 수 있는 정보 또한 무한대로 볼 수 있는 점에서 복잡다단한 세상을 표현 할 수 있...

생성자, 멤버변수, 멤버함수, 지역변수

4. 생성자, 멤버변수, 멤버함수, 지역변수 생성자 : 클래스를 인스턴스화 하는 리턴값이 없는 특별한 메서드로서 그 이름은 반드시 해당 클래스명과 일치해야 한다. 주로 생성자에서는 해당 클래스가 인스턴스화 될 시 필요한 초기화 작업을 주로 수행한다. 멤버변수 : 클래스에 존재하는 변수로서 함수(메서드)에 존재하는 지역변수와는 생명주기나 참조범위에서 차이가 있다. 멤버변수의 생명주기는 해당 클래스 인스턴스가 메모리상에서 삭제되기 전까지 이며 참조범위는 해당 클래스에 선언될 시에 접근지시자(public, private, protected, friendly)에 따라 달라진다. 선언시 초기화 하지 않으면 해당 데이터형의 기본값으로 설정된다. 멤버함수 : 멤버변수와 생명주기와 참조범위는 멤버변수와 비슷하다. 지역변수 : 메서드(함수) 내에 존재하는 변수로서 로컬(local)변수 라고도 한다. 생명주기는 해당 메서드가 종료되기 전까지 이고 로컬변수는 접근지시자가 없다. 로컬변수는 반드시 어떠한 값으로 초기화 되어야하며 메모리상에 스택(stack)영역에 위치하게 된다.

클래스와 인스턴스

3. 클래스와 인스턴스 앞서 우리는 Hello World!!! 예제에서 클래스라는 개념을 살펴보았습니다. 그리고 우리는 앞에서 또한 인스턴스(Instance)라는  언급도 했었습니다. 가장 단순하게 이야기하면 클래스는 어떠한 '틀'과 같은 것이고 인스턴스는 그 '틀'로 찍어낸 제품과 같은 것 입니다. 예를 들어 자동차를 만들때 자동차의 형태를 찍어내는 '틀'이 있을 것이고 이것이 클래스 입니다. 물론 그 '틀'로 만들어낸 자동차는 인스턴스가 되겠지요.  처음 프로그래밍을 하는 분들은 두가지 개념이 매우 헷갈릴 것입니다. 하지만 지속적으로 코딩을 하다보면 두가지의 차이는 너무나도 명확하게 구분지워지므로 지금은 걍 그렇다고 알구 넘어갑니다. 어렵게 이야기하면 클래스는 어떠한 형상(원형)이고 인스턴스는 그 형상에서 발생되어 메모리(memory)상에서 실행중인 프로그램이 실체적으로 사용할 수 있는 구체적인 실체라고 볼 수 있습니다.  Java언어는 컴파일(Compile)시 알지못했던 클래스를 실행시(Runtime)에 로드(load) 할 수 있는 특별하고 강력한 기능이 존재하고 뒤에서 다루도록 하겠습니다.

다양한 방식의 Hello World!!!

2. 보다 다양한 Hello World!!! 이번에는 보다 다양한 형태의 Hello World의 예제를 살펴보겠습니다. 되도록 Java의 특성이 드러나도록 하겠습니다. public class HelloWorld2 { public HelloWorld2(String msg) { System.out.println(msg); } public static void main(String[] args) { String str = "Hello World!!!"; HelloWorld2 hw2 = new HelloWorld2(str); } } 위의 코드는 이전 회의 코드와 비슷하지만 약간은 달라져 있는 것을 알 수 있습니다. 일단 클래스 안에 생성자가 추가되어 있습니다. 생성자란? 클래스를 인스턴스화 시켜주는 메소드 인데 쉬게 말해 어떠한 클래스를 메모리상(Heap)에 상주시켜주는 역할을 수행한다고 보면 됩니다. 보통은 new 키워드로 생성자를 호출하게 되면 해당 클래스를 개발자가 참조할 수 있는 형태의 인스턴스가 되게 됩니다. 위에서는 생성된 인스턴스를 hw2라는 변수에 입력해 놓고 있네요. public class HelloWorld3 { String msg; public HelloWorld3(String msg) { this.msg = msg; printStdIO(); } public void printStdIO() { System.out.println(this.msg); } public static void main(String[] args) { String str = "Hello World!!!"; HelloWorld2 hw2 = new HelloWorld2(str); } } 위 코드는 클래스에서 드러날 수 있는 대부분의 형식을 갖추었습니다. 일단 3라인에서 String 이라...