Engineering Note

[스프링 입문을 위한 자바 객체 지향의 원리와 이해] 기계어에서 객체 지향 프로그래밍 언어로 본문

Programming Language/Java

[스프링 입문을 위한 자바 객체 지향의 원리와 이해] 기계어에서 객체 지향 프로그래밍 언어로

Software Engineer Kim 2022. 4. 21. 17:57

본 글은 책 <스프링 입문을 위한 자바 객체 지향의 원리와 이해>(저자 박종민)를 참고하여 정리한 글입니다.

기계어에서 객체 지향 프로그래밍 언어로

기계어 - 0,과 1의 행진 / 너무나 비인간적인 언어

  • 컴퓨터는 0과 1밖에 이해하지 못한다. 하지만 자료구조와 알고리즘을 통해 0과 1로 이 현실세계를 모델링하여 표현하고 있다.
  • 인류 최초의 프로그래머들은 꺼진 상태와 켜진 상태를 각각 0과 1로 해석 할 수 있는 진공관을 통해 프로그램을 작성했다.
  • 최초의 프로그래머들에겐 키보드도 없었고 심지어 모니터도 없었으며 다만 전구에 전원을 넣을 수 있는 전선 다발이 전부인 적도 있었다.
  • 기계어는 기계가 이해하는 유일한 언어로 2진 숫자인 0과 1로만 표현 되는데 기계어 코드가 CPU에 따라 다르기 때문에 이기종 간에 호환이 불가능하다.
    • 01010101 00000001 00001001 (EDSAC 컴퓨터의 1과 3을 더하는 기계어 코드)
    • 11011100 00011000 10011000 (UNIVAC 컴퓨터의 1과 3을 더하는 기계어 코드)

어셈블리어 - 0과 1의 행진을 벗어나 인간 지향으로 / 기계어 니모닉

  • Assembly Language(어셈블리어) : 기계어를 일상용어로 표현한 것, 니모닉과 기계어의 일대일 매칭한 언어
    • 니모닉이란 어떤 것을 기억하는 데 쉽게 하도록 도움을 주는 것, 또는 쉽게 기억되는 성질. 니모닉은 재사용이 필요할 때 기억을 돕기 위해 명확하게 선택된 상징이나 상징의 조합
    • EDSAC의 더하기를 의미하는 기계어 01010101에 매칭되는 어셈블리어 니모닉은 ADD
    • UNIVAC의 더하기를 의미하는 기계어 11011100에 매칭되는 어셈블리어 니모닉은 PLUS
  • Assembly(어셈블리) : 니모닉과 기계어의 일대일 매칭 코드표
  • Assembler(어셈블러) : 어셈블리어를 기계어로 번역해 주는 소프트웨어
  • 기계어로 프로그램을 작성하는 것 보다는 편리해졌지만 여전히 기계마다 다른 언어를 사용해서 프로그램을 작성해야하는 단점이 존재

C 언어 - 강력한 이식성 / One Source Multi Object Use Anywhere

  • 기계어, 어셈블리어라면 같은 일을 하는 프로그램의 소스 파일을 각 기계의 종류만큼 만들어야 했지만 C 언어의 등장으로 이제는 소스 파일을 단 하나만 만들면 된다. 하나의 소스 파일을 각 기계에 맞는 컴파일러로 컴파일만 하면 각 기계에 맞는 기계어 목적 파일이 만들어 지는 것이다.
  • 예를 들면 1 더하기 3을 계산하는 C언어 소스파일을 맥용 기계에서 실행 시키기 위해서는 맥용 컴파일러, 윈도우에서 실행시키기 위해서는 윈도우용 컴파일러만 있으면 된다. 하지만 싱글 소스이다.
    • 1 더하기 3을 계산하는 C언어 소스파일은 a = 1 + 3, 어셈블리어는 ADD 1 3, PLUS 1 3
  • One Source : 하나의 c 소스 파일만 작성
  • Multi Object : 기종마다 하나씩 기계어 목적 파일 생성
  • Use Anywhere: 모든 컴퓨터에서 실행가능
  • 하지만 각 기계에 맞는 컴파일러가 있다고해서 완벽하게 하나의 소스를 가지고 모든 컴퓨터에서 실행 가능한 것은 아니었다. One Source Multi Object Use Anywhere는 이상향이었고, Fix Source가 필요했다. 즉 운영체제 별 소스 수정 과정이 필요했던 것이다. C언어에서 정수를 표현하는 타입이 int, short, long으로 존재하는 이유도 이러한 이유 때문이다.
    • 이러한 이유를 알려면 역사적인 배경을 이해해야 할 필요가 있는데, C언어는 다양한 비트 단위를 갖는 하드웨어를 지원해야 했으므로 데이터 모델이 있었고, 데이터모델에 따라 short, int, long 등이 정해졌다. 현대 컴퓨터는 8비트 ,16비트, 32비트, 64비트 처럼 2의 배수로 정해져 있고, 8비트가 1바이트로 배우지만 이것 또한 사실이 아니다. 그래서 하드웨어를 다루는 C/C++ 같은 어어에서 8비트를 1바이트라고 가정하지 말고, 비트와 바이트를 변환할 때는 숫자 8 대신에 CHAR_BIT를 쓰라고 권장한다. (CPU에서 한 번에 처리할 수 있는 정보의 단위를 WORD라고 하는데 보통 int는 word 사이즈에 맞추어져 있다. 즉, WORD는 CPU가 레지스터에 한 번에 옮길 수 있는 데이터의 크기를 뜻하고, 32bit 시스템에서는 1word=32bit, 64bit 시스템에서는 1word= 64bit 이다. )
    • 그래서 C언어의 특징으로 '이식성이 좋다'는 말은 현재의 언어 등에 비교하면 안되고 어셈블리어와 비교해서 이식성이 좋다는 의미로 이해해야한다.
  • 무엇보다 C언어는 프로그래밍 방법에 있어서 새로운 패러다임을 제시했는데, 바로 함수로 대표되는 구조적 프로그래밍이다.

C++ - 정말 인간적인 프로그래밍 방법론, 객체 지향

  • C++는 C에 객체 지향 개념을 도입함으로써 역사에 한 획을 그은 언어가 됐다.
  • 하지만 C++는 객체 없는 프로그래밍도 가능하다.

Java - 진정한 객체 지향 언어

  • 객체 지향 언어의 중심에는 class가 있다. 자바에서는 클래스를 떠나 존재할 수 있는 것은 아무것도 없다. 심지어 프로그래밍의 시작점인 main()메서드 마저도 클래스 외부가 아닌 내부에 존재해야 한다. 그리고 모든 메서드도 클래서.메서드명() 또는 객체.메서드명()으로 접근해야만 한다.
  • C++의 main() 함수는 클래스와 별개로 존재할 수 있으며 printf() 함수는 클래스나 객체와 관계없이 호출할 수 있다.
  • 컴파일러를 기종별로 따로 구매해두지 않아도 된다. 한 번의 컴파일로 이기종간 이식성을 확보했다. 다른 기종의 컴퓨터에 해당 기종용 JRE만 설치되면 실행가능Java 컴파일, 실행 과정 - Write Once Use Anywhere

기계어, 어셈블리어, C, Java 비교

  기계어 어셈블리어 C Java
개발자의 코딩 2진법 수 (0과 1의 나열) 일반 단어 사용 수학적 기호 사용 수학적 기호사용
소스 파일 기종마다 하나씩 기종마다 하나씩 기종이 몇 개든 단 하나 기종이 몇 개든 단 하나
목적 파일(기계어) 소스 그 자체 어셈블러로 소스 번역해 생성 컴파일러로 소스를 번역해 특정 운영체제용 기계어 생성 기종이 몇 개든 단 하나의 JVM용 기계어 생성
기계어 비교 소스 그 자체 기계어랑 1:1 대응하는 니모닉 기계어와 m:n 대응하는 수학적 기호 기계어와 m:n 대응하는 수학적 기호
비고   기종 별 어셈블러 필요 기종 별 컴파일러 필요 단 하나의 컴파일러만 필요 기종별 JRE 세팅 필요(한번만 설치해주면 됨
Comments