개발 일기

[Java] Java에 대해 1 - 개념과 특징 본문

Back-End/Java

[Java] Java에 대해 1 - 개념과 특징

개발 일기장 주인 2024. 3. 5. 20:10

Express에서 이제는 Spring Boot 프레임워크를 사용해보기 위해서 Java 언어 자체에 대해서 기본적으로 알고 넘어가야 할 것들이 있다고 생각하여 정리해보며 나의 Spring Boot 공부가 시작됐다.

자바(Java)란?

  • 1991년 6월 Sun Microsystems에서 근무하는 소규모 엔지니어 팀(James Gosling, Arthur van Hoff 등)의 "Oak"라는 프로젝트로 탄생
  • 초기 목표는 C++을 확장하여 가전제품 등 소형기기에 탑재될 소프트웨어를 제작하는 거였으나 C++로는 한계를 느껴 새로운 언어를 개발하기에 이름
  •  1995년 여러 종류의 OS에서 사용하는 컴퓨터들이 통신하는 인터넷이 등장하자 이를 고려하여 운영체제에 독립적인 Oak가 적합하다고 판단하여 이를 인터넷에 적합하도록 개발 방향을 틀고 이름을 자바(Java)로 변경
  •  1996년 1월 JDK 1.0.2(Java 1) 정식 버전 발표
  • 2009년 Sun Microsystems오라클과 인수 합병되었고 자바에 대한 권리 및 유지보수 또한 오라클로 넘어가게 되었다.
C++ 언어에서 어떤 한계를 느꼈을까?
C++ 언어는 자바 이전에 객체 지향 프로그래밍(OOP) 언어로 널리 사용되었으나, C++ 언어는 운영체제에 독립적이지 못했기 때문에 코드를 돌리는 운영체제가 다르면 다시 컴파일(Compile)해야 한다는 단점이 있었다.

자바의 특징

자바하면 생각나는 특징으로는 크게 두개가 있다. 운영체제에 독립적이라는 것과 객체 지향 프로그래밍(OOP) 언어라는 것이다. 알고보니 그 외에도 다양한 특징들이 있었다. 크게 6가지로 볼 수 있었다.

  1. 운영체제에 독립적(이식성이 좋음):  위에서 언급한 C++의 한계처럼 기존 다른 언어들과 다르게 자바에서 자바 가상 머신(JVM)을 통해 자바로 작성된 프로그램은 운영체제(Operating System, 플랫폼)와 하드웨어에 관계없이 실행 가능하다. 즉, '한번 작성하면, 어디서나 실행된다.(Write once, run anywhere)'라고 표현된다.
  2. 객체지향 프로그래밍 언어: 객체지향 프로그래밍 언어(OOP, Object Oriented Programming)로 상속, 캡슐화, 다형성를 완벽하게 지원하는 객체지향 언어이다. 이때 OOP는 프로그램을 개발하는 방법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립  연결하여 전체 프로그램을 완성하는 것으로 객체를 만들기 위해서는 설계도인 클래스를 작성하고, 객체와 객체를 연결하여 목적에 맞는 프로그램을 만든다.
  3. 자동 메모리 관리(Garbage Collection): 가비지 컬렉터(Garbage Collector)가 자동적으로 메모리를 관리해주기 때문에 프로그래머가 메모리를 따로 관리하지 않아도 된다. GC가 없다면 프로그래머가 사용하지 않는 메모리를 체크하고 반환하는 일을 수동적으로 처리해야하기 때문에 GC를 통해 프로그래머가 프로그래밍에 집중할 수 있도록 도와준다.
  4. 네트워크와 분산처리 지원: Java는 인터넷과 대규모 분산환경을 고려하여 설계됐다. Java의 핵심 라이브러리인 java.net 패키지는 다양한 네트워크 프로그래밍 기능을 제공하며, TCP/IP 프로토콜과 멀티스레드 모델을 통해 대규모 분산환경에서의 성능과 확장성을 향상시키는 등 다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발 가능하다.
  5. 멀티 스레드(Multi-Thread) 지원: 멀티 스레드(Multi-Thread)는 메신져 프로세스 같은 경우 채팅 기능을 제공하면서 동시에 파일 업로드 기능을 수행할 수 있게 해주는 것을 예시로 들 수 있다. 자바에서 관련 라이브러리를 통해 멀티 스레드 프로그램을 개발할 수 있으며 자바 인터프리터가 스케줄링을 담당한다.
  6. 동적 로딩(Dynamic Loading) 지원: 보통 자바로 작성된 프로그램은 여러 개의 클래스로 구성됐는데 자바가 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있다. 즉, 이를 통해 필요한 모듈이나 클래스를 동적으로 로드하고 스프링 부트의 의존성 주입을 통해 해당 클래스 또는 모듈과의 의존 관계를 관리할 수 있다.