Search
Duplicate

10-0. 프로그래밍 언어 활용

생성일
2023/07/16 06:35
태그
프로그래밍 언어 활용

1. 데이터 입출력

데이터 입출력 개요

데이터 입출력
키보드로부터 데이터를 입력받아 화면이나 파일로 출력하는 것
이 페이지에서는 C와 Java의 기본적인 프로그램 구조를 이해하고, 다음과 같은 내용이 포함된 프로그램 코드를 읽고 해석하는 방법을 배운다.
헝가리안 표기법
자료형
C언어의 입출력 함수 : scanf, printf
Java의 입출력 함수 : Scanner, nextInt, print, printf, println
서식 지정자와 제어 문자
연산자의 우선순위

C 문제

예제 : 다음은 키보드로 6과 4를 입력 받아 두 수의 덧셈 결과를 출력하는 프로그램이다. 출력 결과를 확인하시오.
#include <stdio.h> int main() { int i, j, k; scanf("%d %d", &i, &j); k = i + j; printf("%d\n", k); } // 10
C
복사

Java 문제

예제 : 다음은 입력받은 정수를 가지고 여러 연산을 수행한 후 출력하는 프로그램이다. 4가 입력되었다고 가정했을 때, 출력 결과를 확인하시오.
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); System.out.printf("a * 3 = %d\n", a*3); System.out.println("a / 2 = " + (a / 2)); System.out.print("a - 1 = " + (a - 1)); sc.close(); } } // a * 3 = 12 // a / 2 = 2 // a - 1 = 3
Java
복사

헝가리안 표기법 (Hungarian Notation)

변수명 작성 시, 변수의 자료형을 알 수 있도록 자료형을 의미하는 문자를 포함하여 작성하는 방법
ex)
int i_inputA : 정수형 변수
double d_Result : 실수형 변수

주요 자료형

주요 서식 문자열

주요 제어 문자

연산자 우선순위

3. 포인터

포인터

C 언어에서는 변수의 주소를 포인터라고 하고, 포인터를 저장할 수 있는 변수를 포인터 변수라고 한다.
변수의 주소인 포인터는 출력할 수도 있고, 포인터가 가리키는 곳에 값을 저장하거나 읽어오는 등 다양한 조작이 가능하다.
이런 기능 때문에 C언어는 주소를 제어할 수 있는 기능이 있다고 말한다.

C 문제

예제 : 다음 C언어로 구현된 프로그램의 실행 결과를 확인하시오.
#include <stdio.h> int main() { int a = 50; int *b = &a; *b += 20; printf("%d, %d\n" a, *b); char *s; s = "selina"; for (int i = 0; i < 6; i += 2) { printf("%c, ", s[i]); printf("%c, ", *(s + i)); printf("%s\n", s + i); } } // 70 70 // s, s, selina // l, l, lina // n, n, na
C
복사
s에 저장된 값은 문자열의 시작 주소이다.
s의 값을 1 증가시킨다는 것은 현재 s가 가리키고 있는 문자의 주소에서 다음 문자의 주소로 가리키는 주소를 증가시킨다는 것이다.
문자 자료형의 자료형 크기는 1 Byte 이므로, 다음 물리적 메모리의 주소는 1 Byte 증가한 곳을 가리키는 것이다.

4. 구조체

구조체

배열이 자료의 형과 크기가 동일한 변수의 모임이라면, 구조체는 자료의 종류가 다른 변수의 모임이라고 할 수 있다.

구조체의 정의

구조체를 정의한다는 것은 int나 char 같은 자료형을 하나 만드는 것을 의미한다.
struct sawon { char name[10]; char jjkwi[10]; int pay; };
C
복사

구조체 변수의 선언

정수형 변수를 사용하려면 ‘int a’와 같이 선언한 후 사용하는 것처럼, 구조체 변수를 사용하려면 먼저 정의된 구조체에 대한 변수를 선언해야 한다.
struct sawon ansan, *seoul;
C
복사

구조체 멤버의 지정

구조체의 멤버는 모든 요소들이 개별적인 이름을 가지고 있으므로, 구조체 멤버를 지정할 때는 구조체 변수와 함께 멤버 이름을 지정해야 한다.
ansan.name = "김한국"; ansan.jikwi = "대리"; ansan.pay = 4000000;
C
복사
‘→’ 에 의한 지정 : 구조체 포인터 변수를 이용해 구조체 멤버를 지정할 때
seoul->name = "홍길동" seoul->jikwi = "과장"; seoul->pay = 5000000;
C
복사

5. 사용자 정의 함수

사용자가 직접 만들어 사용하는 함수

함수 포인터

C언어에서 함수 이름은 해당 함수가 시작되는 주소를 의미한다.
변수의 주소를 포인터 변수에 저장하는 것처럼, 함수의 주소도 함수 포인터에 저장할 수 있을 뿐만 아니라 함수 포인터를 이용하여 함수를 호출할 수도 있다.
함수 포인터를 선언하는 방법은 함수를 선언하는 것과 동일한데, 포인터 변수임을 의미하는 *를 붙여주고, 우선순위를 구분하기 위해 함수 포인터 이름과 함꼐 괄호로 묶어주는 것만 다르다.

6. Java의 클래스

Java 클래스

클래스는 객체 생성을 위한 필드(속성)와 메서드(함수)를 정의하는 설계도로, Java는 아무리 작은 프로그램이라도 클래스를 만들어서 사용 해야한다.

생성자 (Constructor)

객체 변수 생성에 사용되는 메서드
객체 변수를 생성하면서 초기화를 수행한다.
클래스 안에 생성자를 정의하는 문장이 있다면 문장에 적힌 대로 객체 변수를 초기화하면서 생성하지만, 없으면 그냥 객체 변수만 생성하고 제어가 다음 줄로 넘어간다.
ClassA() {, ClassB() {
ClassA(), ClassB() 메서드는 클래스와 이름이 동일한데, 이와 같이 클래스와 이름이 동일한 메서드는 해당 클래스의 객체 변수 생성 시 자동으로 실행되며, 이러한 메서드를 생성자(Constructor)라고 한다.
void prn() {
ClassB 클래스는 ClassA 클래스의 메소드를 사용할 수 있다고 했으므로, ClassB 클래스에는 이름이 같은 메서드 prn()이 2개 존재하게 된다.
이와 같이, 상속으로 인해 동일한 이름의 메서드가 여러 개인 경우, 부모 클래스에서 정의된 prn() 메서드는 자식 클래스의 prn() 메서드에 의해 재정의 되어 자식 클래스의 prn 메서드만 사용되는데, 이를 메서드 오버라이딩(Method Overriding) 또는 메서드 재정의 라고 한다.
void prn(int x) {
메서드 이름이 prn()과 같지만, ‘인수를 받는 자료형의 개수’가 다르므로 서로 다른 메서드이다.
이렇게 이름은 같지만, 인수를 받는 자료형과 개수를 달리하여 여러 기능을 정의하는 것을 오버로딩(Overloading) 이라고 한다.
extends [클래스명]
클래스 정의 시, 상속 받을 클래스를 추가하는 예약어
super()
부모 클래스의 생성자를 호출한다.

객체 변수의 선언

객체 변수를 선언한다는 것은 클래스를 사용하기 위해 객체 변수를 생성하고, 생성된 객체가 있는 곳의 주소를 객체 변수에 저장하는 것이다.
클래스명 객체변수명 = new 생성자();
Java
복사

super, this

super : 상속한 부모 클래스를 가리키는 예약어
this : 현재 실행 중인 메서드가 속한 클래스를 가리키는 예약어

7. Java의 활용

추상 클래스와 형 변환

추상 메서드 (Abstract Method)
자식 클래스에서 재정의해야만 사용할 수 있는 메서드
이러한 메서드를 하나 이상 포함하는 클래스를 추상 클래스(Abstract Class)라고 한다.
이렇게 재정의한 메서드를 부모 클래스의 객체 변수를 통해 사용하려면, 부모 클래스의 객체 변수를 선언할 때 자식 클래스의 생성자를 이용해야 하는데, 이것을 클래스의 형 변환(Casting) 이라고 한다.
// Chicken is animal // Zoo
Java
복사
abstract class Animal {
abstract [클래스 정의부]
abstract는 추상 클래스를 정의하는 명령어로, 추상 클래스 정의 시 꼭 써야 하는 예약어다.
추상 클래스는 내부에 실행 코드가 없는 추상 메서드를 포함하기 때문에, 객체 변수의 생성자로 사용할 수 없다.
abstract void look() {
abstract [메서드 정의부] : abstract는 추상 메서드를 정의하는 명령어로, 추상 메서드 정의 시 꼭 써야하는 예약어다.
추상메서드는 선언만 있고, 내부에 실행 코드가 없는 메서드로, 이후 상속 관계가 설정된 자식 클래스에서 재정의한 후 사용한다.

추상 클래스 (Abstract Class)

추상 메서드(Abstract Method)를 하나 이상 포함하는 클래스
추상 클래스는 내부에 실행 코드가 없는 추상 메서드를 포함하기 때문에, 객체 변수의 생성자로 사용할 수 없다.
추상 메서드는 선언만 있고, 내부에 실행 코드가 없는 메서드로, 이후 상속 관계가 설정된 자식 클래스에서 재정의 후 사용한다.

추상 메서드의 재정의

추상 메서드는 부모 클래스가 자식 클래스에게 주는 의무와 같다.
부모 클래스와 상속 관계에 있다면 반드시 부모 클래스의 추상 메서드를 재정의 해야한다.
그렇지 않으면 오류 발생

형 변환 (Casting)

부모 클래스의 구조를 가지면서 자식 클래스의 속성이나 메서드로 재정의하고 싶을 때 사용하는 기법
만약 부모 클래스의 구조를 가져야 할 이유가 없다면, 부모 클래스를 상속받아 재정의하고 있는 자식 클래스의 구조로 객체 변수를 만들어 사용하면 된다.
예 ) Chicken a = new Chicken();

8. Python의 활용

Python

input() 함수

print() 함수

세트 (Set)

집합과 같은 Python의 자료형으로, 중괄호 ({ })를 이용하여 리스트와 같이 다양한 요소들을 저장할 수 있다.
순서가 정해져 있지 않으며(unordered), 중복된 요소는 저장되지 않는다는 특징이 있다.

Range

연속된 숫자를 생성하는 것
리스트나 반복문에서 많이 사용
range(최종값) range(초기값, 최종값) range(초기값, 최종값, 증가값)
Python
복사

슬라이스 (Slice)

문자열이나 리스트와 같은 순차형 객체에서 일부러 잘라(slicing) 반환하는 기능
형식
객체명[초기위치:최종위치] 객체명[초기위치:최종위치:증가값]
Python
복사
슬라이스는 일부 인수를 생략하여 사용할 수 있다.
객체명[:] or 객체명[::] 객체명[초기위치:] 객체명[:최종위치] 객체명[::증가값]
Python
복사

리스트 관련 주요 메서드

pop(위치)
리스트의 ‘위치’에 있는 값을 출력하고, 해당 요소를 삭제한다.
[10, 11, 12].pop(1) → 11 출력 → [10, 12]
index(값)
리스트에서 ‘값’이 저장된 요소의 위치를 반환한다.
[10, 11, 12].index(12) → 2
count(값)
리스트에서 ‘값’이 저장된 요소들의 개수를 반환한다.
[1, 0, 1, 0, 0].count(0) → 3
extend(리스트)
리스트의 끝에 새로운 ‘리스트’를 추가하여 확장한다.
[’a’, ‘b’].extend([’c’, ‘d’]) → [’a’, ‘b’, ‘c’, ‘d’]
reverse()
리스트의 순서를 역순으로 뒤집는다.
sort()
리스트를 정렬하며, 기본값은 오름차순이다
[2, 1, 3].sort(reverse = True) → [3, 2, 1]
copy()
리스트를 복사한다.
a = [1, 2, 3], b = a.copy()

세트 관련 주요 메서드

pop()
add(값)
update(세트)
세트에 새로운 ‘세트’를 추가하여 확장한다.
remove(값)

9. 절차적 프로그래밍 언어

절차적 프로그래밍 언어

일련의 처리 절차를 정해진 문법에 따라 순서대로 기술하는 언어
프로그램이 실행되는 절차를 중요시한다.
데이터를 중심으로 프로시저를 구현하며, 프로그램 전체가 유기적으로 연결되어 있다.
자연어에 가까운 단어와 문장으로 구성된다.
과학 계산이나 하드웨어 제어에 주로 사용된다.

절차적 프로그래밍 언어의 종류

C
1972년 미국 벨 연구소의 데니스 리치에 의해 개발됨
시스템 프로그래밍 언어로 널리 사용됨
고급 프로그래밍 언어이면서 저급 프로그래밍 언어의 특징을 모두 갖춤
이식성이 좋아 컴퓨터 기종에 관계없이 프로그램을 작성할 수 있음
ALGOL
수치 계산이나 논리 연산을 위한 과학 기술 계산용 언어
PASCAL과 C언어의 모체가 됨
COBOL
사무 처리용 언어
영어 문장 형식으로 구성되어 있어 이해와 사용이 쉬움
4개의 DIVISON으로 구성됨.
FORTRAN
과학 기술 계산용 언어
수학과 공학 분야의 공식이나 수식과 같은 형태로 프로그래밍 할 수 있음

10. 객체 지향 프로그래밍 언어

객체 지향 프로그래밍 언어

현실 세계의 개체를 기계의 부품처럼 하나의 객체로 만들어, 기계의 부품들을 조립하여 제품을 만들듯이 소프트웨어를 개발할 때도 객체들을 조립해서 프로그램을 작성하는 기법
프로시저보다는 명령과 데이터로 구성된 객체를 중심으로 하는 프로그래밍 기법
한 프로그램을 다른 프로그램에서 이용할 수 있도록 한다.

객체지향 프로그래밍 언어의 종류

11. 스크립트 언어

스크립트 언어 (Script Language)

HTML 문서 안에 직접 프로그래밍 언어를 삽입하여 사용하는 언어
기계어로 컴파일되지 않고 별도의 번역기가 소스를 분석하여 동작한다.
게시판 입력, 상품 검색, 회원 가입 등과 같은 데이터베이스 처리 작업을 수행하기 위해 주로 사용한다.
스크립트 언의의 분류
서버용 스크립트 언어
서버에서 해석되어 실행된 후, 결과만 클라이언트로 보냄
ASP, JSP, PHP, Python
클라이언트용 스크립트 언어
클라이언트의 웹 브라우저에서 해석되어 실행됨
JS, VB Script

스크립트 언어의 종류

JavaScript
웹 페이지의 동작을 제어하는 데 사용되는 클라이언트용 스크립트 언어
클래스가 존재하지 않으며, 변수 선언도 필요 없음
서버에서 데이터를 전송할 때 아이디, 비밀번호, 수량 등의 입력 사항을 확인하기 위한 용도로 많이 사용됨
VB 스크립트
마이크로소프트사에서 자바스크립트에 대응하기 위해 제작한 언어
Active X를 사용하여 마이크로소프트사의 애플리케이션을 컨트롤 할 수 있음
ASP (Active Server Page)
서버 측에서 동적으로 수행되는 페이지를 만들기 위한 언어
마이크로소프트사에서 제작
Windows 계열에서만 수행 가능
JSP (Java Server Page)
Java로 만들어진 서버용 스크립트 언어
다양한 운영체제에서 사용 가능
PHP
Linux, Unix, Windows 운용체제에서 사용 가능한 서버용 스크립트 언어
C, Java 등과 문법이 유사하므로 배우기 쉬워 웹 페이지 제작에 많이 사용됨
Python
객체 지향 기능을 지원하는 대화형 인터프리터 언어
플랫폼에 독립적이고 ,문법이 간단하여 배우기 쉬움
쉘 스크립트
유닉스/리눅스 계열의 쉘(Shell)에서 사용되는 명령어들의 조합으로 구성된 스크립트 언어
쉘 스크립트에서 사용되는 제어문
선택형 : if, case
반복형 : for, while, until
Basic
절차 지향 기능을 지원하는 대화형 인터프리터 언어
초보자도 쉽게 사용할 수 있는 문법 구조를 가짐

12. 선언형 언어

선언형 언어

프로그램이 수행해야 할 문제를 기술하는 언어
목표를 명시하고 알고리즘은 명시하지 않는다.

명령형 언어

문제를 해결하기 위한 방법을 기술하는 언어
순차적인 명령 수행을 기본으로 한다.
폰노이만 구조에 개념적인 기초
명령형 언어에는 절차적 언어와 객체 지향 언어가 있다.
FORTRAN, COBOL, C, Java 등

선언형 언어의 종류

13. 라이브러리

라이브러리

프로그램을 효율적으로 개발할 수 있도록 자주 사용하는 함수나 데이터들을 미리 만들어 놓은 집합체
자주 사용하는 함수들의 반복적인 코드 작성을 피하기 위해 미리 만들어 놓은 것이며, 필요할 때는 언제든지 호출하여 사용할 수 있다.

C 언어의 대표적인 표준 라이브러리

stdio.h
데이터의 입출력에 사용되는 기능들을 제공
printf, scanf, fprintf, fscanf, fclose, fopen 등
math.h
수학 함수들을 제공
sqrt, pow, abs 등
string.h
문자열 처리에 사용되는 기능들을 제공
strlen, strcpy, strcmp 등
stdlib.h
자료형 변환, 난수 발생, 메모리 할당에 사용되는 기능들을 제공
atoi, atof, srand, rand, malloc, free 등
time.h
시간 처리에 사용되는 기능들을 제공
time, clock 등

Java의 대표적인 표준 라이브러리

java.lang
자바에 기본적으로 필요한 인터페이스, 자료형, 예외처리 등에 관련한 기능을 제공
import문 없이도 사용 가능
String, System, Process, Runtime, Math, Error 등
java.util
날짜 처리, 난수 발생, 복잡한 문자열 처리 등에 관련된 기능을 제공
Date, Calendar, Random, StringTokenizer 등
java.io
파일 입출력과 관련된 기능 및 프로토콜을 제공
InputString, OutputStream, Reader, Wrtier 등
java.net
네트워크와 관련된 기능 제공
Socket, URL, InetAddress 등
java.awt
사용자 인터페이스(UI)와 관련된 기능을 제공
Frame, Panel, Dialog, Button, Checkbox 등

Python의 대표적인 표준 라이브러리

내장함수
abs(), slice(), pow(), print() 등
os
운영체제와 상호 작용하기 위한 기능 제공
getcwd(), chdir(), system() 등
re
고급 문자열 처리를 위한 기능 제공
findall(), sub() 등
math
복잡한 수학 연산을 위한 기능 제공
cos(), log() 등
random
무작위 선택을 위한 기능 제공
choice(), sample(), random(), randrange() 등
statistics
통계값 산출을 위한 기능 제공
mean(), median(), variance() 등
datetime
날짜와 시간 조작을 위한 기능 제공
today(), date(), strftime() 등

14. 예외 처리

예외 처리 (Exception Handling)

예외가 발생했을 때, 프로그래머가 해당 문제에 대비해 작성해 놓은 처리 루틴이 수행되도록 한 것
예외가 발생했을 때, 일반적인 처리 루틴은 프로그램을 종료시키거나 로그(Log)를 남기는 것이다.
C++, Ada, Java, JavaScript와 같은 언어에는 예외처리기능이 내장되어 있다.
필요한 경우, 조건문을 이용해 예외 처리 루틴을 작성한다.
대표적인 예외의 원인
컴퓨터 하드웨어 문제
운영체제의 설정 실수
라이브러리 손상
사용자의 입력 실수
받아들일 수 없는 연산
할당하지 못하는 기억 장치 접근

ref)