어떤 문제가 있고, 그것을 해결하는 방안으로 기술이 등장해왔다.

컴퓨터란 원래 직업을 지칭하는 단어였지만, 기계식 및 전자식 계산기의 등장으로 기계를 칭하는 언어로 바뀌었다.

1980년대의 컴퓨터언어는 C와 C++이 개발언어의 표준이었다. C언어는 절차지향 언어이므로, 프로젝트가 커지면 유지보수가 많이 어려워진다는 점과 메모리를 직접 관리(pointer)하는 기계와 밀착된 언어이기 때문에 CPU가 달라지는 환경에서는 이식이 잘 안되는 단점이 존재했다. 다양한 하드웨어의 형태가 등장하게 되는 미국의 1980년대 시기상황에 맞추어, CPU에 상관없이 돌아가게 '중간 단계'가 존재하는 자바가 등장했다.
C언어는 소스 코드를 기계어로 한 번에 컴파일된다.
Java는 소스 코드 -> Bytecode(.class) -> JVM -> 기계어의 컴파일 과정을 거친다.
Stack (스택): 메서드가 실행될 때 잠깐 사용되는 지역 변수, 매개변수, 그리고 무거운 객체를 찾아가기 위한 '참조 주소값(리모컨)'이 저장되는 가벼운 공간이다. 메서드 실행이 끝나면 할당되었던 메모리가 빠르게 자동 해제된다.
Heap (힙): new 키워드를 통해 동적으로 생성된 '실제 객체 데이터(TV 본체)'와 배열이 저장되는 거대한 메모리 공간으로, 스택과 다르게 스레드 종료 시 자동으로 해제되지 않으며, 객체들은 스택의 참조 주소값이 끊어질 때까지 이곳에 계속 남아있게 된다.
GC (Garbage Collector): 힙(Heap) 영역을 주기적으로 스캔하여, 스택에서 더 이상 주소값을 참조하지 않는(아무도 찾지 않는) 잉여 객체들을 찾아내 메모리를 안전하게 해제해 준다.

기본형(Primitive type) → 실제값 stack에 저장(boolean, char, 정수형)
참조형 → 실제값이 아닌 주소를 저장 Ex. 클래스, 배열, 인터페이스, 열거형(enum)
String은 문자열의 '연속'을 나타내주는 자료형으로, 자바에서는 불변 객체이다.
Heap 영역 안의 String Constant Pool에 저장된다
이미 존재하는 string 객체에 대해서는 새로 객체를 생성하지 않고, 동일한 heap 메모리 주소를 가리켜 메모리를 절약한다.
컴퓨터언어
→ 0과 1을 가지고 연산을 수행하는 컴퓨터와 통신하기 위한 언어이다.
자바
→ 1980년대 주로 사용하던 컴퓨터 언어인 C와 C++은 절차적 언어로 인해 코드가 길어지면 유지보수하는데 어려워지고 + 하드웨어(CPU)와 밀접하게 붙어서 움직이는 언어 특성상 CPU가 달라지면 실행되지 못하는 경우가 많았기 때문에, JVM 위에서 돌아가기에 어떤 실행환경에서도 잘 실행되는 자바가 등장했다.
플랫폼 독립성, 보안성, 메모리 관리, 객체지향
JDK(Java Development Kit)
→ JRE와 javac와 같은 자바 실행파일들을 묶어 통칭하는 단어, 자바의 바이트코드를 실행할 때 쓰인다
JRE(Java Runtime Enviroment)
→ JVM과 다른 여러 라이브러리를 포함하는 개념으로, 자바를 실행하기 위한 최소한의 환경을 말한다
바이트코드
→ 자바가 1차적으로 컴파일되어 만들어진 중간언어로, 이 bytecode가 JVM에 의해 기계어로 변환된다
GC
→ Heap에 저장된 메모리 주소들 중, 더 이상 참조되지 않는 메모리를 없애준다.
스택
→ 프로그램의 실행흐름(thread)들이 저장되는 공간으로, 빠르게 할당되고, 빠르게 해제되는 특징이 있다
힙
→ 참조되는 메모리 주소가 저장되는 곳으로, 참조가 끝나도 자동으로 해제되지 않고, GC가 해제해준다