자바의 탄생
- 썬 마이크로시스템즈(Sun Microsystems)에서 제임스 고슬링(James Gosling)이 고안
- 가전제품에서 사용할 목적으로 만들었지만, 인터넷과 웹의 출현으로 인터넷을 목적으로 개발
- 제임스 고슬링의 목표 : Write Once, Run Anywhere(한 번 쓰고 어느 곳에서도 실행)
자바의 특징
- 객체지향 언어
- 객체들을 먼저 만들고, 하나씩 조립, 연결해서 전체 프로그램 완성
- 객체를 만들기 전, 클래스 작성
- 캡슐화, 상속성, 다형성
- 높은 이식성, OS에 독립적
- 서로 다른 실행환경에서 프로그램을 옮겨 실행 가능
- 자바 실행환경(JRE)이 설치되어 있는 모든 운영체제에서 실행 가능

- 인터프리터 언어
- C언어는 컴파일 언어 // C -> 컴파일 -> machine code
- Javascript는 인터프리터 언어 // 소스코드 -> (js)엔진 -> 중간코드 생성 -> 한줄씩 machine code
- 자바 = 컴파일 언어 + 인터프리터 언어
- ex. Student.java - 컴파일(javac.exe Student.java) - Student.class(byte code)
- interpret(java.exe) Student 실행 - JVM 기동
- 1. class loader 호출
- 2. class file 검사 + 악성코드 check
- 3. main() 호출 // 없으면 Main method not found

- 메모리 자동 관리
- 개발자가 직접 메모리 접근이 불가능하고, 자바가 메모리 직접 관리
- 객체 생성 시 자동으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 가비지 컬렉터(Garbage Colletor)를 실행시켜 자동으로 사용하지 않는 객체를 제거한다.
- 높은 안정성
- 쉬운 멀티 스레드 구현
- 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하기 때문에 운영체제와 상관없이 멀티 스레드를 쉽게 구현 가능하다.
- 동적 로딩(Dynamic Loading) 지원
- 실행시 모든 클래스 로딩이 아닌, 필요한 시점에 클래스를 로딩할 수 있는 장점
- 메모리의 효율적인 사용과 속도를 위해 필요한 클래스를 동적 로딩
- 분산 환경 지원
- TCP/IP 라이브러리가 포함되어 있다.
- http, http 프로토콜을 지원한다.
- 풍부한 오픈소스 라이브러리
- 자바는 오픈소스(Open source) 언어이고, 사용하는 라이브러리나 오픈소스의 양이 당야하다.
JRE(Java Runtime Environment) 자바 실행 환경
- Java class Library + JVM
JDK(Java Developement Kit) 자바 개발 도구
- 유틸리티(개발 도구)
- JRE + utility
- JDK 1.1 -> JDK -> 1.2 -> ... -> JDK 1.5(Java5) -> Java6 -> ... -> 자주 사용되는 Java 8과 Java 11
- 점점 함수형 언어 관련 기능 업데이트 중
Java 8
- 2014년 Java SE 8 업데이트1.
- 1.람다 표현식(lambda expression) : 함수형 프로그래밍
- 2.스트림 API(Stream API) : 데이터의 추상화
- 3.java.time 패키지 : Joda-Time을 이용한 새로운 날짜와 시간 API
- 4.나즈혼(Nashorn) : 자바스크립트의 새로운 엔진, 성능과 메모리 관리 면에서 개선
람다 표현식(labmda expression)
- 메소드를 하나의 식으로 표현
- 식별자 없이 실행 가능한 함수 표현식 -> 익명 함수(anonymous function)
- 클래스와 객체를 생성하지 않아도 메소드 사용 가능
- 코드의 가독성을 높여준다.
new Thread(new Runnable() {
public void run() {
System.out.println("전통적인 방식의 일회용 스레드 생성");
}
}).start();
new Thread(()->{
System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();
스트림 API(Stream API)
- 자바에서 많은 양의 데이터 저장에 배열, 컬렉션 사용
- 배열, 컬렉션 등에 접근하기 위해 반복문이나 반복자(iterator) 사용
- 가독성과 재사용성 단점, 정형화된 패턴 부재로 데이터마다 다른 방법으로 접근해야 한다는 단점
- 스트림 API는 데이터를 추상화하여 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법 제공
String[] arr = new String[]{"넷", "둘", "셋", "하나"};
// 배열에서 스트림 생성
Stream<String> stream1 = Arrays.stream(arr);
stream1.forEach(e -> System.out.print(e + " "));
System.out.println();
// 배열의 특정 부분만을 이용한 스트림 생성
Stream<String> stream2 = Arrays.stream(arr, 1, 3);
stream2.forEach(e -> System.out.print(e + " "));
java.time 패키지
- JDK 1.1부터 Calendar 클래스 제공. 하지만 문제점이 존재
- Calendar 인스턴스는 불변 객체가 아니라서 값이 수정될 수 있는 단점
- 윤초(leap second)와 같은 특별 상황 고려X
call by value VS call by reference
- call by value : 값에 의한 호출
- 함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달한다.
- call by reference : 참조에 의한 호출
- 인자로 전달되는 변수의 래퍼런스를 전달
- 자바는 call by value으로 값을 넘긴다.
- reference type의 경우에는 해당 객체의 주소 값을 복사하여 사용한다.
Java Naming rule
- Class Name : Parscal notation 사용
- ex. SampleProject
- Source code Name : (public) class 이름을 따서 만든다.
- 하나의 java 파일 안에 여러 class가 나올 수 있다. -> public class는 1개
변수의 종류
- 1. 기본형(primitive type) 변수
- 실제 연산에 사용되는 변수
- 자바에서 기본으로 제공해주는 타입들
- 정수형, 실수형, 문자형, 논리형

- 2. 참조형(reference type) 변수
- primitive 변수를 이용해서 사용자가 직접 만들어 사용하는 변수
- 클래스, 인터페이스, 배열, 열거 타입
- 빈 객체를 의미하는 null 존재

'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 상수(constant), final, String 생성방식(StringBuffer, StringBuilder) (1) | 2022.10.03 |
---|---|
[Java] 자바 프로그램 실행 과정, JVM, 가비지 컬렉터(GC) (2) | 2022.10.03 |
[Java] 접근 제어자, 래퍼 클래스, 제너릭, 컬렉션, 스트림, 람다식, Optional (0) | 2022.10.02 |
[Java] JDBC(Java Database Connectivity), Connection pool (0) | 2022.07.21 |
[Java] 스레드 상태 제어 - sleep, join, yield, interrupt (0) | 2022.07.17 |