제11장 프로그래밍
컴퓨터공학 개론
학습 목표
프로그램의 정의와 개발 방법에 대해 배운다
저수준 언어와 고수준 언어의 차이점을 이해한다
어셈블리 프로그래밍 언어의 예를
이용하여 저수준 언어의 기초를 배운다
알고리즘과 의사코드를 포함한
프로그램의 구조에 대해 배운다
학습 목표 (계속)
Java의 예를 이용하여 고수준 언어의 기본을 이해한다
변수에 대해 배우고 그 활용 방법을 배운다
Java 연산자를 사용해본다
프로그래밍에 사용되는 제어 구조를 경험해본다
객체-지향 프로그래밍과 연관된 용어를
프로그램의 정의
어떤 문제를 해결하기 위한 문장이나 명령을 수행하는 절차들의 집합
컴퓨터가 이해할 수 있는 언어로 변환되어야 한다
알고리즘: 논리적으로 순서화된 문장의 집합
변환 작업은 인터프리터 또는 컴파일러를 통해 수행된다
인터프리터는 프로그램 문장을 한 줄씩 해석한다
컴파일러는 모든 문장을 읽어와서 완성된 프로그램을
컴퓨터와 대화하기
여러분이 어떤 언어를 사용할 지 결정한다
어셈블리어는 하드웨어 제어에 적합
Java, JavaScript는 인터넷 응용에 주로 사용
Lisp는 인공지능 분야에 사용
Visual Basic은 단순하지만 강력한 그래픽 사용자 인터페이스 환경을 제공
그 밖에 C, C++, Smalltalk, Delphi, ADA, FORTRAN, COBOL 등의 언어가 사용된다
프로그래밍 언어의 유형
저수준 언어
사람보다는 컴퓨터가 이해하는 방식에 가까운 프로그래밍 언어
기계어는 컴퓨터가 바로 이해할 수 있는 최저 수준의 언어
어셈블리어는 최저수준 언어와 고수준 언어 사이의 언어
어셈블러는 어셈블리어 코드를 기계어로 번환
고수준 언어
사람에게 친숙하고 자연스러운 언어
그림 11-1
프로그래밍 언어의 유형
저수준 언어
기계어는 이진수만으로 이루어진다
어셈블리어는 기계어에 비해 영어와 유사하다
각 문장이 기계 명령어에 대응된다
고수준 언어에 비해 빠른 실행이 가능하다
특정 CPU 유형에 매우 밀접한 특성을 지닌다
고수준 언어보다 읽고 이해하기가 어렵다
어셈블리어의 문장
연산자와 레지스터 등을 포함하는 알파벳 형식의 명령어로 구성된다
mov 문은 값들을 이동시킨다
mov cx, 8
add 문은 값을 더한다
mov cx, 3
mov dx, 8
add dx, cx
어셈블리어의 문장(계속)
inc 문은 레지스터의 값을 증가시킨다
inc dx
cmp 문은 두 값을 비교한다
mov cx, 4
mov dx, 7
cmp dx, cx (dx - cx = 0이면 제로 플래그가 1이
된다)
jnz 문은 프로그램의 특정 위치로 이동시킨다
jnz stop (제로 플래그가 1일 때 stop으로
표기된 위치로 이동한다)
고수준 언어
저수준 언어에 비해 읽고, 쓰고, 이해하기가 쉽다
한 개의 문장으로 보다 많은 작업을 수행할 수 있다
일반적으로 느리다
컴파일이나 인터프리트 과정이 필요하다
많은 언어들이 통합 개발 환경(IDE:Integrated Development Environment)을 포함한다
편집기, 컴파일러, 그래픽 디자이너 등을
그림 11-2
프로그램의 구조
프로그램의 구조는 알고리즘을 기반으로 하는데, 이는 주로 의사코드로 표현된다
알고리즘: 어떤 문제를 해결하기 위해 따라야 하는 실행 가능한 단계
의사코드: 사람의 언어 형식으로 작성된 알고리즘에 대한 판독 가능한 설명문
프로그래밍 언어 구문으로 변환될 템플릿
의사코드의 예
화씨 온도에서 섭씨 온도로의 변환
사용자에게 화씨 온도를 입력받는다
입력된 온도를 섭씨 온도로의 변환식에 대입한다
섭씨 온도 = (5/9) * (화씨 온도 - 32)
화씨 온도 ##에서 변환된 섭씨 온도 XX를 출력
알고리즘의 선택과 테스팅
어떤 임무를 수행하거나 목표를 달성하기 위해서는 여러 가지 다양한 방법들이 사용될 수 있다
무수한 결정요인들을 기반으로 프로젝트에 가장 적합한 알고리즘을 선택하라
알고리즘의 테스트를 위해 여러분이 최종 사용자라고 가정하고 프로그램을 구동시켜봐야 한다
온도변환의 예: 만약 사용자가 숫자를 입력하지 않는다면?
유효한 값이 입력되었는지를 검사하도록 의사코드를 변경한다
테스팅을 통해 의사코드를 변경
사용자에게 화씨 온도를 입력받는다
숫자가 입력된다면
입력된 온도를 변환식에 대입한다
섭씨 온도 =
(5/9) * (화씨 온도 - 32)
화씨 온도 ##에서 변환된 섭씨 온도 XX를 출력한다
그렇지 않다면
프로그래밍 언어의 구문
프로그램 작성은 요리법 (알고리즘이나
의사코드)에 따라 재료들을 정확히 섞어 음식 (프로그램)을 만들어내는 과정에 비유될 수 있다
음식의 재료들은 다음과 같다
변수
연산자
제어 구조
Java의 요리법
Java는 썬에 의해 개발된 고수준 언어이다
친숙한 구문 (C++ 구문과 유사)
이식성이 좋다
재컴파일 없이도 다른 컴퓨터에서 동작 가능
강력하다
많은 작업을 수행할 수 있는 풍부한 라이브러리를 가지고 있다
상용화되어 있다
다양한 응용의 개발에 사용되고 있다
변수
변수: 컴퓨터 메모리의 특정 위치와 값을 식별하기 위해 사용되는 이름
실제 하드웨어의 주소를 알 필요없이 컴퓨터 메모리에 접근할 수 있는 방법을 제공
변수에 식별자를 부여하는 것을 변수를 선언한다고 말한다
변수를 선언할 때, 식별자나 자료형, 내용 등과 같은 여러 속성을 지정하게 된다
식별자와 명명 기법
Java의 변수 선언 규칙
영문자, 밑줄, 숫자만 사용
영문자로 시작한다
Java에서 특수한 프로그래밍 의미를 가지는 예약어는 사용할 수 없다
명명 기법
의미있는 이름으로 식별자를 정하여라
첫 번째 단어의 첫 문자는 소문자로 하되, 후속된 단어들의 첫 문자는 대문자로 하라
변수의 종류
모든 변수는 강한 타입(strongly typed)을 가진다
각 변수에 저장될 데이터의 타입을 선언해주어야 한다
8가지의 데이터 타입 제공 (표 11-1에서 11-4까지 제공)
변수 선언 구문
type variableName;s
예
float salary;
boolean deserveRaise;
표
11-1, Java
의 정수형 데이터 타입표
11-2, Java
의 실수형 데이터 타입표
11-3, Java
의 문자형 데이터 타입표
11-4, Java
의 불리언 데이터 타입문자열 데이터 타입
문자형 데이터 타입은 단일 인용 부호 안에 영문자 하나를 포함한다
문자열 데이터 타입은 이중 부호의 쌍 안에 하나 또는 그 이상의 영문자를 포함한다
String sFirstName = “Joe”;
String sLastName = “Blow”;
문자열 접합 연산자(+)는 여러 문자열을 하나로 결합시킨다
String sFullName;
헝가리 표기법
변수의 명명 방법
변수 앞에 그 변수의 데이터 타입을 나타내는 문자를 붙이는 방법
단지 가독성을 높이기 위한 방법임
변수가 반드시 해당 데이터 값을 저장해야 하는 것은 아니다
표
11-5, Java
의 헝가리 표기법변수의 내용
변수 초기화는 변수를 선언하면서 동시에 그 변수에 값을 할당하는 것을 말한다
프로그래밍 언어에서 디폴트 값을 할당하게 하는 것보다는 변수 초기화를 하는 방법이 더 낫다
두 문장을 사용하는 방법
int iStudentCount;
iStudentCount = 456;
한 문장으로 결합시킨 방법
연산자
데이터 조작에 기호가 사용된다
데이터 타입에 의한 분류
덧셈, 뺄셈, 곱셈, 나눗셈, 모듈로 연산을 위한 산술 연산자
이진 수식에 사용될 수 있는 약식 표기
iFirstNum = iFirstNum + iSecondNum;
은 다음의 문장과 같다
iFirstNum += iSecondNum;
표
11-6,
산술 연산자연산자 (계속)
증감 연산자 (++, --)
변수의 값에서 1만큼 증가시키거나 감소시킨다
전치 증가 또는 전치 감소 연산자는 해당 소스 코드의 행에서 맨 먼저 수행한다
후치 증가 또는 후치 감소 연산자는 해당 소스 코드의 행에서 맨 나중에 수행한다
int iCount = 5;
int iResult = 0;
iResult = iCount++ + 10;
결과값은 15이다; iCount는 결과값이 계산된 후에 맨
연산자 (계속)
관계 연산자 (표 11-7)
값을 비교
논리 연산자 (표 11-8)
수식을 비교할 때 진리표를 생성한다
수식이란 실행된 후 결과 값을 반환해주는 프로그래밍 문장이다
표
11-7, Java
의 관계 연산자표
11-8, Java
의 논리 연산자표
11-9,
불리언 수식의 대표적인 예제우선순위
연산자들 사이의 우선순위가 결과값을 좌우한다
높은 우선순위의 연산자가 그보다 낮은 우선순위의 연산자들보다 먼저 수행된다
(2+3) * 4 의 결과값은 20이다
2 - 5 * 2 의 결과값은 -8 이다
그림
11-5,
관계,
산술 연산자들 사이의 우선순위Java 제어 구조와 프로그램 흐름
제어 구조는 프로그램 내에서 구문의 실행 순서를 지시하는 문장이다
고수준 언어의 네 가지 제어 구조
호출
하향식 제어
선택적 제어
반복적 제어
호출
모든 Java 프로그램은 시작점을 알리는
“main”이라는 함수를 가지고 있다
public static void main(String[] args) {}
“public”은 다른 어떤 소스 코드에게도 보여질 수 있다는 것을 의미한다
“static”은 함수가 해당 클래스에 속한다는 것을 나타낸다
“void”는 반환 값이 없다는 것을 의미한다
“String[] args”는 프로그램이 실행될 때
하향식 제어 (시퀀스)
프로그램 문장이 시간상으로 상단에서 하단으로 한번에 하나씩 연속적으로 실행된다
모든 프로그래밍 언어에서 발견되는 가장 보편적인 프로그래밍 제어 구조이다
다른 어떤 소스 코드를 호출하지 않고
순서대로 문장을 실행함으로써 구현할 수
있다
코드의 블록
여러 개의 문장을 시작 및 종료 중괄호 안에 묶어 단일 블록 문장으로 만들 수 있다
중괄호 안의 문장들은 서로 기능적으로 연관된다
중괄호를 누락시켰을 때 프로그램이 부정확하게 동작할 수 있다
이 밖에도 중괄호가 필요한 경우가 있다
호출, 선택, 반복과 같은 제어 구조와 함께 흔히
데이터의 출력
System.out.print()나 System.out.println()
문장을 이용하여 현재 출력 장치로 데이터를 출력할 수 있다
print()는 출력된 데이터의 맨 마지막에 현재의 삽입 지점이 오게 한다
println() 는 출력된 데이터의 다음 행에 삽입 지점이 오게 한다
“\n” (새 라인 출력제어 문자)는 시스템에게 다음 행으로 이동하라고 요구한다
수식은 결합될 수 있다 (+ 연산자)
표
11-10, Java
출력 문장의 대표 예제데이터의 입력
System.in은 현재의 입력 장치로부터
데이터를 읽어오는 여러 메소드를 제공한다
입력 스트림으로부터 문자를 읽어오기 위해 새로운 변수를 생성한다
문자들은 새로 입력된 문자열을 저장할 일종의 메모리 버퍼 역할을 하는 다른 변수에 한 글자씩 옮겨 쓴다
이 값은 다시 readLine() 메소드를 호출함으로써
호출에 대한 부언
호출은 무엇 또는 누구를 부르는 행위이다
Java는 함수 또는 메소드를 부름으로써 호출을 구현한다
함수는 어떤 작업을 수행하고 때에 따라서는 결과 값을 반환할 수 있다
메소드는 클래스에 속한 함수이다
함수의 이름이 나오면 시스템은 해당 함수 이름으로 시작되는 소스 코드의 첫 번째 라인으로 제어를 옮긴다
함수의 실행이 끝나면 시스템은 함수를 호출했던 지점으로 제어를 되돌린다
선택
if 문
if (조건)
{ 한 개 또는 그 이상의 문장 }
if-else 문
if (조건)
{한 개 또는 그 이상의 문장 } else
{한 개 또는 그 이상의 문장 }
선택 (계속)
if-else-if 문
if (조건)
{한 개 또는 그 이상의 문장 } else if
{한 개 또는 그 이상의 문장 }
… // 다수의 else if문을 포함할 수 있다 else
{한 개 또는 그 이상의 문장 }
프로그램이 실행되는 동안 프로그램 내에서 어떤
선택 (계속)
switch 문
switch (수식) { case 값_1;
문장_1;
break;
case 값_2 문장_2 break;
default; // 선택적 문장_3;
반복 (루핑)
for 문
for (변수 선언; 수식;
증가/감소) { 문장(들); }
루프에서 카운터로 사용되는 변수를 변경할 때 증가 및 감소 연산자가 자주 사용된다
for (iCount = 1; iCount <= 5; iCount++)
for와 while 루프는 선조건 루프이다
루프 안의 문장들을 실행하기 이전에 조건식을 먼저 검사한다
반복 (계속)
while 문
while (수식) { 문장들; }
do while 문
do {
문장(들);
} while (수식);
do while 루프는 후조건 루프이다
프로그램의 실행
Java를 구매하거나 다운로드 받는다
썬 마이크로 시스템 사에서는 Java와 JDK를 무료로 제공한다
프로그램을 작성할 편집기를 선택한다
통합 개발 환경(IDE) 또는 메모장과 같은 단순한 텍스트 편집기를 사용할 수 있다
javac 명령어로 프로그램을 컴파일한다
javac MyProg1.java
java 명령어로 프로그램을 실행한다
객체-지향 프로그래밍
요소, 물체, 사람을 객체로 표현하고
객체의 행위를 둘러싼 논리에 기반을 둔 프로그래밍 형태
객체는 세 가지 특징을 가진다
특성 (속성)
행위
반응 (이벤트에 대한)
OOP는 재사용성과 유지 관리의 효율성을
제공한다
그림 11-7
OOP의 작동법
틀 만들기
클래스 혹은 템플릿을 만든다
모형 만들기
틀의 특성을 정의한다
동작 모양 만들기
모형이 수행할 수 있는 동작과 어떤 이벤트에 대한 반응 등을 정의한다
OOP 용어
클래스
새로운 객체 유형을 그 속성과 행위에 따라 정의하는데 사용되는 템플릿 또는 틀
객체
데이터와 프로시저 모드로 이루어진 독립적인 개체
인스턴스화
클래스를 바탕으로 객체를 생성하는 과정
생성자
OOP 용어 (계속)
특성 (속성)
객체의 특징
메소드
객체가 수행하는 행위; 클래스 내에서 된다
이벤트
클래스에 의해 인식되는 행위
이벤트 핸들러
계승
범용 클래스를 기반으로 좀 더 세부적인 클래스를 생성하여 클래스 기능을
추가적으로 제공하는 프로세스
부모 클래스
계승을 통해 다른 클래스들을 생성할 수 있는 범용 클래스
서브 클래스
부모 클래스로부터 생성된 상세한 클래스
메소드 호출시 정의된 클래스를 찾을 때까지
캡슐화
다른 객체들에게 한 객체의 연산들을 숨기는 과정
객체를 블랙박스와 같이 취급한다
어떤 객체를 사용하기 위해서 그 객체가 어떻게 동작하는지에 대해 전혀 알 필요가 없다
잠재적인 오류를 방지한다
문제가 있는 객체로부터 오류를 분리시킨다
폴리모피즘
상이한 연산을 표시하는데 동일한 표현을 사용할 수 있는 객체의 능력
연산이 호출되면 시스템이 실행 시에 어떤 연산이 사용될 지를 결정한다
예: 모든 기하학적인 모양(사각형, 삼각형, 원)에 대하여 Draw 연산을 사용
Draw가 호출되면, 시스템은 모양을 정확하게
출력하기 위하여 어떤 객체의 메소드를 호출해야 할 지를 결정한다
Java와 OOP
Java의 모든 것은 클래스, 그 속성과 메소드로 귀결된다
여러분 자신이나 다른 누군가에 의해
생성된 객체들을 재사용함으로써 작성할 코드의 양을 줄일 수 있다
사용 가능한 객체나 라이브러리들을 보여주는 자료를 이용하라
많은 프로그램, 알고리즘, 작업 등이 다른 누군가에
프로그래밍 언어의 선택
고려 사항
기능
판매자의 능력
인기도
관련 직종
Price
학습의 용이함
성능
맺는 말
프로그램은 여러분이 하라고 시킨 일만 한다
프로그램이 정확하게 동작하지 않는
대부분의 경우는 컴퓨터가 아닌 프로그램 개발자의 잘못에서 기인한다
책임감 있는 프로그래머가 되라
사회에 일조할 수 있는 훌륭한 프로그램을 개발할 수 있다
여러분이 개발한 프로그램이 사회에 심각한 결과를
요약
프로그램은 프로그램을 개발하는 프로그래머만큼 중요하다
프로그램은 도처에서 여러분이 하는 대부분으 일들에 사용된다
프로그램은 해석되거나 컴파일된다
저수준 언어는 컴퓨터가 이해하는 기계어와
보다 밀접하다
요약(계속)
고수준 언어는 인간의 언어와 더 밀접하다
알고리즘은 논리적인 방법으로 문제를 해결하기 위해 개발된다
의사코드는 프로그램이 수행해야 할 일들을 프로그래머가 사람의 언어로 정밀하게 계획하는 방법이다
알고리즘을 개발하는 일은 프로그램
개발에서 가장 중요한 과정이다
요약(계속)
Java는 원래 인터넷을 염두에 두고 설계된 고수준 언어이다
변수는 특정 데이터 타입에 할당되는 임시 저장 위치
계산이나 저장 용도로 사용된다
Java는 수학, 관계, 논리 연산자를 사용한다
프로그램에서 사용되는 제어 구조에는
하향식, 호출, 선택, 반복 등의 네 가지 유형이
요약(계속)
객체-지향 프로그래밍(OOP)은 프로그래머로 하여금 코드를 재사용하여 프로그램의 유지 관리가 효율적으로 이루어지게 한다
OOP는 객체를 생성할 수 있는 템플릿 또는 틀 역할을 하는 클래스를 생성한다
객체는 속성, 메소드, 이벤트 핸들러를 포함한다
Java는 OOP 모델과 밀접하게 연관된다.
훌륭한 프로그래머가 되기 위해서는 실습, 실습,