1. 컴퓨터와 프로그램, 그리고 자바
컴퓨터는 단순한 연산작업을 빠르게 작업하여 주어진 명령들을 수행한다. 컴퓨터가 수행하는 단계별 명령들의 모음을 알고리즘이라고 한다. 프로그램은 이 알고리즘을 개발자가 프로그래밍 언어로 작성한 소프트웨어로써, 파이썬, 자바, C, 자바스크립트 등 다양한 언어로 작성할 수 있다. 다만, 컴퓨터는 사람이 사용하는 언어를 이해할 수 없고, 머신코드만 이해할 수 있기 때문에 머신코드와 비슷할수록 컴퓨터가 이해할 수 있는 언어로 변환하기가 빠르고, 사람이 이해할 수 있는 프로그래밍 언어와 비슷할수록 컴퓨터가 이해할 수 있는 언어로 변환하기까지 시간이 걸린다.
물론 각각의 언어에 장단점이 존재하기때문에, 최고의 언어라는 개념은 사실 큰 의미가 없다. 숙련된 개발자라면 특정 경우에 어떤 언어가 더 높은 효율성을 보이는지 알기에 상황에 맞는 언어를 선택하여 개발한다. 따라서 개발자들은 커리어가 쌓여가면서 다양한 언어들을 배우게 되는데, 프로그래밍 언어 하나를 제대로 이해한다면 다른 언어들을 익히는것은 훨씬 편해지기에 빠른 속도로 익힐 수 있다. 중점은, 프로그래밍적으로 문제해결을 위해 어떻게 접근하는가이다. 이 튜토리얼도 그러한 문제 해결 접근방식을 다루어보고, 프로그래밍을 제대로 하는 방법을 배우는걸 목표로 하고 있다.
이번 챕터에서는 프로그래밍의 가장 근본이 되어주는 컴퓨터, 프로그램, 운영체제등에 대해 배워볼 예정이다.
1. 컴퓨터란?
컴퓨터는 눈으로 보고 만질 수 있는 하드웨어와 눈으로는 보이지 않지만 컴퓨터에게 동작하도록 명령을 내리는 소프트웨어로 나뉘어 있다. 프로그램 개발을 위해서 사실 하드웨어적인 부분은 크게 중요하지 않아보이지만, 이를 이해하게 된다면 더 효율적으로 컴퓨터의 요소들을 활용해 제어할 수 있다.
컴퓨터는 아래의 핵심 부품들로 구성되어 있다.
- Central Processing Unit (CPU)
- Memory (Main Memory)
- Storage Device (Disk, CD)
- Input Device (Keyboard, Mouse)
- Outpu Device (Speaker, Monitor)
- Communication Device (Modem, Network Interface Cards)
컴퓨터의 부품들은 bus라는 서브시스템으로 서로 연결되어 상호 작용을 한다. 버스는 쉽게말해 컴퓨터의 부품들이 사용할 수 있는 통로로, 데이터와 파워들이 버스를 통해 서로 다른 부품으로 이동을 한다. 개인용 PC의 경우 메인보드에 대체로 버스가 설치되어있다.
1. 1. Central Processing Unit (CPU)
CPU는 메모리로부터 명령을 받아 실제로 처리를 하는 부품으로, 컴퓨터의 뇌와 같다. CPU는 control unit과 arithmetic/logic unit으로 나뉘어져 있다. control unit의 경우 컴퓨터 내부의 부품들을 조종하여 서로 상호작용을 하게끔 해준다. Arithmetic/logic unit은 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 수학적 연산과 값들을 비교하는 비교 연산을 처리한다.
요즘날의 CPU는 트랜지스터라고 불리는 수백만개의 작은 스위치들이 아주 작은 실리콘 세미컨덕터 칩에 붙은 모양으로 만들어지고 있다. 그리고 모든 컴퓨터에게는 내부에 작은 시계가 있어 정해진 비율로 전기파를 배출하는데, 컴퓨터가 배출하는 전기의 속도를 헤르츠라고 한다. 헤르츠가 클수록 컴퓨터의 연산 처리 속도는 더 빠른것으로 간주된다.
CPU는 최초 하나만의 코어를 갖고 제작이 되었었는데, 코어는 명령들을 읽어와 실행하는 부품으로 코어의 수가 더 많을수록 더 많은 처리를 한번에 처리할 수 있다.
1. 2. Bits와 Bytes
손으로 만질수 없는 정보 라는 데이터는 어떻게 컴퓨터에 저장되어 사용되는지 알아보자. 컴퓨터의 기능을 최소 단위로 나누어보면 결국 껐다 켰다 하는 스위치이다. 스위치가 켜져있는 상태는 1의 값을 갖게 하고, 스위치가 꺼져있다면 0의값을 제공함으로써 다양한 데이터들을 이진법으로 나타낼 수 있다. 여기서 사용된 각각의 0과 1들을 하나의 bit 라고 한다. 그리고 컴퓨터가 저장할 수 있는 정보의 최소 크기는 1byte 로 총 8개의 bits가 모여 생성이 된다.
데이터 타입은 정보의 종류로써 숫자형, 문자형 등등 다양한 타입들이 있다. 프로그래머로써는 0과 1의 데이터가 어떻게 해당 데이터타입으로 출력이되는지 크게 걱정할 필요는 없지만, 컴퓨터는 encoding scheme을 사용하여 이 동작을 처리한다. 제일 자주 사용되는 ASCII encoding scheme을 사용하는 경우, 알파벳 C를 표현하기 위해서는 01000011
하나의 바이트가 사용된다.
컴퓨터의 저장공간은 바이트를 기준으로 표기되며, 바이트의 크기가 커지면 아래와 같이 표기가 된다
- Kilobyte (KB) 는 약 1,000 바이트이다
- Megabyte (MB) 는 약 1백만 바이트이다
- Gigabyte (GB) 는 약 10억 바이트이다
- Terabyte (TB) 는 약 1조 바이트이다
대체로, 한 페이지 분량의 마이크로소프트 워드 파일이 20KB정도임을 감안하면, 1mb는 약 50장의 문서를, 1gb는 50,000장의 문서를 보관할 수 있다.
1. 3. Memory
컴퓨터의 메모리는 프로그램과 프로그램이 사용중인 데이터들을 실행된 순서대로 정렬하여 보관하는 저장소이다. 메모리는 쉽게말해 컴퓨터의 작업대로써 작업을 처리할 떄 필요한 데이터들을 메모리로 가져와 CPU가 처리를 하도록 한다.
메모리 상의 모든 byte들에게는 해당 데이터만의 주소가 존재하는데, 해당 주소를 사용하여 byte 를 보관할수도 있고, 이후에 꺼내와 사용할수도 있다. 컴퓨터가 필요한 데이터에 따라 접근하는 메모리의 주소가 완벽하게 랜덤하기때문에 컴퓨터의 메모리를 random access memory (RAM) 이라고도 부른다.
요즘에는 기본적으로 컴퓨터에 약 4기가바이트의 램을 갖고 있고, 특수 목적을 위해 추가하여 8~ 32기가바이트까지 사용하는경우도 있다. 램이 많으면 많을수록 CPU가 작업할 수 있는 작업대가 많아지는것이기에 램이 많을수록 컴퓨터의 속도가 빨라진다.
1. 4. Storage Device
컴퓨터의 메모리는 시스템의 전원이 꺼지는경우 다 사라지기때문에 사실 안전하지 않은 데이터 저장소이다. 이러한 문제점을 해결하기 위해 프로그램들과 데이터들을 storage device에 보관하도록 하는데, 여기에 보관된 데이터를 컴퓨터가 메모리로 옮겨와 CPU가 작업하도록 한다.
1. 5. Input and Output Devices
입출력 기기는 말 그대로 컴퓨터에 입력하고, 컴퓨터에서 출력해주는 기기로 키보드와 마우스, 모니터와 프린터등이 있다.
1. 6. Communication Devices
컴퓨터는 서로 네트워크상에 연결이 되어 통신을 할 수 있다. 이처럼 통신기능을 사용하기 위해서는 모뎀이나 DSL, 와이어리스 아답터등이 필요하다.
- Dial Up Modem: 전화기를 사용하여 인터넷에 연결을 하며, 초당 56,000 byte의 정보를 전달할 수 있다
- Digital Subscriber Line도 전화선을 사용하지만 다이얼 모뎀보다는 20배 빠른 속도로 데이터전송이 가능하다
- Cable Modem: 케이블 회사에서 관리하는 케이블을 활용하며, DSL보다 빠른속도를 제공한다
- Network Interface: 컴퓨터를 local area network (LAN)에 연결하도록 해준다. LAN은 학교나 집, 사무실과 같이 한정된 공간의 컴퓨터들을 이어주는 방식으로 사용된다.
- Wireless Network: 이제는 대부분이 와이어리스를 사용하며, 어댑터를 사용하여 컴퓨터가 LAN과 인터넷에 연결될 수 있게 해준다
2. 프로그래밍 언어
컴퓨터는 사람들의 언어를 이해하지 못한다. 똑같이, 사람도 컴퓨터가 하는 말을 이해하기 어렵다. 따라서 컴퓨터에게 명령을 전달하기 위해서는 사람들의 언어를 컴퓨터가 사용하는 언어로 번역을 해주어야 한다.
2. 1. Machine Language
컴퓨터가 사용하는 언어는 machine language라고 불리며, 여러개의 이진수로 이루어진 코드로 작성이 되어있다. 따라서 컴퓨터가 직접적으로 전달받은 로직을 실행하기 위해서는 이진법 형태의 데이터가 전달되어야 한다. 실제 예시로, 숫자 두개를 더하라는 명령은 1101101010011010
이다.
2. 2. Assembly Language
머신 랭기지로 프로그램을 개발한다는건 상당히 어려운 작업이다. 아무래도 0과 1로 모든것이 다 이루어져있다보니, 특정 부분을 수정해야하거나 이전에 작성한 코드를 살펴봐야 할 때, 원하는 코드를 찾기가 어렵다. 이러한 이유로 assembly language가 개발되었는데, 이는 mnemonic 이라고 불리는 단어들을 사용하여 각각의 명령들을 설명한다. 예를들어, add
라는 mnemonic은 숫자를 더하도록 하고, sub
는 숫자를 빼도록 한다. 이를 사용하면 다음과 같이 코드작성이 가능하다. add 2, 3, result
.
어셈블리 언어는 프로그래밍을 좀 더 쉽게 작성할수 있도록 개발이 되었지만, 컴퓨터가 이해할 수 있는 머신 랭기지가 아니기때문에 실행시키기 위해서는 Assembler 를 중간에 사용하여 번역해주어야 한다.
어셈블리어로 개발을 하는게 머신랭기지로 개발하는것보다 확실히 수월하다. 하지만, 어셈블리언어는 개발자가 직접 CPU에게 특정 동작들을 하도록 모든 명령을 내려주어야 하기에 머신랭기지의 특징들을 다 갖고있다. 이처럼 머신랭기지와 비슷한 언어들을 low-level language라고 한다.
2. 3. High Level Language
1950년대에 프로그래밍 언어의 새로운 세대가 high level language와 함께 도래했다. 이들은 다양한 종류의 기계에서 작성이 도리 수 있었으며, 영어와 상당히 흡사한 문법들을 갖고 있기에 쉽게 배우고 사용할 수 있다. high level programming 언어에서는 각각의 명령문들이 statements라고 불린다.
하이 레벨 랭기지로 작성된 프로그램들은 source program, 또는 source code라고 불린다. 어셈블리 코드와 비슷하게, 하이레벨 랭기지도 컴퓨터가 직접 실행시킬 수 없기때문에, 이를 번역해 줄 interpreter 이나 compiler가 필요하다.
3. Operating System
Operating System(OS)는 컴퓨터에서 실행되는 프로그램중 가장 중요한 프로그램으로써, 컴퓨터의 동작들을 관리하고 처리한다. 유명한 OS들로는 마이크로소프트의 윈도우, 맥, 그리고 리눅스가 있다. 웹 브라우저나 엑셀과 같이 컴퓨터에서 실행하는 어플리케이션들은 운영체제가 설치되어있지 않다면 실행될 수 없다. 아래의 도표는 하드웨어와 운영체제, 그리고 어플리케이션과 사용자의 관계도를 정리한다.
OS가 처리하는 주요 작업들은 1. 시스템 활동 관리 및 모니터링 2. 시스템 자원 할당 3. 동작 스케쥴링 등이 있다.
3. 1. Controlling and Monitoring System Activities (시스템 활동 관리 및 모니터링)
운영체제는 사용자가 키보드로 입력을 하거나, 모니터로 출력, 스토리지에 있는 파일들과 폴더 관리, 그리고 주변에 연결되어있는 프린터와 디스크 드리이브들을 관리하는 작업을 한다. 또한, 프로그램들이 서로 방해를 하지 않도록 관리를 해야하며, 인증되지 않은 사용자나 프로그램들이 접근 권한이 없는 데이터를 사용하지 못하도록 한다
3. 2. Allocating and Assigning System Resources (시스템 자원 할당)
운영체제는 CPU 의 작업 시간, 메모리공간, 디스크, 입출력 기기등이 활용하는 프로그램이 컴퓨터의 어떤 자원들이 필요한지를 확인하고 할당해주는 역할을 한다.
3. 3. Scheduling Operation (동작 스케쥴링)
OS는 프로그램이 예약된 시간에 동작하도록 관리를 해준다. 대부분의 운영체제는 multiprogramming이나 multithreading, multiprocessing 등의 기능을 제공하여 퍼포먼스를 향상시킨다.
Multiprogramming은 워드와 이메일, 웹브라우저와 같은 다양한 프로그램들이 하나의 CPU를 활용하여 동시에 실행될 수 있도록 한다. CPU는 컴퓨터의 다른 요소들보다 속도가 빠르기때문에 대부분의 시간을 대기하면서 보내게 되는데, 멀티프로그래밍 운영체제는 이러한 점을 사용하여 CPU가 대기중인 경우 다른 프로그램을 처리하도록 분배를 해준다. 따라서, 워드 프로그램에서 문서를 작성하면서도 브라우저에서 다운로드가 지속적으로 할 수 있게 해준다.
Multithreading의 경우, 하나의 프로그램이 여려개의 작업을 동시에 처리하도록 해준다. 예를 들어, 글을 수정하고 저장하는 동작이 동시에 발생하는 경우 멀티쓰레딩을 활용하면 이 두개의 동작이 동시에 처리되게 된다.
Multiprocessing은 multithreading과 상당히 흡사하지만, 멀티쓰레딩은 하나의 프로그램을 여러개의 스레드에서 동시에 실행시키는 반면 멀티 프로세싱은 실행중인 여러개의 프로그램들이 여러개의 프로세서를 통해 실행되게 된다.
4. Java 언어 스펙과 API, JDK, JRE 그리고 IDE
자바의 문법은 Java Language Specification에 정리가 되어있고, Java library는 Java API에 설명이 되어있다. JDK는 자바 프로그램을 컴파일하고 실행하기 위한 소프트웨어이며, IDE는 빠르게 개발을 하기 위해 만들어진 통합 개발 환경이다.
5. Simple Java Program
자바 프로그램은 클래스 내부에 있는 main
로 부터 시작된다. 그러면 자바의 세계에 오신걸 환영합니다~
라는 메시지를 출력하는 프로그램을 만들어보자. 가장먼저, Welcome.java
라는 프로그램을 작성해보자.
package com.hoonnote.basics.ch1;
public class Welcome {
public static void main(String[] args) {
System.out.println("자바의 세계에 오신걸 환영합니당!");
}
}
코드 분석을 해보면, 모든 자바 프로그램들은 클래스가 있어야만 한다. 각각의 클래스에게는 이름이 주어지는데, 클래스 이름의 첫 낱말은 대문자로 작성을 한다. 우리가 작성한 코드에서는 Welcome
으로, W가 대문자로 사용되었다.
다음줄을 보면, main
메소드가 있다. 프로그램은 main
메소드로부터 시작을 하게 된다. 클래스에는 여러가지 메소드가 있지만, main
메소드가 프로그램이 가장 먼저 실행되는 부분이다.
메소드는 statement들을 갖고있는 구조물이다. main
메소드의 경우, System.out.println
이라는 statement를 갖고있고, 이 statement는 내부에 지정해놓은 문장을 콘솔창에 출력하도록 한다. 문자열(String) 타입은 여러개의 낱말의 연결로써, " "
로 감싸서 사용을 한다. 그리고 모든 자바의 statement 뒤에는 ;
를 달아주저야 한다.
reserved word
의 경우, 자바에서 이미 사용자에게 제공하는 단어들로써, class, Public, static, void등등이 있다.
커멘트의 경우 //
아니면 /**/
로 사용이 가능하다. 이는 프로그램이 실행될때 읽어지지 않으며, 개발자가 메모를 남기는 용도로 사용된다.
// This application program displays Welcome to Java!
/* This application program displays Welcome to Java! */
/* This application program
displays Welcome to Java! */
중괄호의 경우, 프로그램의 블록 으로, 연관되는 프로그램끼리 그룹을 지어준다. 자바에서는 클래스 블록이 있고 메소드 블록이 존재한다.
단순한 출력 작업 외에도, 자바에서는 mathematical operator을 제공해주어 숫자 연산도 가능하다.
package com.hoonnote.basics.ch1;
public class ComputeExpression {
public static void main(String[] args) {
System.out.print("(10.5 + 2 * 3) / (45 – 3.5) = ");
System.out.println((10.5 + 2 * 3) / (45 - 3.5));
}
}
6. Creating, Compiling, Executing Java Program
자바 프로그램을 .java 파일로 만들어 저장한다. 그런 다음 컴파일을 하면 .class 파일로 변하게 되고, 이 클래스 파일을 Java Virtual Machine을통해 실행하게 된다. IDE를 사용하면 이러한 복잡한 작업들을 다 한번에 처리해주기 때문에 개발자가 편하게 개발할 수 있다. 이전에 예시로 작성했던 Welcome.java프로그램이 실행되는 순서를 보면 아래와 같다
아무런 문법적 에러(Syntax Error)가 발생하지 않는다면, 컴파일러는 .class
형식의 바이트코드 파일을 생성한다. 바이트코드는 머신코드와 비슷하지만 JVM이 설치되어있는 어느 환경에서든 실행될 수 있다. 따라서 윈도우를 사용하든 mac을 사용하든 JVM만 설치되어있다면 자바 프로그램을 실행할 수 있다.
7. Programming Errors
프로그래밍 에러는 Syntax Error, Runtime Error, Logic Error 로 구분이 된다
7. 1. Syntax Error
이 에러는 컴파일 단계에서 발생하며, 자바 프로그래밍 언어가 사용하는 문법을 틀리게 사용하면 발생한다. ;
를 누락하거나 오타를 내는 등의 경우에 발생한다.
package com.hoonnote.basics.ch1;
public class SyntaxErrorExample {
public static main(String[] args) {
System.out.println("Welcome to Java"):
}
}
위의 코드를 실행하면, void가 누락되어있고, ;
가 빠져있다고 에러를 발생하게 된다.
7. 2. Runtime Error
런타임 에러는 프로그램이 비정상적으로 종료되게 한다. 이는 개발자가 상황별 케이스를 처리하는 방법이 미숙해 발생하는 경우가 많은데, 예를 들어 숫자값만 받아오는 로직에 문자열이 들어오면 처리를 하지 못해 에러가 발생하는 경우가 있다. 이를 런타임 에러라고 칭한다.
package com.hoonnote.basics.ch1;
public class RuntimeErrorExample {
public static void main(String[] args) {
System.out.println(1 / 0);
}
}
위의 코드의 경우, 0으로 나누게 되면 사실상 불가능한 연산이기때문에 런타임 에러가 발생하게 된다.
7. 3. Logic Error
사실 개발하면서 가장 많이 마주치게 될 에러로써, 개발자가 구현한 로직이 잘못되는경우 발생한다. 이는 실제로 에러메시지가 나오는 에러가 아니고, 개발자가 기대했던 값과 완전 다른 값이 나오게 되어 로직 에러라고 한다.
Author And Source
이 문제에 관하여(1. 컴퓨터와 프로그램, 그리고 자바), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@1005hoon/introductiontocomputerprogramsjava저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)