Java 기본
Java의 주요 특징
객체 지향 프로그래밍 (OOP)
Java는 거의 모든 것이 객체(Object)로 이루어져 있다. 이는 코드를 재사용하고 유지보수하기 쉽게 만들어주는 프로그래밍 방식임.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Java - 클래스 기반 객체 지향
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("안녕하세요, " + name + "입니다.");
}
}
플랫폼 독립성 (Write Once, Run Anywhere)
Java는 JVM(Java Virtual Machine)이라는 가상 머신 위에서 동작함. 따라서 개발자는 운영체제에 상관없이 Java 코드 한 번만 작성하면, JVM이 설치된 어떤 환경(Windows, macOS, Linux 등)에서든 동일하게 실행할 수 있다.
1
2
3
4
5
6
7
8
Java 소스코드 (.java)
↓ 컴파일
Java 바이트코드 (.class)
↓
┌─────────┬─────────┬─────────┐
│ Windows │ macOS │ Linux │
│ JVM │ JVM │ JVM │
└─────────┴─────────┴─────────┘
정적 타입 (Statically-Typed) 언어
Java는 변수를 선언할 때 반드시 타입(type)을 명시해야 함. 한번 정해진 타입은 바꿀 수 없다.
1
2
3
4
5
// Java - 정적 타입
int number = 10; // number는 int 타입
// number = "hello"; // 에러! 타입이 맞지 않음
String text = "hello"; // text는 String 타입
JavaScript 비교: JavaScript는 동적 타입 언어로, 변수의 타입이 런타임에 자유롭게 변경될 수 있음.
1
2
3
4
5
// JavaScript - 동적 타입
let data = 10; // number
data = "hello"; // string으로 변경 가능
data = true; // boolean으로 변경 가능
data = [1, 2, 3]; // array로 변경 가능
장단점 비교:
| ㅤ | Java (정적 타입) | JavaScript (동적 타입) |
|---|---|---|
| 장점 | - 컴파일 시 타입 오류 발견 - 코드 안정성 높음 - IDE 자동완성 강력 | - 코드 작성이 빠르고 유연 - 프로토타이핑에 유리 |
| 단점 | - 타입 선언이 번거로움 - 초기 학습 곡선 높음 | - 런타임 오류 가능성 - 대규모 프로젝트에서 유지보수 어려움 |
참고: 이러한 단점을 보완하기 위해 TypeScript가 나옴. TypeScript는 JavaScript에 정적 타입 시스템을 추가한 것으로, Java의 타입 안정성과 JavaScript의 유연성을 결합하려는 시도이다.
컴파일 언어 (Compiled Language)
Java 코드는 실행되기 전에 컴파일(compile) 과정을 거쳐 컴퓨터가 이해할 수 있는 바이트코드(bytecode) 파일(.class)로 변환된다. 이 과정에서 문법 오류 등을 미리 확인할 수 있다.
1
2
3
4
5
Java 개발 과정:
1. 코드 작성 (.java)
2. 컴파일 (javac) → 바이트코드 (.class) 생성
3. 실행 (java) → JVM이 바이트코드 실행
1
2
3
4
5
6
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
1
2
3
4
5
6
7
8
# 컴파일
$ javac HelloWorld.java
# → HelloWorld.class 파일 생성
# 실행
$ java HelloWorld
# → Hello, World! 출력
JavaScript 비교: JavaScript는 별도의 컴파일 과정 없이 코드를 한 줄씩 읽어 바로 실행하는 인터프리터(interpreter) 언어.
1
2
// JavaScript - 별도의 컴파일 과정 없음
console.log("Hello, World!"); // 바로 실행
참고: 현대 JavaScript 엔진(V8 등)은 내부적으로 JIT(Just-In-Time) 컴파일을 수행하여 성능을 최적화하지만, 개발자 입장에서는 컴파일 과정이 보이지 않음.
풍부한 표준 라이브러리 (API)
Java는 오랜 역사만큼이나 방대하고 검증된 표준 라이브러리를 제공. 날짜 처리, 네트워크 통신, 데이터베이스 연결, 파일 입출력 등 거의 모든 기능이 공식적으로 지원되어 안정적인 개발이 가능.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Java - 표준 라이브러리 예시
import java.time.LocalDate;
import java.util.ArrayList;
import java.io.File;
// 날짜 처리
LocalDate today = LocalDate.now();
// 리스트 자료구조
ArrayList<String> list = new ArrayList<>();
// 파일 처리
File file = new File("data.txt");
JavaScript 비교: JavaScript는 표준 라이브러리가 상대적으로 작고, 대부분의 기능을 npm 패키지에 의존한다.
1
2
3
4
// JavaScript - 주로 외부 패키지 사용
const express = require("express"); // npm 패키지
const moment = require("moment"); // npm 패키지
const fs = require("fs"); // Node.js 내장 모듈
강력한 멀티스레딩 지원
Java는 운영체제 수준의 멀티스레딩을 지원하여, 여러 작업을 동시에 처리할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
// Java - 멀티스레드 예시
Thread thread1 = new Thread(() -> {
System.out.println("작업 1 실행");
});
Thread thread2 = new Thread(() -> {
System.out.println("작업 2 실행");
});
thread1.start(); // 동시 실행
thread2.start(); // 동시 실행
JavaScript 비교: JavaScript는 싱글 스레드 기반이며, 비동기 처리를 이벤트 루프로 구현한다.
1
2
3
4
5
6
7
8
9
10
11
// JavaScript - 비동기 처리
async function task1() {
console.log("작업 1 실행");
}
async function task2() {
console.log("작업 2 실행");
}
// Promise.all로 동시 실행
Promise.all([task1(), task2()]);
Java와 JavaScript 비교
Java는 JavaScript와 이름은 비슷하지만 완전히 다른 언어.
핵심 차이점 요약
| 특징 | JavaScript | Java |
|---|---|---|
| 타입 시스템 | 동적 타입 | 정적 타입 |
| 실행 환경 | 브라우저, Node.js | JVM (Java Virtual Machine) |
| 컴파일 | 인터프리터 방식 | 컴파일 후 실행 |
| 클래스 | ES6+ 지원 (프로토타입 기반) | 처음부터 객체지향 (클래스 기반) |
| 용도 | 웹, 서버 | 서버, 안드로이드, 엔터프라이즈 |
JavaScript는 스크립트를 작성하면 바로 실행되지만, Java는 소스 코드를 컴파일하여 바이트코드로 변환한 후 JVM에서 실행된다.