* 프로그래밍 언어의 변천사
①절차적 프로그래밍 → ②함수 프로그래밍 → ③ 객체지향 프로그래밍 → ④ 패키지
goto f1(c) { Class A package
→ → f1(c) {
f2(c) { f2(c) { ↓
→ module
f3(c) { Class B
→ → f3(c) {
f4(c) { f4(c) {
명령문을 기능 단위 묶는다.
Why ? 코드 관리를 쉽게 하기 위해서.
① 객체지향 프로그램이 등장한 배경 ?
C 에서 C ++ 이 생겨난 이유.
객체지향 프로그래밍을 도입하여 코드 관리를 편하게하고
개발자들이 기존에 작성된 코드 수정을 용이하게 하기 위해서.
가독성과 유지보성을 향상시키는 중요한 원칙이다.
② JAVA는 메모리 관리를 개발자에게 맡기는 것이 아니다.
Java는 Java 가상머신(JVM)에 의해 자동으로 수행되는 프로세스, 가비지 컬렉션(Garbage Collection)이라는 메모리 관리 기법을 사용하여 더욱 편리한 메모리 관리를 제공한다. 이를 통해 개발자가 명시적으로 메모리를 할당하고 해제하는 번거로움을 덜어준다. 더 이상 참조되지 않는 객체들을 자동으로 탐지하고 해제하여 메모리를 회수한다.
즉, 개발자는 명시적으로 메모리 할당과 해제에 대한 관리를 신경쓰지 않아도 된다.
JAVA 언어를 C++ 언어 대신에 사용하게된 주된 이유.
GPT Answer :
Java가 C++ 대신 주로 선택되는 이유에는 다음과 같은 요인들이 있습니다:
플랫폼 독립성: Java는 플랫폼 독립적인 언어로, 한 번 작성한 코드를 다양한 운영체제에서 실행할 수 있습니다. 이는 Java의 가상머신(JVM)을 통해 구현되며, JVM은 특정 운영체제에 종속되지 않고 Java 코드를 실행할 수 있도록 지원합니다.
메모리 관리의 편의성: Java는 가비지 컬렉션(Garbage Collection)을 통해 메모리 관리를 자동화하므로, 개발자가 명시적으로 메모리 할당과 해제에 대해 걱정할 필요가 없습니다. 이는 개발자의 작업 부담을 줄여주고 메모리 관리로 인한 오류를 방지할 수 있습니다.
객체지향 프로그래밍의 강점: Java는 객체지향 프로그래밍(OOP)을 강력하게 지원합니다. 클래스, 상속, 다형성 등의 개념을 활용하여 모듈화된 코드를 작성하고 재사용할 수 있습니다. 이는 코드의 구조화와 유지보수를 용이하게 하며, 대규모 프로젝트의 개발과 확장성을 향상시킵니다.
강력한 라이브러리와 생태계: Java는 다양한 표준 라이브러리와 프레임워크를 제공하며, 이를 활용하여 개발 속도를 높일 수 있습니다. 또한, Java 개발자 커뮤니티와 생태계가 넓어서 문제 해결 방법을 공유하고 다양한 도구와 지원을 받을 수 있습니다.
보안성: Java는 내장된 보안 기능을 가지고 있어서 안정성과 보안성이 요구되는 애플리케이션 개발에 적합합니다. 자바 바이트코드를 실행하는 JVM은 보안 관련 기능을 강화하여 악성 코드의 실행을 방지하고, 사용자의 시스템을 보호합니다.
* 문자 → 2진수 → 전기 신호
① ASCII (7bit)
0~127 = 128개
* ASCII 코드가 아니라 국제표준은 ISO-Latin-1 을 따른다.
EX) ASCII CODE
스페이스 0x20 → 2 0 → 010 0000
and 0x26 → 2 6 → 010 0110
? 0x3F → 3 F → 011 1111 F는 A,B,C,D,E,F 10,11,12,13,14,15 라서 15이다.
# 0x23 → 2 3 → 001 0011
+ 0x2B → 2 B → 010 1011 B는 A,B,C,D,E,F 10,11,12,13,14,15 라서 11이다.
A 0x41 → 4 1 → 0100 0001
B 0x42 → 4 2 → 0100 0010
③ KSC-5601 (16bit) : 한글 문자 따로 정의 → 완성된 문자에대해 2진수 정의 = 초성+중성+종성
(ISO-885p-1 +a)
전각문자 / 기호 / 자소 / 선문자 : 0xA180 ~ 0xAFFF
한글 : 0xB0A1 ~0xC9FF (2350자)
한자 : 0xCA80 ~ 0xFDFF (한국에서 사용하는 일부 한자)
④ 조합형 (16bit)
따라서 '단'을 5자릿수로 표현한 조합형 문자의 이진 표현:
초성 'ㄷ': 00101
중성 'ㅏ': 00011
종성 'ㄴ': 00101
최종적으로 '단'은 다음과 같은 5자릿수로 표현:
00101 00011 00101
⑤ MS949
MS949는 마이크로소프트에서 개발한 한국어 인코딩 방식으로, Windows에서 주로 사용.
MS949는 완성형 한글 문자 집합인 KS X 1001을 기반으로 하며, 한글, 영문, 숫자, 특수 문자 등을 포함
⑥ Unicode = UTF16 (16bit)
Java 에서 unicode를 적용한다.
기존 영어권 문자가 1byte 에서 2byte 로 커지면서 메모리 낭비가 발생한다.
⑦ UTF-8
UTF-8은 다양한 언어와 문자를 지원하는 인코딩 방식.
예를 들어, 영어 알파벳은 ASCII 문자로 표현되며 UTF-8에서도 동일하게 표현.
영어 대문자 'A'는 UTF-8에서는 1바이트로 표현.
한글 문자 '가'는 UTF-8에서는 3바이트로 표현.
일본어 문자 'あ'는 UTF-8에서는 3바이트로 표현.
이모지 '😊'는 UTF-8에서는 4바이트로 표현.
예시)
한글 '가'의 이진 표현을 구합니다.
한글 '가'의 2byte 표현. U+AC00은 1010 1100 0000 0000
이진 표현을 3바이트로 분할.
첫 번째 바이트는 앞에서부터 3개의 비트를 1로 설정하고,
나머지 5개의 비트는 한글 '가'의 이진 표현에서 가져옴.
두 번째와 세 번째 바이트는 앞에서부터 2개의 비트를 10으로 설정하고,
나머지 6개의 비트는 한글 '가'의 이진 표현에서 가져옴.
이진 표현을 16진수로 변환
1110 xxxx 10xx xxxx 10xx xxxx 형식
1010 1100 0000 0000
1110 1010 1011 0000 1000 0000 => 0xEABO80
* 인코딩
인코딩(Encoding)은 컴퓨터에서 문자나 기호를 컴퓨터가 이해할 수 있는 01과 1로 이루어진 이진데이터
바이트로 변환하는 방법이다. 문자를 이진 데이터로 변환하기 위해서는 어떤 문자가
어떤 이진 데이터로 대응되는지에 대한 규칙이 필요하며 이러한 규칙을 인코딩이라고 한다.
* 줄바꿈 코드
타자기에서 Return & Line Feed 를 하기 때문에.
windows 는 ODOA 가 나온다.
그러나 유닉스는 OA가 나온다.
* 변수란 ?
데이터를 임시보관하는 메모리 (RAM)
* JVM이 관리하는 메모리
로컬 변수는 함수 호출 시 생성되고 함수 실행 종료 시 소멸.
인스턴스 변수는 클래스의 인스턴스(객체) 생성 시 생성되고 객체의 수명과 함께 존재.
클래스의 코드는 메서드 영역에 위치하여 클래스가 실행될 때 공유.
* APP이 H/W를 사용하는 매커니즘
JAVA APP에서 System.out.println 으로 코드를 입력하면 JVM에서 OS (GUI API) 를 호출한다.
1. Java Virtual Machine (JVM)은 System.out 객체에 대한 참조를 유지한다.
System.out은 표준 출력 스트림을 나타냄.
2. System.out.println 메서드는 표준 출력 스트림으로 데이터를 전송.
3. JVM은 운영체제의 GUI API를 호출하여 표준 출력 데이터를 화면에 표시한다.
이는 운영체제가 제공하는 그래픽 인터페이스로 데이터를 전달하는 과정이다.
* 변수 선언 : 메모리에 값을 담을 수 있도록 메모리의 일정 영역을 확보하는 명령
int a ; <= 정수 값을 담을 4byte 를 확보하고 그 메모리의 이름을 'a'라고 하자.
Data type Variables(변수)
메모리용도 메모리이름
int : 정수 값을 담는 용도의 메몰이며 크기는 4byte 이다.
* 값의 할당 (assigment) : 할당 연산자 '=' 을 사용
L-value <- -> R-value
a = 100;
변수 할당연산자 값
L-value : 반드시 변수여야한다.
R-value : 리터럴,변수
* Data Type : Primitive Data Type (원시 데이터 타입)
메모리에 저장되는 것은 2진수이다. ( 이것은 인코딩 된 2진수이다.)
byte (1 byte)
정수 short (2 byte) : -32,768 ~ 32,768
int (4 byte)
long (8 byte)
char (2 byte) : 0 ~ 65,535
부동소수점 float (4 byte)
double (8 byte)
논리 boolean (4 byte or 1 byte)
배열
byte b = 100; 64 1byte
short s = 100; 00 64 2byte
int i = 100; 00 00 00 64 4byte
long l = 100; 00 00 00 00 00 00 00 64 8byte
char c = '가'; 0xAC00 AC 00 2byte
float f = 12.375f; 41 46 99 99 4byte
double dd = 12.375; 4D 28 C0 00 00 00 00 00 8byte
boolean bool = true ; 00 00 00 01 1byte