1. JAVA 프로그래밍 언어

    1. 프로그래밍 언어(PL) : 프로그램 작성 언어

    일반적으로 컴파일러가 기계어 생성 → 목적 코드를 만든다

    (기계어는 플랫폼에 맞게 변환되어야 한다.)

    ⇒ C언어는 특정 플랫폼에서만 작동

    그러나, JAVA는 목적 코드 대신 바이트 코드 생성

    1. 개발 목적
    1. WORA (Write Once Run Anywhere)

    : 한번 작성된 코드는 모든 플랫폼에서 바로 실행

    시험 문제) 플랫폼 독립적인 것과 종속적인 것의 차이?

    → 자바는 플랫폼 독립적이므로 모든 플랫폼에서 바로 실행되므로 플랫폼의 호환성이 가능하다

    (운영 체제나 하드웨어에 상관없이 / 어느 클라이언트에서도 실행 가능)

    1. 바이트 코드

    → 자바는 목적 코드 대신 바이트 코드 생성

    1. JVM(Java Virtual Machine)

    : 자바 바이트 코드를 실행하는 자바 가상 기계(소프트웨어)

    → 오직 바이트 코드만 본다(바이트 코드로 프로그램 모두 실행)

    → 일종의 작은 운영체제

    1. 플랫폼 의존

    : 플랫폼(하드웨어 플랫폼 + 운영체제 플랫폼)

    작은 운영 체제인 JVM을 가져 어느 머신에서든 동작 가능, 실행 기능 동일 ⇒ 플랫폼 독립적

    JVM는 플랫폼마다 다르게 작성되어 배포 ⇒ 플랫폼 의존적/종속적

    cf) 플랫폼/프레임 워크/라이브러리

  2. C++과의 비교

    1. C++

    Preprocessing ← 매크로 확장(#define, #include 등 먼저 실행)

    Compile ← 문법 체크, 바이너리 코드 생성(기계어인 목적 코드)

    Linking ←링커가 파일을 정리하여 연결

    ⇒ 운영체제에 전달되어 모두 읽고 실행되어 빠르다 !

    ( 통째로 만든 후에 한번에 사용 , 메모리 사용량 많음 )

    1. JAVA

    .java를 .class로 변환 ← 바이트 코드 생성

    JVM은 main 함수를 찾아 파일 올림

    컴파일된 클래스 파일들이나 이를 하나로 압축한 jar 파일 형태로 배포

    ( jar - 클래스를 하나로 묶어 배포, 여러 개의 파일을 하나로 )

    ⇒ 팔요한 내용을 불러다 쓰고 필요 없는 것을 버리므로 느리다 !

    BUT, 기계가 보완해주어 어느 정도의 속도 향상

    ( 꺼내고 넣고를 반복하여 메모리 사용량 적음 )

  3. JDK (Java Development Kit)

    : 자바 개발자를 위한 상업용 소프트웨어

    → 자바 응용 개발 환경, 개발에 필요한 도구 포함, 클래스랑 라이브러리를 모두 가지고 있음

    자바 개발 도구 + JRE (Java Runtime Environment) (자바 실행 환경 ← 자바 API+JVM )

  4. JAVA 기본 규칙

    1. 클래스의 이름은 반드시 대문자로 작성 ex, Cmyclass

    2. 반드시 obj 클래스로부터 상속을 받아 만든다

    3. 여러 클래스 중 main 함수는 딱 하나이다

    (타 함수와 달리 main은 운영체제 혹은 JVM에 의해 호출 ← 값을 던진 상태로 호출 가능)

    시험문제_기말) static 멤버와 nonstatic멤버의 차이는?

  5. JAVA의 특징

    1. 플랫폼 독립성

    2. 객체 지향 → 상속성(부모가 가진 특징을 가짐), 다형성(함수 이름 중복 가능), 캡슐화

    3. 클래스로 캡슐화 → 클래스 안에서 새로운 클래스 작성 가능

    4. 가비지 컬렉션 → 포인터가 없는 것의 가장 큰 장점

    (동적할당에서의 포인터, 메모리를 아끼기 위해 메모리 해제도 해야하는 번거로움을 줄임)

    자바는 모두 포인터. 메모리가 JVM에 의해 자동으로 해제 → 실시간 응용 시스템에 부적합

    (가비지 컬렉터가 너무 많은 양을 처리해야할 경우 CPU를 너무 많이 써서 실시간 동작 불가능)

    1. 자바 프로그램은 안전 → 포인터의 개념이 없어 안정적이기에 프로그램이 죽지 않음

    2. 프로그램 작성 쉬움 → 다양하고 강력한 라이브러리 많음

    3. 목적 코드를 만드는 JLT 컴파일러 사용 → 범용성을 버릴 수 있다