본문 바로가기

개발기술/프론트엔드

Java, Javascript, Python 비교

1. 실행환경

  1. 설치 및 구성
    • Java:  코드를 작성한 뒤Java Compiler (javac)가 바이트코드로 컴파일되어 JVM (Java Virtual Machine) 에서 플랫폼 독립적으로 실행 가능. 때문에 JDK를 반드시 설치해야 함. JVM 위에서 실행되기 때문에 런타임 오버헤드가 있음.
    • JavaScript: 웹 브라우저에 이미 엔진이 내장되어 있어, 별도 설치 없이 사용 가능. 서버나 CLI 용도로 Node.js 설치 가능
    • Python: 공식 사이트나 패키지 관리자(Conda, pip 등)를 통해 인터프리터를 설치하면 끝
    • C/C++ : C/C++ Compiler가 코드를 기계어 코드로 컴파일되어 플랫폼에 의존적입니다. 네이티브 코드로 컴파일되어 실행되므로 일반적으로 Java보다 빠름.  저수준 메모리 및 하드웨어 접근이 가능해 성능 최적화에 유리.

2. 보충 설명 (타입 시스템, 패러다임, 목적, 멀티스레딩 등)

  java javascript python
타입 시스템 정적 타입
(컴파일 시 타입 검사)
동적 타입
(런타임에 타입 결정)
동적 타입
(런타임에 타입 결정)
기반 패러다임 객체지향(OOP) 중심, 함수형 일부 지원
멀티스레딩 및 동시성 프로그래밍 지원
프로토타입 기반 객체지향
이벤트 기반 비동기 처리
(Node.js의 이벤트 루프)
객체지향(OOP) + 함수형 모두 지원
스크립트 언어로 빠른 개발 가능
주요 목적 엔터프라이즈, 모바일(Android),
대규모 서버·백엔드 시스템
웹(프론트엔드/백엔드), SPA,
실시간 애플리케이션, 크로스플랫폼 모바일/데스크톱(프레임워크 이용 시)
데이터 분석, AI/머신러닝, 웹 백엔드,
자동화 스크립트, 교육 등 범용
멀티스레딩
/ 병렬
- 내장 멀티스레딩 지원
(Thread, Executor 등)
- 대규모 병렬 처리에 적합
- 싱글 스레드 기반
- Node.js의 비동기 I/O, 이벤트 루프로 고성능 실시간 처리
- 웹 워커로 일부 병렬
- 멀티스레드 지원 (threading)
- GIL(Global Interpreter Lock) 존재
- CPU 바운드 연산은 멀티프로세싱 활용

간단 설명

  1. 타입 시스템
    • Java정적 타입 언어로 컴파일 시점에 타입을 검사해 오류를 조기에 발견
    • JavaScriptPython동적 타입 언어로 런타임에 유연하게 타입 결정, 자유로운 코딩 스타일
  2. 기반 패러다임
    • Java: 전통적인 객체지향(OOP) 언어이며, 멀티스레딩 API를 풍부하게 제공
    • JavaScript: 프로토타입을 이용한 객체지향과 이벤트 루프 기반의 비동기 처리가 특징
    • Python: 간결한 문법의 OOP + 함수형 패러다임 일부 지원, 스크립트 작업에 매우 편리
  3. 주요 목적
    • Java: 대규모 엔터프라이즈 환경(금융, 서버, 안드로이드 앱 등)에 주로 사용
    • JavaScript: 웹 브라우저서버(Node.js) 양쪽에서 동작, 동적 웹 개발과 실시간 애플리케이션에 적합
    • Python: 데이터 분석/AI부터 웹 서버, 교육, 자동화 스크립트 등 범용적으로 사용 가능
  4. 멀티스레딩 / 병렬 처리
    • Java: 언어 레벨에서 멀티스레딩을 강력히 지원, 고성능 서버 개발에 유리
    • JavaScript: 기본적으로 싱글 스레드이지만, 비동기 이벤트 루프로 실시간 처리가 빠름. 웹 워커로 병렬성 일부 보완
    • Python: GIL로 인해 멀티스레드 병렬 처리에는 제약이 있으나, 멀티프로세싱이나 asyncio 등을 활용해 병렬/비동기 처리 가능

 

컴파일러 규약

 

객체지향 강제 (Class-based 강제 구조)

  • "Java는 클래스 강제 구조, 객체지향 중심 언어"
  • 대표: Java, C#
  • 특징:
    • 프로그램의 모든 것은 클래스(혹은 객체) 안에 있어야 함.
    • 파일 = 클래스 구조 (파일 이름과 클래스 이름 반드시 같아야 함)
    • 대규모 프로그램, 기업용 시스템을 위해 클래스 단위, 파일 간 유기적 관계, 명확한 진입점(main)을 전제로 설계된 언어
    • 정적 타입, 컴파일 타임 검증,
  • 개념: "세상은 객체다. 프로그램을 설계하려면 반드시 클래스로 추상화해서 객체를 만들어라."

 

모듈 기반 (느슨하고 자유로운 구조)

  • "Python, JavaScript는 느슨하고 모듈 기반, 스크립트 스타일"
  • 대표: Python, JavaScript, Ruby
  • 특징:
    • 하나의 파일(=모듈)에 함수, 변수, 객체, 클래스 무엇이든 넣을 수 있음.
    • OOP도 가능하지만 함수형도 가능하고, 스크립트처럼 위에서부터 순차 실행도 가능
    • 파일 단위로 순차 실행되는 독립 스크립트로 설계된 언어.  필요하면 여러 파일을 import해서 결합. 필요한 경우 프레임워크에서 진입점(스타터)을 설계
    • 런타임 동적 타입, 훨씬 유연
  • 개념: "모듈(파일)은 필요한 기능을 담는 상자다. 그 안에 함수도, 클래스도, 상수도 마음대로 넣자."

함수가 일급 객체(first-class functions)

Javascript와 python에서는 함수가 일급객체로 동작하는 반면, Java에서는 함수형인터페이스와 람다식으로 이를 유사하게 구현한다. 

  • 일급 객체(First-class citizen, First-class object)란?
    • 그 언어의 다른 일반 값들과 동일하게 취급되는 객체를 말합니다.
      • 변수에 할당할 수 있고
      • 함수의 인자(파라미터) 로 넘길 수 있고
      • 함수의 리턴 값 으로 돌려줄 수 있는 것
    • 함수가 다른 값(숫자, 문자열, 객체 등)과 똑같이 다뤄진다 는 뜻입니다.
      • 변수에 담을 수 있고
      • 함수에 인자로 넘길 수 있고
      • 함수에서 함수 자체를 반환할 수 있습니다.

변수에 할당

const sayHi = function() { console.log("Hi"); };
sayHi(); // Hi​

함수의 인자로 전달

function greet(callback) {
    callback();
}
greet(sayHi); // Hi

함수에서 반환

function makeMultiplier(x) {
    return function(y) {
        return x * y;
    }
}
const double = makeMultiplier(2);
console.log(double(5)); // 10​

 

"함수가 일급 객체라는 것은, 함수도 값처럼 자유롭게 다루어질 수 있다는 뜻이다."

이 덕분에

  • 콜백 함수,
  • 고차 함수 (함수를 반환하거나 함수를 받는 함수)
  • 함수형 프로그래밍(map, reduce, filter) 

콜백 함수 (Callback Function)

  콜백 함수는 “일등급 함수의 함수 인자 전달 기능”을 이용해, 실행 책임을 다른 함수에게 위임하는 프로그래밍 패턴 이에요. “언제 호출될지 제어권이 나에게 있지 않고, 전달받은 쪽(다른 함수, 라이브러리, 시스템)이 필요한 순간에 호출하는 것” 이걸 강조하는 용어.

 

람다와 함수형 인터페이스

  Java에서는 람다와 함수형 인터페이스를 이렇게 사용하면 자연스럽게 콜백 패턴을 구현하게 됩니다.

public class Main {
    public static void main(String[] args) {
        executeTwice(() -> System.out.println("Hello!"));
    }

    public static void executeTwice(Runnable action) {
        action.run(); // 여기서 실행
        action.run();
    }
}

 

강타입과 동적타입

 

Java : 단순히 dom에서 받은 element라고해서 src를 갖는 것이 아니기때문에 setSrc라는 메소드를 쓰려면 downcasting이 필요

Element element = getElementById("someImg");
element.setSrc("...");  // ❌ compile error

if (element instanceof HTMLImageElement) {
((HTMLImageElement) element).setSrc("...");
}

 

javascript, python : dom에서 받은 element는 특정 타입없이 변수로 저장되고 변수의 method를 런타임에 찾아서 실행함. 

const el = document.querySelector("img");
console.log(el.src);  // 정상 작동

 

typescript : javascript가 런타임 에러 발생이 많아서 java의 type개념을 적용시킨 것.

'개발기술 > 프론트엔드' 카테고리의 다른 글

프론트엔드 환경설정 및 배포  (0) 2025.03.24
웹 브라우저 API  (0) 2025.02.26
백엔드 개발자와 프론트 엔드 이해도  (0) 2025.02.12
톰캣 설치를 통한 JSP 사용법  (1) 2024.07.01
HTML, CSS  (1) 2024.06.09