1. 프로그래밍 언어 개요

1.1. 프로그래밍 언어의 필요성

  • 사람과 컴퓨터 간의 의사소통 수단
  • 사람이 컴퓨터에게 작업을 지시하기 위한 명령어를 기술하기 위해 사용된다.

1.2. 언어의 분류

  • 저급 언어(Low Level Language)

    • 기계어(Machine Language)
      • 이진수(0과 1)로 구성된 컴퓨터가 이해하는 유일한 언어
      • 배우기 어렵고 사용이 불편함
      • 표준화 되어있지 않음
    • 어셈블리어(Assembly Language)
      • 연산 코드(Opcode; Mnemonic): 기계어를 사람이 이해하기 쉬운 기호(예: ADD, LDA)로 1:1 대응
      • 피연산자(Operand; Symbolic): 레지스터, 메모리 주소, 상수
      • 하드웨어의 직접 통제가 가능함
  • 고급 언어(High Level Language)

    • 인간의 자연어와 유사하여 이해하기 쉽고 친근함
    • 생산성이 높으며, 컴파일러 등을 통해 기계어로 변환되어 실행됨
    • (예: C, C++, Java, Python 등)
    • 기계 독립적

1.3. 언어의 세대별 발달

  • 1세대: 기계어
  • 2세대: 어셈블리어
  • 3세대: 절차적 중심 언어(Fortran, C, Pascal 등)
  • 4세대: 비절차적 중심 언어, 데이터베이스 질의 언어(SQL), 비주얼 프로그래밍 언어(Visual Basic)
  • 5세대: 자연어, 블록 프로그래밍(Scratch), 인공지능 및 교육용 언어

2. 프로그램 구현 및 개발 환경

  • 프로그램: 컴퓨터에서 특정 목적의 작업을 수행하기 위해 관련된 명령어와 자료를 모아놓은 것

2.1. 개발 도구의 구성

  • 에디터(Editor)

    • 소스 코드 작성 및 편집
  • 컴파일러(Compiler)

    • 고급 언어로 작성된 소스를 기계어로 변환
  • 링커(Linker)

    • 여러 목적 파일(Object file)과 라이브러리를 연결하여 실행 파일(.exe) 생성
  • 디버거(Debugger)

    • 오류(Bug)를 찾아 수정(Debugging)하는 도구
    • 디버깅의 유래: 그레이스 호퍼 중위가 컴퓨터 릴레이에 낀 나방(Bug)을 발견한 것에서 시작됨
  • 통합개발환경(IDE)

    • 위 도구들을 하나로 통합해 제공하는 환경
    • (예: Visual Studio, Eclipse)

2.2. 번역 및 실행 방식

  • 컴파일러 방식

    • 소스 전체를 한 번에 기계어로 번역
    • 실행 속도가 빠름
    • (C, Fortran)
  • 인터프리터 방식

    • 소스를 한 줄씩 읽어 실행
    • 번역 속도는 느리나 수정 및 대화형 작업에 유리
    • (Python, Basic)
  • 중간 방식(하이브리드)

    • 컴파일러와 인터프리터의 특징을 모두 가짐
    • 가상 머신(VM) 위에서 실행되어 플랫폼 독립적임
    • (Java, C#)

2.3. 프로그램 번역과 실행

단계입력컴포넌트출력gcc
전처리소스(.c)전처리기전처리된 소스(.i)gcc -E
컴파일전처리된 소스(.i)컴파일러어셈블리 코드(.s)gcc -S
어셈블어셈블리 코드(.s)어셈블러오브젝트 코드(.o)gcc -c
링킹오브젝트 코드(.o)링커실행 파일(.exe/.out)gcc
로딩실행 파일(.exe/.out)로더메모리 적재(OS Kernel)
  1. 소스 작성

    • 편집기로 프로그램 작성
  2. 전처리

    • 전처리 지시자(헤더 파일 삽입, 매크로 치환)를 처리한다.
    • 소스 코드(.c) → 전처리된 소스 코드(.i)
  3. 컴파일

    • 전처리된 소스 코드를 어셈블리어 코드로 변환한다.
    • 전처리된 소스 코드(.i) → 어셈블리어 코드 파일(.s)
  4. 어셈블

    • 어셈블리어 코드를 바이너리 형태(기계어)의 목적 파일(object file)로 변환한다.
    • 어셈블리어 코드 파일(.s) → 오브젝트 파일(.o)
  5. 링킹

    • 링커: 각 프로시저를 따로 컴파일, 어셈블 하는 시스템 프로그램으로 실행 파일 생성
    • 여러 개의 목적 파일과 각종 라이브러리를 합쳐서 실행 파일(executable)을 만든다.
    • 오브젝트 파일(.o) → 실행 파일(Unix: .out/Windows: .exe)
  6. 로딩

    • 로더: 프로그램을 주기억장치에 적재하는 시스템 프로그램
  • cf. 디버거
    • 오류는 컴파일 오류, 링크 오류, 실행 오류로 구분

3. 주요 고전 및 시스템 프로그래밍 언어

  • 포트란(FORTRAN)

    • IBM의 존 배커스가 고안한 최초의 고급 언어
    • 과학·공학·수학적 문제들을 해결하기 위해 사용
    • 매우 단순하고 간결하여 배우기가 쉬움, 문법이 엄격함
  • 코볼(COBOL)

    • 미국 국방성 CODASYL에 의해 개발된 고급언어
    • 사무 처리용 언어
    • 영어 문장과 유사한 구조
    • 컴퓨터 내부적인 특성에 독립적으로 설계
  • 베이직(BASIC)

    • 초보자 교육용 대화형 언어
    • 인터프리터를 사용하여 쉽게 파악할 수 있음
    • 마이크로소프트, 비주얼 베이직 IDE 개발
  • 파스칼(PASCAL)

    • 알고리즘 학습에 적합하도록 니클라우스 워스 교수가 개발
    • 구조적인 프로그래밍이 가능하도록 설계
    • 볼랜드, 델파이 IDE 출시
  • C 언어

    • 벨 연구소 데니스 리치 개발
    • 유닉스(Unix) 운영체제 개발을 위해 탄생
    • 하드웨어 제어와 이식성이 뛰어나 범용적으로 사용됨
  • C++

    • C 언어에 객체지향(OOP) 개념(상속성 등)을 추가하여 확장한 언어

4. 객체지향 프로그래밍 (OOP)

4.1. 개요 및 특징

  • 현실 세계의 사물(객체)을 모델링하여 소프트웨어를 개발하는 방법론

  • 주요 특징 4가지

    • 추상화, 상속성, 캡슐화, 다형성
  • 구성 요소

    • 속성(Attribute): 객체의 정적인 특성 (데이터)
    • 행동(Behavior): 객체의 동적인 일 처리 (메소드)

4.2. 절차지향 vs 객체지향

  • 절차지향(예: C)

    • 동사(함수) 중심
    • 전체 과정을 순차적으로 처리
  • 객체지향(예: Java, C++)

    • 명사(객체) 중심
    • 객체 간의 상호작용(메시지 교환)으로 문제 해결
    • 재사용성 및 유지보수성 우수

5. 현대의 주요 언어 및 특수 목적 언어

5.1. 범용 및 웹/앱 개발 언어

  • 자바(Java)

    • 이식성이 높음(JVM 사용)

    • 웹 개발 및 안드로이드 등 다양한 플랫폼에서 사용

    • Java 언어

      • 썬 마이크로시스템, 가전제품을 제어하기 위해 고안한 언어
      • C++ Oak Java, 개발도구 JDK 발표
      • 플랫폼에 독립적인 언어
    • Java bytecode

      • 다양한 하드웨어 및 소프트웨어 플랫폼에서 효율적으로 실행하기 위해 설계된 구조 중립적인 중간 형태의 이진 파일
    • Java Virtual Machine

      • Java bytecode가 모든 플랫폼에서 실행될 수 있도록 하는 것
  • C#(닷넷)

    • 마이크로소프트의 닷넷(.NET) 플랫폼을 위한 언어
    • XML 웹 서비스 기반
    • C# 컴파일러 MSIL CLR 인터프리터
  • 코틀린(Kotlin)

    • 구글의 안드로이드 공식 언어
    • 자바와 100% 호환되며 문법이 간결함
  • 스위프트(Swift)

    • 애플(iOS, macOS) 앱 개발용 언어
    • 빠르고 안전하며 Objective-C를 대체
      • 제네릭스, 타입 인터페이스 등 현대 프로그래밍 언어의 기능을 포함
  • Go(고)

    • 구글이 개발
    • 간결한 문법, 빠른 컴파일, 멀티스레딩(동시성) 지원
    • IDE: JetBrains GoLand, eclipse LiteIDE 등

5.2. AI 및 데이터 분석 언어

  • 파이썬(Python)

    • 귀도 반 로섬이 개발한 인터프리터 언어
    • 문법이 쉽고 간결함
    • 변수를 선언하지 않고 사용할 수 있는 동적 자료형 제공
    • AI, 머신러닝, 빅데이터 분야에서 가장 널리 사용됨 (풍부한 라이브러리)
  • R 언어

    • 통계 분석 및 데이터 시각화에 특화된 인터프리터 언어
    • 빅데이터 처리에 적합

5.3. 교육용 언어

  • 스크래치(Scratch)
    • MIT 개발
    • 블록을 끼워 맞추는 방식의 비주얼 프로그래밍
    • 어린이 및 입문자 코딩 교육용