1.1 프로그래밍 언어란?
컴퓨터가 이해할 수 있는 언어 : 기계어 (machine language)
- 0과 1로 이루어진 코드 => 사람이 이해하기 매우 어려움
- 사람이 사용하는 언어 => 컴퓨터 입장에서 보면 이해할 수 없는 문자 집합
"사람과 컴퓨터가 대화하기 위해서 사람의 언어와 기계어의 다리 역할을 하는 프로그래밍 언어 필요"
프로그래밍 언어는 둘로 나뉜다.
- 저급 언어
- 고급 언어
- 컴퓨터와 대화할 수 있도록 만든 언어 중 사람이 쉽게 이해할 수 있는 언어
- 고급언어로 작성된 소스는 컴퓨터가 바로 이해할 수 없음
-> 컴파일 (compile) 과정을 통해 컴퓨터가 이해할 수 있는 기계어로 변환 후 컴퓨터가 사용
일반적으로 프로그래밍 언어라고 하면 고급 언어를 말함.
EX) C, C++, Java
소스 (source) : 프로그래밍 언어들로 작성된 내용
컴파일러 (compiler) : 소스를 기계어로 변환하는 소프트웨어
프로그램(program) : 컴퓨터에서 특정 목적을 수행하기 위해 프로그래밍 언어로 작성된 소스를 기계어로 번역한 것
* 인터프리터 VS 컴파일러
- 인터프리터 : 소스코드에서 한문장을 읽은 후 기계어로 번역하여 바로 실행
- 컴파일러 : 소스코드 전체를 기계어로 번역 후 실행
1.2 자바란?
1.2.1 자바 소개
- 1995년도에 처음 썬 마이크로 시스템즈 (Sun Microsystems)에서 발표한 언어
- 현재까지 성공한 프로그래밍 언어로서 전세계적으로 다양한 분야에서 사용되고 있음 - 1991년 썬의 엔지니어들에 의해 고안된 오크(Oak) 라는 언어에서 시작
- 처음에는 가전 제품에서 사용될 목적
- 인터넷의 등장과 함께 인터넷에서 실행되는 프로그래밍 언어로 사용, 이름도 자바로 변경 - 1995년 - 1999년 -> 윈도우 (Windows) 프로그램 개발이 주류
- C++ 에 비해 열세
-> 메모리 및 CPU를 지나치게 많이 사용하기 때문에 윈도우 프로그래밍 언어로 부적합하다는 문제점 - 1999년도~ -> 인터넷 활성화
- 웹 애플리케이션 구축용 언어로 자바 급부상
=> 자바는 다양한 서버 운영체제에서 단 한번의 작성으로 모든 곳에서 실행 가능한 언어이기 때문
초기 자바 : 가전 제품에 탑재할 프로그래밍 언어로 개발되었음
현재 : 애플리케이션 및 서버 애플리케이션을 개발하는 중추적인 언어로 사용
1.2.2 자바의 특징
이식성이 높은 언어
이식성 : 서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것을 말함
EX) MS 윈도우 (Microsoft Windows)에서 실행하는 프로그램
- 리눅스 또는 유닉스에서 실행할 수 있음 => 이식성이 높음
실행할 수 없음 => 이식성이 낮음
대부분의 프로그램
: MS 윈도우 환경에 최적화 -> 다른 환경에서 실행하기 위해 프로그램 소스 파일 수정 후 재컴파일 과정 필요
자바언어로 개발된 프로그램
: WORA (Write Once, Run Anyway)
: 자바 실행 환경 (JRE : Java Runtime Environment) 이 설치되어 있는 모든 운영체제에서 실행 가능
-> 소스파일 수정 필요X
객체 지향 언어
객체 지향 프로그래밍 (OOP : Object Oriented Programming)
: 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 프로그램 개발 기법
객체 지향 언어
: 객체 지향 프로그래밍에 사용되는 언어
자바 -> 100% 객체 지향 언어
- 객체를 만들기 위해 설계도인 클래스를 작성
- 객체와 객체를 연결하여 목적에 맞는 프로그램을 만들어 냄
- 캡슐화, 상속, 다형성 기능을 완벽하게 지원
함수적 스타일 코딩 지원
객체 지향 프로그래밍이 나오기 전 부터 함수적 프로그래밍 언어(EX Lisp, Scheme)가 있었음
But, 학계를 제외하고 현업에서는 큰 호응을 얻지 못함
최근 들어 함수적 프로그래밍이 다시 부각되고 있음
대용량 데이터의 병렬 처리, 이벤트 지향 프로그래밍에 적합
함수적 프로그래밍을 위해 람다식 (Lambda Expressions)를 Java 8부터 지원
- 컬렉션의 요소를 필터링, 매핑, 집계 처리하는데 쉬워지고, 코드가 매우 간결해 짐
메모리 자동 관리
C++ : 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 함
- 이 작업을 성실하게 해주지 않으면 프로그램이 불완전해지고 갑자기 다운되는 현상을 겪게 됨
Java : 개발자가 직접 메모리에 접근할 수 없도록 설계되었으며, 메모리는 자바가 직접 관리
- 객체 생성시 자동적으로 메모리 영역을 찾아서 할당
- 사용이 완료되면 쓰레기 수집기 (Garbage Collector)를 실행시켜 자동적으로 사용하지 않는 객체를 제거시켜 줌
"개발자는 메모리 관리의 수고스러움을 덜고, 핵심 기능 코드 작성에 집중할 수 있음"
다양한 애플리케이션 개발
다양한 운영체제 (OS : Operating System) (윈도우, 리눅스, 유닉스, 맥 등)에서 실행되는 프로그램을 개발 할 수 있음
단순한 콘솔 프로그램, 클라이언트용 윈도우 애플리케이션, 서버용 웹 애프리케이션, 모바일용 안드로이드 앱 등
거의 모든 곳에서 실행되는 프로그램을 개발할 수 있음
* 자바는 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션 (Edition) 형태로 정의하고 있음
Java SE (Standard Edition) - 기본 에디션
Java SE 는 자바 프로그램들이 공통적으로 사용하는 자바 가상 기계 (JVM : Java Virtual Machine)를 비롯해서 자바 프로그램 개발에 필수적인 도구와 라이브러리 API를 정의한다. 클라이언트와 서버 프로그램에 상관없이 자바 프로그램을 개발하고 실행하기 위해서는 반드시 Java SE 구현체인 자바 개발 키트 (JDK : Java Devlopment Kit)를 설치해야 한다.
* 참조 : JVM ⊂ JRE ⊂ JDK
Java EE (Enterprise Edition) - 서버 애플리케이션 개발 에디션
Java EE는 분산 환경 (네트워크, 인터넷)에서 서버용 애플리케이션을 개발하기 위한 도구 및 라이브러리 API를 정의한다. 서버용 애플리케이션으로는 Servlet/JSP를 이용한 웹 애플리케이션, 분산 처리 컴포넌트인 EJB (Enterprise Java Bean) 그리고 XML 웹 서비스 (Web Services) 등이 있다.
쉬운 멀티 스레드 (Multi-Thread) 구현
하나의 프로그램이 동시에 여러 작업 처리 + 대용량 작업 빠르게 처리 (서브 작업으로 분리 후 병렬처리)
=> 멀티 스레드 프로그래밍 필요
운영체제에 따라 멀티 스레드를 구현하는 방법 달라
But, 자바는 스레드 생성 및 제어와 관련된 라이브러리 API 제공 -> 운영체제에 상관없이 멀티 스레드를 쉽게 구현 가능
동적 로딩 (Dynamic Loading) 지원
자바 애플리케이션 -> 여러개의 객체가 서로 연결되어 실행 (객체는 클래스로부터 생성 됨)
애프리케이션이 실행될 때 객체가 생성 X -> 객체가 필요한 시점에 클래스를 동적로딩하여 객체 생성
개발 완료 후 유지보수(수정)가 발생하더라도 해당 클래스만 수정
전체 애플리케이션을 다시 컴파일할 필요가 없음
=> 유지보수를 쉽고 빠르게 진행할 수 있음
오픈소스 라이브러리
자바 -> 오픈소스 (Open Source) 언어
=> 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스 多
고급 기능을 구현하는 코드 직접 작성 -> 시간+노력 필요, 실행 안전성 보장X
검증된 오픈소스 라이브러리 사용 -> 개발 기간 단축 + 안전성 높은 애플리케이션 쉽게 개발 가능
막강하고 풍부한 자바 오픈소스 라이브러리가 많은 회사들이 자바를 선택하는 이유 중의 하나임