본문 바로가기

전체 글

(119)
[Java] JVM과 CPU의 호환성 Java로 작성한 프로그램의 독립성을 위해서는 JVM 역할이 필요하다. 결국, JVM은 CPU와 OS에 종속되기 때문이다. 그렇다면 그중 CPU의 어떤 부분이 JVM과의 호환이 필요한지를 알아보고, 어떻게 JVM으로 해결했는지 자세하게 파헤쳐볼것이다.명령어와 CPU 아키텍처명령어와 폰노이만 구조컴퓨터는 연산을 수행하는 기계이며, 프로그램은 명령어(Instruction)들의 연속된 연산으로 실행된다. 명령어는 +/-과 같은 연산과, 1 + 2의 식에서 연산할 대상인 1과 2 처럼 데이터가 있을 것이다. 그리하여 폰노이만은 명령을 내리는 놈인 제어장치(Control Unit), 연산을 하는 놈인 산술/논리 장치(Arithmetic Logic Unit), 데이터를 저장하는 놈인 메모리(Memory)으로 역할을..
[Java] Java의 플랫폼 독립성 Java의 철학Java의 철학은 플랫폼(CPU & OS)의 독립성에 대한 자유를 부여하고자 하였다. 모든 플랫폼마다 맞게 코드를 구현하는 것은 같은 일을 여러번 하는 것이고 개발스럽지 못하였다.Java 프로그램과 CPU와 OS의 호환Java 언어로 작성한 코드는 어떤 플랫폼(CPU와 OS)과 상관없이 돌아가고자 만들기 위해선 생각이 필요하다. 간단하게 생각하면, Java 프로그램과 CPU, OS 사이에 각각 변역가 역할을 하는 레이어가 필요하다. 그 역할을 하는 것이 JVM(Javar Virtual Machine)이다. Java로 작성된 소스코드는 바이트 코드로 변환되고, 이후 JVM이 각 플랫폼마다 호환되게 실행되어야한다.  그렇다면 Java 프로그램이 CPU와 OS의 호환을 위해서는 JVM의 어떤 역..
[Java] 배열에 대한 이해 (저장과 접근 방식, 복사 등) 배열(Array)의 탄생과 배경같은 타입의 변수를 여러개 선언할때 일일히 선언하는 것이 불편하여 만든 데이터 구조이다. 배열은 같은 타입의 여러 변수들을 하나로 묶는 것이며, 연속적으로 저장한다.기존의 여러 변수를 통해 접근한다면, 각 변수의 이름을 알아야 접근이 가능하고 순차적으로 접근이 힘들다. 배열 하나로 많은 양의 데이터를 손쉽게 다루며, 특히나 연속적인 접근을 손쉽게 할 수 있다.// 여러 변수로 선언int a, b, c, d; a = 1; b = 2; c = 3; d = 4;// 배열 선언과 생성int[] arr = new arr[4];arr[0] = 1;arr[1] = 2;arr[2] = 3;arr[3] = 4;for (int i = 0; i 배열 선언과 생성아래는 첫 번째줄의 코드는..
[Java] Java 소스코드 Compile, Hex Dump, Disassemble 컴파일 (Compile)javac [source_code_name].java 명령어를 실행 시켜, 아래의 자바 소스 코드를 바이트 코드로 컴파일하였다..public class ByteCode { public static void main(String[] args) { int x = 5; int y = 32768; int z = x + y; } } 컴파일한 클래스 파일(.class)을 vim 텍스트 편집기로 열어보면, 다음과 같이 사람이 읽기 어려운 바이너리 형태로 저장되어있다.Êþº¾^@^@^@B^@^\^@^B^@^C^G^@^D^L^@^E^@^F^A^@^Pjava/lang/Object^A^@^F^A^@^C()V^C^@^@^@ ^@ ..
[Java] 정수 고정값의 컴파일 최적화 정수(문자도 정수)의 상수(constant)와 리터럴(literal)은 상수 풀(constant pool)에 저장 되지 않고, 명령어의 수행할 연산인 opcode에 포함될수있다. 자바 컴파일러(javac)가 정수의 상수나 리터럴의 크기와 사용 빈도수를 고려하여, 값의 크기가 작고 사용 빈도수가 낮은 바이트 코드에서 명령어의 opcode에 직접 정의된다. 이로써 컴파일러의 최적화에 의하여 메모리에 접근하여 값을 가져오지 않아 보다 빠른 연산 처리를 수행할 수 있다. 다음은 어떻게 컴파일러가 최적화 했는지 확인해보기위해서 소스코드를 작성하고, 바이트 코드로 컴파일하여 확인해볼려고 한다.public class ByteCode { public static void main(String[] args) {..
[Java] if문과 switch문의 비교 (Jump Table) if문에서는 어떠한 조건이 true을 만족할때까지 순차적으로 조건식을 확인해야한다. 그러므로 경우의 수가 많아질수록 조건식(if-else)이 많아져서, 조건식에 대한 처리시간이 많이 걸린다.if (score >= 90) { System.out.println("A");} else if (score >= 80) { System.out.println("B");} else if (score >= 70) { System.out.println("C");} else if (score >= 60) { System.out.println("D");} else { System.out.println("F");} switch문에서는 하나의 조건식으로 많은 경우의 수를 처리할 수 있다. if문 보다 간..
컴퓨터의 연산 원리 (논리 회로와 가산기) 트랜지스터 (Trangister)컴퓨터에서 연산을 수행하는 CPU는 트랜지스터(Trangister) 반도체로 구성되어있다. 컴퓨터에서 모든 것을 표현하는 0과 1은 전기적 신호로 부터 표현된다. 전기적 신호는 트랜지스터로부터 발생된다. 트랜지스터에서 전압이 걸려 전류가 흐르면 1, 흐르지 않으면 0이 된다. 이렇게 전기적 신호(전류 흐름)는 디지털 신호(1, 0)로 변환된다.  전압은 전자의 이동을 유도하는 전기적인 힘의 크기를 나타낸다. 동일한 부호의 전하(양전하끼리 또는 음전하끼리)는 서로 밀어내는 힘이 작용하고, 다른 부호의 전하(양전하와 음전하)는 서로 끌어당기는 힘이 있다. 이를 통해 전자의 이동을 유도할 수 있다.트랜지스터는 세 개의 단자(Terminal)로 구성되어 있으며, 각 단자의 이름은..
[Java] 연산자 이해와 활용 연산자와 피연산자연산자(operator)는 연산(operation)을 수행하는 기호를 말한다.연산할 식에서는 연산자(operator)와 피연산자(operand)가 존재한다. 연산자는 다양한 연산자(산술, 비교, 논리, 대입, 증감, 비트 연산자)가 있고, 연산자는 연산할 대상인 피연산자(변수, 상수, 리터럴, 수식)가 필요하다. 아래의 식 x + y는 왼쪽의 + 연산자가 변수 x 와 상수 y 에 대한 결과 값 12를 반환한다. 이렇게 연산자는 피연산자로 연산을 수행하면 항상 하나의 결과 값을 반환한다. 그리고 반환된 결과 값을 대입 연산자(=)을 통해 result 변수에 저장한다.int x = 5;final int y = 7;int result = x + y; // +는 operator, x와 y는 op..