JAVA

JAVA - 소개

양세진 2024. 5. 27. 22:26

들어가며

JAVA에 대해 공부하며 배운 것들을 정리하고 생각한 것들을 정리하는 포스트 입니다.

개발자들이 많이 사용하는 언어가 궁금해 찾아보다 해당 사이트를 확인했습니다.

 

 

https://www.tiobe.com/tiobe-index/

 

TIOBE Index - TIOBE

Home » TIOBE Index TIOBE Index for May 2024 May Headline: Fortran in the top 10, what is going on? I have received a lot of questions why Fortran entered the top 10 again after more than 20 years. The TIOBE index just publishes what has been measured. The

www.tiobe.com

 

Python , c 계열 , 자바 가 50 퍼센트 가량 비율을 차지하고 있습니다.

특히, 대한민국에서는 정부 공식 프레임워크로 Spring기반을 사용하기 때문에 비중도가 높습니다.

Python 의 경우 웹개발자 뿐만 아니라 AI , IOT등 차세대 분야에서도 많이 사용되고 있고 , 처음 언어를 공부할 때 편리하게 접근할 수 있어 높은 Ratings를 보여줍니다. 또한, 컴퓨터 공학을 전공하지는 않았지만 많은 관련업의 종사하시는 분들이 개발 언어로써 사용하고 있고, 그만큼 많은 라이브러리가 있다는점도 장점으로 들 수 있어 1위를 할 수 있는 것 같습니다.

미국 정부에서는 C계열언어보다 Rust를 사용하라는 지침이 나오고 있어 Rust의 비중도 50위권 안으로 들어온 점이 인상적 입니다.

왜 자바를 사용할까?

자바는 C 보다는 늦게 나왔지만 꽤 나 오래된 언어입니다. 그럼에도 현재까지 많은 개발자들이 애용하고 있습니다. 많은 이유가 있겠지만 개인적인 생각을 적어보려고 합니다. 일단 Java가 나온 이유가 상당히 재밌기 때문에 소개하겠습니다.

언어의 역사

초창기 C 언어는 어셈블리어를 수학적으로 프로그래밍하기 위해 나왔습니다.

그리고 JAVA는 C 에서 부족한 부분을 업그레이드 하기 위해 나온 언어입니다.

어셈블리어는 실제로 다루어보면 꽤 나 직관적으로 이해할 수 있습니다.

section .data
    A dd 10       ; A 변수에 10 할당
    B dd 20       ; B 변수에 20 할당
    C dd 0        ; C 변수 초기화

section .text
global _start

_start:
    ; A와 B 값을 더하여 C에 저장
    mov eax, dword [A]  ; A 변수의 값을 레지스터 eax로 로드
    add eax, dword [B]  ; B 변수의 값을 더함
    mov dword [C], eax  ; 결과를 C 변수에 저장

    ; 프로그램 종료
    mov eax, 1          ; 시스템 콜 번호 1 (프로그램 종료)
    xor ebx, ebx        ; 종료 코드 0
    int 0x80            ; 시스템 콜 호출
    

흔히 사용하는 고수준 프로그래밍 언어 (자바 , 파이썬등) 만 배워본 사람이라면 엥? 이라는 생각이 듭니다. 하지만 잘 보면 수도 코드를 규칙에 맞게 적어 놨다는 느낌을 받을 수 있습니다.

A ,B , C 변수를 선언하고 함수로 저장 하는 과정을 만들어 놓은 것입니다.

필자 또한 18학번이기 때문에 굳이? 어셈블리어를 따로 공부해본 경험은 없고 네트워크 수업을 들으며 어떤 식으로 되는지 이해한 정도가 전부입니다.

하지만, 이해하기 어려운 이유는 어셈블리어는 저수준 프로그래밍 언어입니다.

여기서 수준의 의미는 사람이 더 쉽게 이해할 수 있느냐 즉, 자연어로 이해하기 쉽냐는 의미입니다.

메모리 위치나 명령어를 직접 코딩해서 동작 과정을 만들어 내야 하는 일이기 때문에 매우 귀찮지만 천천히 생각해보면 단순히, A를 저장 B를 더함 결과 C에 저장 하는 일을 하고 있습니다.

만약 해당 코드를 자바로 코딩하면 어떨까요?

public class Main {
    public static void main(String[] args) {
        int A = 10; // A 변수에 10 할당
        int B = 20; // B 변수에 20 할당
        int C;      // C 변수 선언

        // A와 B를 더하여 C에 저장
        C = A + B;

        // 결과 출력
        System.out.println("A + B = " + C);
    }
}

이렇게나 쉽고 빠르게 이해할 수 있습니다.이것이 수학적 프로그래밍이 필요한 이유라고 생각합니다. 하나하나 글로 설명하는 것보다 수식으로 딱 정리하면 훨씬 간단하니까요

C에 대하여

컴퓨터가 발명되고 얼마 안된 초창기 개발자들은 기계어 자체를 다루었고 (천공판)

이후 개발자들은 어셈블리어로 처리 하였습니다.

이때 당시에는 가능했던게 하드웨어의 발전이 아직 부족했기 때문에 큰 메모리를 가지기 어렵고 비쌌기 때문에 지금으로 치면 펌웨어가 동작하는 수준에 코드면 만족스러웠습니다. 즉, 어셈블리어로도 충분히 시간내에 개발이 가능하였습니다.

하지만 하드웨어가 발달하고 시장이 커지면서 여러 기능들을 더욱 많이 탑재 해야했고, 어셈블리어로 작업하는 것은 매우 매우 고된 일 이였을 겁니다. (마치 Linux에서 vim 편집기를 쓰는 듯한)

그래서 나온게 C 라는 언어입니다.

  1. 추상화 수준:
    • 어셈블리어: 어셈블리어는 기계어에 가깝고, 컴퓨터의 하드웨어와 직접적으로 상호작용합니다. 명령어와 레지스터, 메모리 주소 등을 직접 다루기 때문에 하드웨어의 세부 사항을 명확하게 이해해야 합니다.
    • C: C는 어셈블리어에 비해 더 고수준의 언어입니다. 추상화 수준이 높아서, 개발자가 하드웨어의 세부 사항을 몰라도 프로그래밍할 수 있습니다. 또한, 포인터와 같은 고급 기능을 제공하여 메모리와의 상호작용을 추상화합니다.
  2. 가독성 및 이식성:
    • 어셈블리어: 어셈블리어 코드는 기계어에 가까워서 읽기 어렵고 이해하기 어렵습니다. 또한, 어셈블리어 코드는 특정 CPU 아키텍처에 종속적이기 때문에 다른 아키텍처로 이식하기 어렵습니다.
    • C: C는 읽기 쉽고 이해하기 쉬운 문법을 가지고 있어서 가독성이 뛰어납니다. 또한, C는 플랫폼 독립적이기 때문에 다양한 운영체제와 하드웨어에서 실행될 수 있습니다.
  3. 개발 생산성:
    • 어셈블리어: 어셈블리어는 하드웨어의 세부 사항을 직접 다루어야 하므로 개발 생산성이 낮습니다. 또한, 고급 작업을 수행하기 위해서는 많은 코드와 복잡한 로직이 필요합니다.
    • C: C는 저수준 프로그래밍 언어 중에서는 상당히 높은 개발 생산성을 제공합니다. 고급 작업을 수행하기 위한 라이브러리와 함께 사용되며, 하드웨어와의 상호작용을 추상화하여 개발자가 더 빠르게 프로그램을 작성할 수 있습니다.

정리하면 혁명이 일어났다고 해도 과언이 아닙니다.

 

 

그럼 자바는 왜 필요한가?

  1. 플랫폼의 종속성
    • 지금은 플랫폼 시장이 많이 정리되었습니다. 큰 회사가 작은회사들을 인수하며 특정 좋은 부분들을 뽑아 자신의 것들과 합쳐 업데이트 했으니까요.예를 들어 윈도우에서 개발한 C 제품은 MAC OS에서는 동작하지 않는 것과 같은 이유입니다.자바는 JVM , JAVA vaulture Machine을 사용합니다. 자바 가상 기계라고 하는데 책을 읽어보면 한세월 걸리지만 간단하게 설명하면 실생활에 있는 하드웨어와 같은 이치입니다.
    • 자바를 위한 , 자바 만을 위한 플랫폼을 가상의 기계에서 만들어 내는 겁니다.
    • 그래서 자바가 등장한 이유 입니다.
    • 하지만 C 가 나온 시점은 많은 플랫폼들이 춘추 전국시대 처럼 꿈을 안고 도전하고 있었습니다. 하지만 C는 개발했던 플랫폼의 종속되기 때문에 모든 플랫폼에 맞춰 개발해야하는 문제점이 발생하게 됩니다.
  2. 안전성과 보안
    • 필자는 C언어를 군대를 제대한 후 2학년 때 처음 배웠습니다. 열심히 살아야 된다는 생각때문인지 학점도 열심히 관리하고 공부도 하며 지냈을 때 입니다. 처음 강의를 들을 때는포인터는 말 그대로 가르키는 녀석입니다. 어떤 변수의 값이 저장 되어 있는 메모리의 위치 주소를 가르킨다. 가 핵심인데 문제는 조건도 많고, 포인터 연산이라는 개념 때문에 많은 친구들이 전과를 심각하게 고려하는 시기였기도 합니다.맞습니다. C는 직접 메모리 접근을 허용하기 때문에 수준 높은 개발자가 충분한 이해도를 가지고 개발을 하면 매우 성능 좋은 제품을 개발할 수 있습니다.
    • 다른 이야긴 하지만 슈퍼마리오 개발지를 유튜브에서 본적 있는데 저는 이걸 보고 포인터가 생각이 났습니다.
    • 어려워도 잘 쓰면? 좋은거 아님?
    • ‘음 따라갈 만 하네’ 라고 생각하다 포인터라는 놈이 등장하면서 정신이 아늑해졌습니다.

 

아주 오래된 게임인 슈퍼마리오를 개발 할 때 매우 적은 메모리에 많은 내용을 담기 위해 개발자들이 고군분투하여 대단한 성능을 구현해 낼 수 있었습니다.

하지만 하드웨어가 매우 빠르게 발전함에 따라 드는 의문이 발생합니다.

“그거 고민할 시간에 좀 더 좋은 사양쓰고 , 코드 한줄 더 적는게 이득아님?”

그래서 JAVA는 포인터와 해당 연산의 개념을 지우고 자동으로 메모리를 관리할 수 있게 하였습니다.

또한, 아주 고급 개발자가 아닌 이상 사람이기 때문에 실수 하고 결국 이는 메모리 누수로 이루어 지기 때문에 JAVA 버전이 올라감에 따라 더욱 이유가 부각되고 있습니다.

즉 정리하면, 하드웨어가 발전함에 따라 예전보다는 치밀한 관리가 필요하지 않기 때문에 기계에게 자동으로 맡겨 두는게 이득이다! 라고 자바 개발자는 생각했던 것 같습니다.

 

객체 지향 프로그래밍

  • 자바의 꽃 , 핵심 객체 지향입니다. 약어로 OOP 라고도 부릅니다.하지만 자바는 객체 지향적으로 프로그래밍을 할 수 있도록 유도합니다.Class와 객체 입니다.처음 이런 개념을 접했을때 필자는 이렇게 생각했습니다.그럼 자바는 이전 프로그래밍 방식을 완전히 벗어나 혁명적인 업그레이드 이냐? 아닙니다. 이전 개발 방식은 절차적/구조적 프로그래밍 입니다.“함.수.써.라”입니다. 왜? 중복코드 관리해야하니까그럼 자바는 함수 안쓰냐? 씁니다. 이외에도 정말 많은 개념이 녹아있습니다.객체지향에 대한 이야기도 다음 포스트에서 다루고 이런게 있다 정도로 마무리하겠습니다.
  • 즉, 자바가 강조하는 객체 지향은 기존 방식의 업그레이드 버전입니다.
  • 이것이 절차적/구조적 프로그래밍의 핵심이라고 생각합니다.
  • 그럼 그게 뭐냐? 개념적으로 설명하려면 한 세월이지만 필자 개인적인 생각으로는
  • “그럼 다른 언어는 왜쓰냐? 업그레이드 버전이있는데?”
  • 자바의 모든 것은 객체이고 객체가 아니면 존재할 수 없도록 해놨습니다.
  • 가장 대표적으로 자바의 4원칙 (다른 포스팅에서 이야기할 것입니다.)
  • 사실 C 도 C++을 쓰거나 지금의 C는 객체 지향적으로 프로그래밍이 충분히 가능합니다.