본문 바로가기

Java

(54)
[Java] 객체 지향 개념과 객체화 (절차 지향과의 비교) 객체 지향 언어의 탄생과 배경이전에는 전쟁과 과학 같은 특정 분야의 개발을 주로 하였었다. 이후 대중에게 컴퓨터가 보급되고 웹이 생겨남에 따라서, 프로그램 규모가 점점 커지고 요구사항의 빠른 변경이 생겨났다. 기존의 절차 지향 언어(Procedure-Oriented -Language)은 순차적인 함수의 흐름대로 코드를 작성한다. 그리하여 실행 흐름에 따라 동작하는 함수를 다른 곳에서 쓰기가 어렵고, 기능 수정을 위해 함수 하나를 변경하면 연관된 함수도 연쇄적으로 변경이 필요하였다. 그리하여 모듈화가 쉬운 형태로 만들어 코드 재사용성을 늘리고, 코드의 변경과 관리가 쉬운 형태로 개발하고자 하였다. 이로써 나온것이 객체 지향 언어(Object-Oriented-Language)이다. 그리하여 '특정 역할을 ..
[Java] JVM과 OS의 호환성 Java로 작성한 프로그램의 독립성을 위해서는 JVM 역할이 필요하다. 결국, JVM은 CPU와 OS에 종속되기 때문이다. 그렇다면 그중 OS의 어떤 부분이 JVM과의 호환이 필요한지를 알아보고, 어떻게 JVM으로 해결했는지 자세하게 파헤쳐볼것이다.OS의 명령어아래는 OS의 쉘 명령어(Shell Command)이다. Window와 macOS는 쉘 명령어가 아예 다르며, macOS와 linux는 Unix 기반의 운영 체제이므로 비슷하다. 이처럼, OS 마다 CPU 아키텍처와 호환되게 만든 자신들만의 쉘 명령어 들이 있다.Windowdir # 현재 디렉토리의 파일과 디렉토리 목록을 출력cd Desktop # Desktop 디렉토리로 이동mkdir new_dir # 새로운 디렉토리를 생..
[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문 보다 간..