JAVA 프로그래밍 언어
일반적으로 컴파일러가 기계어 생성 → 목적 코드를 만든다
(기계어는 플랫폼에 맞게 변환되어야 한다.)
⇒ C언어는 특정 플랫폼에서만 작동
그러나, JAVA는 목적 코드 대신 바이트 코드 생성
플랫폼 독립적인 언어 개발 ← 플랫폼 호환성 해결
= 목적 코드를 만들지 않겠다
(Why? 목적 코드는 플랫폼 마다 다르며 컴파일 과정이 필수)
웹에 최적화된 프로그램 언어의 필요성 대두
메모리 사용량이 적고 다양한 플랫폼을 가지는 가전 제품에 적용
: 한번 작성된 코드는 모든 플랫폼에서 바로 실행
시험 문제) 플랫폼 독립적인 것과 종속적인 것의 차이?
→ 자바는 플랫폼 독립적이므로 모든 플랫폼에서 바로 실행되므로 플랫폼의 호환성이 가능하다
(운영 체제나 하드웨어에 상관없이 / 어느 클라이언트에서도 실행 가능)
→ 자바는 목적 코드 대신 바이트 코드 생성
: 자바 바이트 코드를 실행하는 자바 가상 기계(소프트웨어)
→ 오직 바이트 코드만 본다(바이트 코드로 프로그램 모두 실행)
→ 일종의 작은 운영체제
: 플랫폼(하드웨어 플랫폼 + 운영체제 플랫폼)
작은 운영 체제인 JVM을 가져 어느 머신에서든 동작 가능, 실행 기능 동일 ⇒ 플랫폼 독립적
JVM는 플랫폼마다 다르게 작성되어 배포 ⇒ 플랫폼 의존적/종속적
cf) 플랫폼/프레임 워크/라이브러리
플랫폼 - 동작할 수 있다
프레임 워크 - 함수와 개발의 편의성을 포함한 개발 환경,
라이브러리 조작을 더 쉽도록 도움
라이브러리 - 함수들만 가진다
C++과의 비교
Preprocessing ← 매크로 확장(#define, #include 등 먼저 실행)
Compile ← 문법 체크, 바이너리 코드 생성(기계어인 목적 코드)
Linking ←링커가 파일을 정리하여 연결
⇒ 운영체제에 전달되어 모두 읽고 실행되어 빠르다 !
( 통째로 만든 후에 한번에 사용 , 메모리 사용량 많음 )
.java를 .class로 변환 ← 바이트 코드 생성
JVM은 main 함수를 찾아 파일 올림
컴파일된 클래스 파일들이나 이를 하나로 압축한 jar 파일 형태로 배포
( jar - 클래스를 하나로 묶어 배포, 여러 개의 파일을 하나로 )
⇒ 팔요한 내용을 불러다 쓰고 필요 없는 것을 버리므로 느리다 !
BUT, 기계가 보완해주어 어느 정도의 속도 향상
( 꺼내고 넣고를 반복하여 메모리 사용량 적음 )
JDK (Java Development Kit)
: 자바 개발자를 위한 상업용 소프트웨어
→ 자바 응용 개발 환경, 개발에 필요한 도구 포함, 클래스랑 라이브러리를 모두 가지고 있음
자바 개발 도구 + JRE (Java Runtime Environment) (자바 실행 환경 ← 자바 API+JVM )
JAVA 기본 규칙
클래스의 이름은 반드시 대문자로 작성 ex, Cmyclass
반드시 obj 클래스로부터 상속을 받아 만든다
여러 클래스 중 main 함수는 딱 하나이다
(타 함수와 달리 main은 운영체제 혹은 JVM에 의해 호출 ← 값을 던진 상태로 호출 가능)
시험문제_기말) static 멤버와 nonstatic멤버의 차이는?
JAVA의 특징
플랫폼 독립성
객체 지향 → 상속성(부모가 가진 특징을 가짐), 다형성(함수 이름 중복 가능), 캡슐화
클래스로 캡슐화 → 클래스 안에서 새로운 클래스 작성 가능
가비지 컬렉션 → 포인터가 없는 것의 가장 큰 장점
(동적할당에서의 포인터, 메모리를 아끼기 위해 메모리 해제도 해야하는 번거로움을 줄임)
자바는 모두 포인터. 메모리가 JVM에 의해 자동으로 해제 → 실시간 응용 시스템에 부적합
(가비지 컬렉터가 너무 많은 양을 처리해야할 경우 CPU를 너무 많이 써서 실시간 동작 불가능)
자바 프로그램은 안전 → 포인터의 개념이 없어 안정적이기에 프로그램이 죽지 않음
프로그램 작성 쉬움 → 다양하고 강력한 라이브러리 많음
목적 코드를 만드는 JLT 컴파일러 사용 → 범용성을 버릴 수 있다