MODE::CREATIVE

[JAVA]Java 언어의 특징과 구조 본문

JAVA

[JAVA]Java 언어의 특징과 구조

LEE MINGYU 2024. 11. 10. 16:17

1. 컴퓨터와 소프트웨어 기본 이해

1-1. 컴퓨터의 종류

컴퓨터는 여러 형태로 발전해 왔으며, 주요 형태로는 메인프레임, 개인용 컴퓨터(PC), 태블릿, 스마트폰, 원칩 컴퓨터 등이 있습니다. 각 컴퓨터 유형은 크기와 성능이 다르며, 다양한 목적에 맞게 설계됩니다. 메인프레임은 대규모 데이터 처리에 사용되고, PC와 스마트폰은 일상생활에서 널리 사용되며, 원칩 컴퓨터는 소형 가전제품이나 내장형 시스템에서 활용됩니다.

1-2. 소프트웨어의 역할

소프트웨어는 컴퓨터가 특정 작업을 수행할 수 있도록 지시하는 프로그램이나 애플리케이션입니다. 소프트웨어는 하드웨어와 상호작용하며, 사용자에게 필요한 기능을 제공하는 중요한 역할을 합니다. 컴퓨터에서 사용되는 다양한 소프트웨어들은 운영체제(OS), 응용 프로그램, 임베디드 소프트웨어로 분류되며, 각각 하드웨어를 제어하거나 사용자가 원하는 작업을 수행하도록 도와줍니다.

1-3. 프로그래밍 언어의 이해

컴퓨터는 기계어(0과 1로 이루어진 이진 코드)만을 이해합니다. 이러한 기계어로 직접 프로그래밍하는 것은 어려움이 많아, 어셈블리어고급 언어가 개발되었습니다.

  • 기계어: 컴퓨터의 CPU가 직접 이해하고 처리할 수 있는 언어입니다.
  • 어셈블리어: 기계어 명령을 사람이 이해하기 쉬운 상징적 기호로 표현한 언어입니다.
  • 고급 언어: 사람이 읽고 쓰기 쉬운 언어로, Java, C/C++, Python 등이 여기에 포함됩니다. 고급 언어는 컴파일러나 인터프리터에 의해 기계어로 변환되어 실행됩니다.

이와 같은 발전을 통해 프로그래밍이 훨씬 용이해졌으며, Java 같은 언어는 플랫폼 독립성과 객체 지향 프로그래밍 지원을 통해 현대 소프트웨어 개발의 필수적인 도구로 자리 잡았습니다.


2. Java 언어의 탄생과 특징

2-1. Java의 탄생 배경과 목적

1991년, 제임스 고슬링을 비롯한 개발자들은 선마이크로시스템즈의 ‘그린 프로젝트(Green Project)’에서 Java 언어를 처음 설계했습니다. 가전 제품에서 실행될 소프트웨어가 필요했고, 다양한 디바이스 간 호환이 가능한 언어가 요구되었습니다. 이러한 필요성을 반영해 Java는 모든 플랫폼에서 실행할 수 있도록 설계된 플랫폼 독립적인 언어로 탄생하게 됩니다. 이 과정에서 고슬링은 "오크(OAK)"라는 이름으로 초기 버전을 개발했으며, 이후 1995년 Java라는 이름으로 공식 발표되었습니다.

Java는 기존 언어가 가진 플랫폼 종속성 문제를 해결하기 위해 만들어졌습니다. C나 C++ 같은 언어로 작성된 프로그램은 특정 플랫폼에서만 동작하기 때문에, PC에서 작성한 프로그램을 다른 환경에서 사용하려면 코드의 재작성이나 추가적인 컴파일 작업이 필요했습니다. Java는 이러한 한계를 극복하고 모든 플랫폼에서 동작하는 네트워크 및 웹 친화적인 언어로 자리 잡게 되었습니다.

2-2. WORA(Write Once, Run Anywhere)의 실현

Java의 가장 큰 특징 중 하나는 WORA(Write Once, Run Anywhere), 즉 한 번 작성된 코드를 모든 플랫폼에서 실행할 수 있다는 점입니다. 이는 다음과 같은 Java의 두 가지 주요 구성 요소 덕분에 가능해졌습니다.

  • 바이트 코드(Bytecode): Java로 작성된 코드를 컴파일하면 CPU에 종속적이지 않은 중립적인 바이트 코드가 생성됩니다. 이 바이트 코드는 모든 플랫폼에서 동일하게 실행됩니다.
  • JVM(Java Virtual Machine): JVM은 Java 바이트 코드를 해당 운영체제와 하드웨어가 이해할 수 있도록 변환해주는 가상 기계입니다. JVM은 운영체제마다 별도로 제공되며, 플랫폼에 관계없이 동일한 Java 프로그램이 동일한 방식으로 실행될 수 있도록 합니다.
    c/c++의 경우 다른 플랫폼에서 실행하기 위하여 코드를 재작성해야한다
    JVM위에서 실행되는 자바의 경우 코드를 재작성할 필요가 없다

3. Java 컴파일과 실행 과정

3-1. Java 컴파일 과정

Java의 컴파일 과정은 C/C++와 같은 언어와는 다른 방식으로 이루어집니다. Java 소스 파일(.java)을 작성한 뒤 **컴파일러(javac)**를 사용해 컴파일하면, 컴퓨터가 이해할 수 있는 기계어가 아닌, 바이트 코드(.class 파일)로 변환됩니다. 이 바이트 코드는 특정 플랫폼에 종속되지 않기 때문에, 다양한 환경에서 호환성을 유지할 수 있습니다.

이후 바이트 코드는 JVM에 의해 실행되며, JVM은 플랫폼에 맞는 기계어로 바이트 코드를 해석하여 컴퓨터가 코드를 실행할 수 있도록 합니다. Java가 플랫폼 독립적인 언어로 인정받는 이유는 바로 이 구조 덕분입니다.

3-2. JVM의 역할

JVM(Java Virtual Machine)은 Java 바이트 코드를 해석하고 실행하는 가상 기계입니다. 바이트 코드가 플랫폼에 종속되지 않게 해주지만, JVM 자체는 특정 플랫폼에 종속적입니다. 즉, Windows, Mac, Linux 등 각기 다른 운영체제에 맞는 JVM이 별도로 존재하며, Java 코드를 실행할 때 이 JVM을 통해 코드가 해당 플랫폼에서 원활하게 동작하게 됩니다.

4. Java 개발 환경과 도구

4-1. Java 개발 환경(JDK)

Java로 개발하기 위해서는 JDK(Java Development Kit)가 필요합니다. JDK는 Java 프로그램을 작성하고 컴파일하며 실행할 수 있도록 해주는 기본적인 개발 환경으로, 여러 가지 개발 도구를 포함하고 있습니다. JDK의 주요 구성 요소는 다음과 같습니다.

  • javac: Java 소스를 바이트 코드로 변환하는 컴파일러입니다.
  • java: 컴파일된 Java 프로그램을 실행하는 도구로, JVM을 작동시켜 프로그램을 실행합니다.
  • javadoc: Java 소스 코드에서 문서화된 API를 HTML 형식으로 생성해주는 도구입니다.
  • jar: Java 클래스를 압축하여 배포할 수 있는 아카이브 파일(.jar)을 생성하고 관리하는 도구입니다.
  • jdb: Java 프로그램의 디버깅을 돕는 디버거 도구입니다.

JDK는 오라클의 Java 사이트에서 무료로 다운로드할 수 있으며, 프로그램 개발에 필요한 각종 모듈 파일, 샘플, API 클래스를 포함하고 있습니다.

4-2. Java 실행 환경(JRE)

JRE(Java Runtime Environment)는 Java로 개발된 응용 프로그램을 실행하기 위한 환경으로, JVM을 포함하고 있습니다. JRE는 Java 프로그램을 개발할 필요 없이 실행만 하려는 경우에만 필요합니다. 일반적인 사용자나 Java 응용 프로그램을 사용하는 대부분의 환경에서는 JRE만 설치하면 됩니다.

 

5. Java의 객체 지향 프로그래밍(OOP)

5-1. 객체 지향 프로그래밍의 핵심 개념

Java는 객체 지향 프로그래밍(OOP)을 기반으로 설계되었습니다. OOP의 핵심 개념에는 상속성, 다형성, 캡슐화가 포함되어 있습니다.

  • 상속성: 자식 클래스가 부모 클래스의 속성과 메서드를 물려받아 재사용할 수 있게 해주는 개념입니다. 이를 통해 코드의 재사용성을 높이고, 유지보수를 용이하게 합니다.
  • 다형성: 객체가 다양한 형태를 가질 수 있게 하는 개념입니다. 같은 메서드를 다른 객체가 서로 다르게 사용할 수 있어, 코드의 확장성과 유연성을 높여줍니다.
  • 캡슐화: 객체 내부의 속성과 메서드를 숨기고, 필요한 부분만 외부에 노출함으로써 데이터의 무결성을 유지합니다.

5-2. 클래스와 패키지의 구조

Java 프로그램은 모든 기능을 클래스로 구성하며, 각 클래스는 프로그램의 다양한 속성과 메서드를 포함합니다. 관련된 클래스는 패키지로 묶어 관리할 수 있습니다. 패키지는 클래스가 위치하는 폴더 개념으로, 유사한 기능을 수행하는 클래스들을 한곳에 모아 효율적으로 관리할 수 있습니다.

예를 들어, java.lang 패키지에는 Java의 기본 기능을 제공하는 여러 클래스가 포함되어 있으며, 자주 사용하는 System 클래스도 이 패키지에 속합니다. Java에서는 필요한 패키지를 코드 상단에 import하여 사용할 수 있고, 개발자는 자신만의 패키지를 생성할 수도 있습니다.

5-3. Java 파일 구조와 컴파일

Java 소스 파일(.java)에는 여러 클래스가 정의될 수 있으며, 컴파일 시 각 클래스는 독립된 .class 파일로 생성됩니다. 하나의 소스 파일에 여러 클래스가 있어도 public으로 선언된 클래스는 하나만 있어야 하며, 소스 파일의 이름은 이 public 클래스의 이름과 같아야 합니다.


6. Java의 특성과 실행 환경 비교

6-1. 멀티스레드 지원

Java는 멀티스레드를 자체적으로 지원하여, 운영체제의 도움 없이도 여러 작업을 동시에 수행할 수 있습니다. 멀티스레드를 사용하면 프로그램의 효율성을 높이고, 시간과 자원을 절약할 수 있습니다. 예를 들어, 한 프로그램이 파일을 읽으면서 동시에 데이터를 처리하는 등 다양한 작업을 병렬로 실행할 수 있습니다.

6-2. 가비지 컬렉션

Java의 또 다른 주요 특징은 가비지 컬렉션(Garbage Collection)입니다. Java는 메모리 관리를 자동화하여, 개발자가 메모리를 수동으로 해제할 필요 없이 프로그램이 더 이상 사용하지 않는 메모리를 자동으로 회수합니다. 이는 메모리 누수와 같은 문제를 줄여주며, 개발자가 메모리 관리에 신경 쓰지 않아도 되도록 합니다. 다만, 가비지 컬렉션은 예측 불가능한 시점에 실행되므로, 실시간 시스템에는 부적합할 수 있습니다.

6-3. C/C++와의 차이점

Java는 포인터 개념이 없고, 타입 체크가 엄격합니다. 이는 개발자가 프로그램 작성 시 오류를 줄이고, 코드를 더 안전하게 작성할 수 있도록 도와줍니다. 또한, Java는 컴파일러가 생성한 바이트 코드를 JIT(Just In Time) 컴파일러를 사용해 실행 중 기계어 코드로 변환하므로, 인터프리터 방식보다 빠른 실행을 제공합니다.


7. Java의 다양한 응용 프로그램

7-1. 데스크톱 응용 프로그램

Java는 다양한 플랫폼에서 독립적으로 실행되는 데스크톱 응용 프로그램을 개발할 수 있습니다. 이러한 프로그램은

Java Runtime Environment(JRE)가 설치된 모든 컴퓨터에서 실행할 수 있습니다. 다른 응용 프로그램의 도움 없이 독립적으로 작동하므로, PC나 노트북과 같은 데스크톱 환경에서 널리 사용됩니다.

7-2. 서블릿(Servlet) 응용 프로그램

Java는 서버에서 실행되는 서블릿(Servlet) 기술을 제공하여 웹 애플리케이션 개발에도 사용됩니다. 서블릿은 주로 웹 서버에서 실행되며, 웹 브라우저와 통신하여 서버와 데이터베이스를 연동하는 복잡한 기능을 구현할 수 있습니다. 웹 서버에서 서블릿이 실행되기 때문에 사용자 인터페이스가 필요 없는 서버 측 프로그램으로 적합합니다.

7-3. 모바일 응용 프로그램(Android 앱)

Java는 안드로이드 모바일 플랫폼의 기본 개발 언어로 사용됩니다. 안드로이드는 구글이 주도한 오픈 핸드셋 얼라이언스(OHA)에서 개발한 모바일 운영체제입니다. Java와 유사한 방식으로 프로그램을 작성하지만, 안드로이드에서는 JVM 대신 Dalvik 가상 머신을 사용합니다. 이를 통해 기존의 바이트 코드가 안드로이드 기기에서 호환될 수 있도록 변환이 이루어지며, 전 세계적으로 널리 사용되는 다양한 모바일 애플리케이션이 Java로 개발되었습니다.


이와 같이, Java는 데스크톱, 서버, 모바일을 아우르는 다양한 응용 프로그램 개발에 사용되며, 멀티스레드와 가비지 컬렉션 같은 편리한 기능을 통해 개발자들이 더 쉽게 프로그램을 작성하고 관리할 수 있도록 지원합니다. Java의 강력한 객체 지향 개념과 폭넓은 플랫폼 지원 덕분에 Java는 오늘날에도 많은 개발자들에게 사랑받고 있습니다.