자바의 탄생

  • 썬 마이크로시스템즈(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 존재

 

+ Recent posts