728x90

 

1. 자료와 정보 사이의 관계

 

 

✅ 자료

  • 현실 세계에서 관찰이나 측정을 통해서 수집된 이나 사실
  • 우리의 생활에서 실제로 만질 수 있거나 볼 수 있거나 하는 것(길이, 무게, 부피 등을 측정할 수 있는 대상)에 대해서 물리적인 단위로 표현

 

 

 정보

  • 어떤 상황에 대해서 적절한 의사결정을 할 수 있게 하는 지식으로서 자료의 유효한 해설이나 자료 상호 간의 관계를 표현하는 내용
  • 어떠한 상황에 적절한 결정이나 판단에 사용될 수 있는 형태로 가공되거나 분류되기 위해 '처리 과정'을 거쳐서 정리되고 정돈된 '자료'의 2차 처리 결과물

 

 

 

 

 

 

 

2. 추상화의 개념

 

 추상화

  • 공통적인 개념을 이용하여 같은 종류의 다양한 객체를 정의하는 것
  • 추상화를 통해 간결하게 말하는 사람의 의사를 전달할 수 있게 되는 것
  • 자료의 공통된 것들을 추출해서 하나의 의사전달 집합으로 결정한 것이 추상화!

 

 

 자료의 추상화

  • 다양한 객체를 컴퓨터에서 표현하고 활용하기 위해 필요한 자료의 구조에 대해서 공통의 특징만을 뽑아 정의한 것
  • 자료의 추상화에는 컴퓨터 내부의 이진수 표현 방법, 저장 위치 등은 포함되지 않고 단순하게 개발자의 머릿속에 그림을 그리는 것처럼 개념화하는 것

 

 

 

 

 

 

 

3. 자료구조의 개념

 

 자료구조

자료구조의 종류와 관계

  • 추상화를 통해 알고리즘에서 사용할 자료의 논리적 관계를 구조화한 것
  • 자료의 추상화와 구조화가 적절히 이루어지지 못하면 소프트웨어는 비효율적으로 수행되거나 소프트웨어의 확장성에 문제가 생길 수 있음

 

 

🔸자료구조와 알고리즘의 관계

  • 자료구조: 입력 자료에 대한 추상화된 상태
  • 알고리즘: 컴퓨터가 수행해야 할 명령의 추상화

→ 입력값을 머릿속에서 추상화된 형태(자료구로)로 구조화하고, 수행되어야 할 명령어를 머릿속에서 추상화된 형태(알고리즘)로 체계화

 

 

 

 

 

 

 

4. 자료구조와 알고리즘의 관계

 

✅ 알고리즘

  • 컴퓨터에게 일을 시키는 명령어의 연속된 덩어리
  • 컴퓨터에 의해 수행되기 위해 필요한 명령어의 유한 집합이 사람의 머릿속에 추상화되어 존재하는 것
  • 사람(개발자)이 컴퓨터에게 일을 시키기 위해서 사람의 의도와 명령을 전달하기 위한 방법(언어/글)

 

 

🔸알고리즘의 조건

  • 출력
  • 유효성
  • 입력
  • 명확성
  • 유한성

 

 

 

 

 

 

 

5. 알고리즘 성능의 분석과 측정

 

✅ 알고리즘의 성능 분석

  • 실행시간 분석
    • 알고리즘을 실행하는데 필요한 예측 실행시간을 추정하여 알고리즘의 성능을 분석
  • 실행 시간의 예측
    • 알고리즘의 실행 횟수를 O(n)이라고 표현
    • 같은 O(n)을 가진다는 것은 실행 시간이 동일한 것이 아니라 실행 시간의 증가 경향이 유사하다는 의미

 

  • 실행 메모리 분석
    • 알고리즘을 실행하는데 필요한 공간(메모리)을 추정하여 알고리즘의 성능을 분석함
  • 실행 메모리 예측(1)
    • 알고리즘의 공간 복잡도(space complexity)는 프로그램을 실행시켜서 완료하는데 필요한 총 메모리 공간
    • 고정 공간: 프로그램의 크기나 입출력 횟수에 관계없이 컴파일 시에 결정되어 프로그램의 실행이 끝날 때까지 고정적으로 필요한 메모리 공간
  • 실행 메모리 예측(2)
    • 가변 공간: 프로그램의 실행 과정에서 동적으로 할당되어야 하는 자료 구조와 변수들을 위해 필요한 메인 메모리 공간
    • Sp = Sc + Se (공간복잡도 = 고정공간 + 가변공)

 

 

✅ 알고리즘 성능 측정

  • 성능 측정: 컴퓨터가 실제로 프로그램을 실행하는데 걸리는 시간을 측정하여 알고리즘의 성능을 측정

 

  • 실행 시간의 측정
    • 실제로 실행 시간을 시계로 잰다는 것
    • 실제로 실행될 수 있는 프로그램(실행 파일)이 있어야 함
    • 시스템 시계를 이용

 

 

 

 

728x90

'KNOU > 자료구조' 카테고리의 다른 글

[자료구조] 6. 연결 리스트의 응용  (0) 2022.11.30
[자료구조] 5. 연결리스트  (0) 2022.11.28
[자료구조] 4. 큐  (1) 2022.11.25
[자료구조] 3. 스택  (0) 2022.11.05
[자료구조] 2. 배열  (0) 2022.11.05
728x90
프로그램은 다양한 형태의 데이터를 처리
→ 다양한 형태의 데이터를 효율적으로 처리하기 위해서 대부분의 프로그래밍 언어는 타입이라는 개념을 지원

 

1. 타입의 개요

 

✅ 타입

  • 데이터 집합연산 집합의 결합
    1. 데이터 집합
      • 처리 대상이 되는 데이터의 집합
      • 예) 정수형의 데이터 집합 = {..., -2, -1, 0, 1, 2, ...}
    2. 연산 집합
      • 해당 데이터에 적용 가능한 연산의 집합
      • 예) 정수형 연산 집합 = {+, -, *, /, %, ...}
  • 변수의 속성(변수명, 주소, 값, 타입) 중 한 가지
💡 어떤 변수의 타입이 결정되면 해당 변수는 그 타입이 제공하는 데이터 집합과 연산 집합을 사용하여 값을 조작할 수 있음
  • 서브프로그램의 인자와 반환에도 이용
  • 연산의 안전성 보장을 위해 필요
  • 프로그램은 "타입 안전하다(type safe)"라는 표현
    • 프로그램 내 모든 연산 및 함수에 대해 다음 성질을 만족하는 경우 : 함수 f의 타입이 f(x): A(입력타입) → B(출력타입)라면 모든 a ∈ A에 대해 f(a) ∈ B 이어야 함
    • 타입 오류가 발생하지 않는다는 의미

 

 

 

 

🔸타입 안전성에 따른 PL의 분류

  • 강타입(strongly typed) 언어
    • 모든 타입 오류를 검출하는 언어
    • Haskell, ML, Java(타입 캐스팅을 제외하면)
  • 약타입(weakly types) 언어
    • 타입 오류를 검출, 그러나 일부 타입 오류를 허용
    • C → 공용체, 타입 캐스팅을 통해 타입 검사 회피
  • 무타입(typeless) 언어
    • 타입 선언문도 없고 어떤 대상의 타입도 계속 변경 가능
    • Python 등 대부분의 스크립트 언어

 

 

 

 

 

 

 


2. 타입의 분류

 

✅ 타입 분류 기준

  1. 데이터의 형태에 따라
    • 정수형, 실수형, 문자형, 배열, 구조체
  2. 타입 정의에 사용자 개입 여부에 따라
    • 원시타입(primitive type)
    • 사용자정의타입(user-defined type)
  3. 데이터 요소의 형태에 따라
    • 단순타입(simple type)
    • 복합타입(structure type)

 

 

 

 

 

🔸사용자 개입 여부에 따른 분류

  1. 원시타입
    • 프로그래밍 언어에서 기본적으로 제공하는 타입
    • "미리 정의된(predefined) 타입", '내장 타입(built-in type)"
    • 대부분 언어: 정수형, 실수형, 문자형, 논리형 등
      • C, C++: int, float, char 등
      • Java: int, float, char, boolean 등
  2. 사용자정의타입
    • 사용자가 직접 정의해서 사용하는 타입
    • 배열, 구조체 등
      • C: enum, 배열, struct, union 등
      • C++, Java: enum, 배열, class 등

 

 

 

 

 

🔸데이터 요소의 형태에 따른 분류

  1. 단순타입
    • 데이터 집합의 요소가 하나의 데이터로만 구성
    • "스칼라 타입(scalar type)"
      • 정수형, 실수형, 문자형, 논리형, 열거형 등
      • C++: int, float, char, bool, enum 등
  2. 복합타입
    • 데이터 집합의 요소가 데이터들의 구조로 구성 → 단순타입 혹은 다른 복합타입을 활용
    • "구조타입"
    • 배열, 구조체, 클래스 등
      • C: 배열, struct, union 등
      • C++, Java: 배열, class 등

 

 

 

 

 

 

 


3. 단순타입

 

✅정수형: 정수 데이터를 다루는 타입

 

🔸데이터 집합 

  • {-∞, ..., -2, -1, 0, 1, 2, ..., +∞} 중 일부만 표현
    • 정수 표현을 위해 할당된 메모리의 크기에 의존
  • 표현 가능한 정수 범위에 따라 다양한 타입이 존재
    • C, C++: short, int, long, long long, unsigned short 등
    • Java: byte, short, int, long 

 

C, C++ 정수형
타입명 최소 사용 비트 최소 데이터 집합 범위
short 16 -2^15 ~ (2^15) -1
(-32768 ~ 32767) 
int  16 -2^15 ~ (2^15) -1
long  32 -2^31 ~ (2^31) -1
(약 -21억 ~ 약 21억)
long long  64 -2^63 ~ (2^63) -1
unsigned short  16 0 ~ (2^16) -1
(0 ~ 65535)
unsigned int 16 0 ~ (2^16) -1
unsigned long  32 0 ~ (2^32) -1
unsigned long long 64 0 ~ (2^64) -1
  • signed(부호있는 정수): 주어진 비트 중 맨 왼쪽 첫번째 비트를 부호 비트로 사용
  • unsigned(부호없는 정수): 주어진 비트 모두를 사용(= 0과 양의 정수만 나타낼 수 있음, 음수 표현 불가)

 

 

Java 정수형
타입명 사용 비트 데이터 집합 범위
byte 8 -2^7 ~ (2^7)-1
short 16 -2^15 ~ (2^15)-1
int 32 -2^31 ~ (2^31)-1
long 64 -2^63 ~ (2^63)-1
  • 각 타입의 사용 비트가 고정됨
  • unsigned가 붙는 정수형이 없음

 

 

 

 

 

🔸연산 집합

  1. 사칙연산: 덧셈, 뺄셈, 곱셈, 나눗셈 → 연산 결과 값도 정수형 (예: 10/3 = 3)
    • C, C++ 에서 16 비트로 구현된 short(-32768 ~ 32767)타입의 경우
      • 32767+1 == 최대값+1 → 최소값(-32768)
      • -32768-1 == 최소값-1 → 최대값(32767)
      • 특정 타입의 데이터를 가지고 연산을 하면 그 연산의 결과도 항상 해당 데이터 집합 안에 존재해야 됨!
  2. 나머지 연산: mod, % (예: 7 mod 3 = 1)
  3. 비트 연산: ^, &, | 등
  4. 관계 연산: <, >, <=, >=, == != 등 → 연산의 결과 값은 논리형

 

 

 

 

 

✅ 실수형: 실수 데이터를 다루는 타입

 

🔸데이터 집합

  • -100.05, -8.7, 0.0, 1.234, 256.3500187  등
  • 전체 실수 중 사용 비트의 크기에 따라 일부 범위의 실수만 표현 가능
  • 일반적으로 부동소수점 수(floating-point number) 로 표현

 

 

 

📌 부동소수점 수

출처: 방송통신대학교

  • 부호: 양수 = 0, 음수 = 1
  • 지수부: 지수 + bias
    • bias는 지수부의 크기에 따라 결정됨
    • (2^m-1)-1
  • 가수부: 소수점 이하 부분만 표현
    • 가수부는 1.xxxx 형태를 갖도록 정규화를 거침

 

💡정수 5 vs 실수 5.0

short a = 5; //0 0000000000000101
float b = 5.0; //0 101 0100000000000000000

 

 

 

🔸연산 집합

  • 사칙연산: 덧셈, 뺄셈, 곱셈, 나눗셈 → 연산 결과 값도 동일한 실수형 (예: 1.5 + 2.5 = 4.0)
    • float의 경우, 5E37*10.0 == 최대값 초과 → 무한대 inf
  • 관계 연산: <, >, <=, >=, ==, != 등 → 연산 결과 값은 논리형

 

 

 

 

 

✅ 문자형: 하나의 문자 데이터를 다루는 타입 ('A', 'a'...)

 

🔸데이터 집합

  • ASCII: 특수기호, 구두점, 숫자, 영어 대소문자 등 128개의 문자로 구성
    • C, C++: char == 8비트
  • 유니코드: 전 세계의 다양한 문자 표현 가능
    • Java: char == 16비트

 

 

 

🔸연산 집합

  • 관계 연산: 연산의 결과 값은 논리형
    • 'A' < 'B' == true
  • C, C++는 char 타입을 8비트 정수형으로 간주 → 사칙연산, 비트연산 등 가능
    • 'A' + 32 == 65+32 → 97 == 'a'
    • 'a' - 32 == 97-32 → 65 == 'A'

 

 

 

 

 

✅ 논리형: 참과 거짓의 논리 데이터를 다루는 타입

 

🔸데이터 집합

  • true(참), false(거짓)
    • C: _Bool = {0, 1}
    • C++: bool = {true, false}
    • Java: boolean = {true, false}

 

 

 

🔸연산 집합

  • 논리곱(and), 논리합(or), 논리부정(not) 등
    • 연산 결과 값도 동일한 논리형 → ture && false == false

 

 

 

 

 

✅ 열거형: 순서 관계가 있는 이름들을 데이터로 다루는 타입

 

🔸데이터 집합

  • 사용자가 직접 지정한 이름들
  • 각 이름은 0이상의 정수와 대응 → 순서 관계 성립
    • 예) C, C++ enum 타입
/*
열두 달의 이름
개발자 입장에서는 이름을 사용했지만 컴퓨터 내부에서는 나열된 순서대로 이름마다 숫자를 대응

enum Year {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
*/
enum Year {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};

//각 이름에 대응되는 정수도 사용자가 지정 가능
enum Year {Jan=1, Feb, Mar, Apr=10, May=15, Jun=1, Jul, Aug, Sep, Oct, Nov, Dec};

 

 

 

🔸연산 집합

  • 관계 연산: 연산 결과 값은 논리형
    • C: 대응되는 정수 값에 대한 사칙연산도 가능
#include <stdio.h>
int main()
{
	enum Year {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
    enum Year Go;
    for(Go=Jan; Go<=Dec; Go++)
    	printf("%d\n", Go);	// 출력: 0 1 2 3 4 5 6 7 8 9 10 11
	return 0;
}

 

 

 

728x90
728x90
*JSP 개발 환경
1. Java SE Development Kit 16(JDK 16)
2. IDE: Eclipse
3. Server: Tomcat9

1. JDK 설치

  • JDK: [Java VM, 핵심 API], 개발 툴(컴파일러,...) 제공
  • JRE: Java VM, 핵심 API
    1. 오라클-JDK: 추가적 기능이 더해진 버전(상용 목적으로 사용할 때 유료)
    2. 오픈-JDK: 순수한 자바 규격만을 구현한 버전(목적에 상관없이 무료)

 

🔸환경 변수 설정

  • 환경 변수 JAVA_HOME 생성
    •  C:\java\jdk16
  • 기존 변수 Path 수정
    •  C:\java\jdk16\bin

 

 

 

 

 

 

 


2. Eclipse 설치와 기본 사용법

 

  • Eclipse IDE
    • 통합 소프트웨어 개발 환경
    • Java로 작성된 프로그램이지만 Java 외에도 다양한 언어를 지원하는 IDE
    • 무료 오픈 소스 소프트웨어로 플러그인을 추가하여 기능을 확장할 수 있음
    • 오픈 소스 커뮤니티 eclipse.org의 프로젝트
  • 이클립스 설치 후, 실행 시 작업 공간(workspace) 지정
  • 작업 공간(workspace): 개발물이 저장되는 디렉터리

 

 

 

 

 

 

 


3. Tomcat 설치

  • Apache Tomcat
    • Apache Software Foundation의 오픈 소스 웹 컨테이너
    • Java 서블릿과 JSP 규약을 구현하고 있음
    • 기본적인 웹 서버 기능 포함
  • Windows 설치 방법에 따라 Tomcat 실행 방법이 달라짐
    1. zip 파일 다운로드
    2. 윈도우 서비스 인스톨러 다운로드
      • 설치 파일은 관리자 모드로 실행해서 설치

 

 

 

🔸압축 파일로 설치한 경우

  • CATALINA_HOME 환경 변수 설정
  • Tomcat 시작
    • [설치폴더]\bin\startup.bat를 실행
    • Tomcat 작동 확인 방법
      • Tomcat의 기본 포트: 8080
      •  웹 브라우저에서 Tomcat에 요청을 보내 응답을 확인(http://localhost:8080)
  • Tomcat 종료
    • [설치폴더]\bin\shutdown.bat를 실행

 

 

 

 

 

 

 


4. 웹 프로젝트 만들기

- 이클립스를 이용한 웹 프로그램 개발 순서

  1.  톰캣(웹 컨테이너) 등록하기: Tomcat을 Server로 등록
  2. 동적 웹 프로젝트(Dynamic Web Project)를 생성
  3. 서블릿 또는 JSP페이지를 작성하고 이를 실행하여 테스트 함
  4. 실제 서비스를 위해 웹 프로젝트를 war 파일 형태로 톰캣에 배포

 

 

 

- WAR 파일로 배포하기

  • 웹 프로젝트를 웹 컨테이너에 배포함
  • URL로 접근할 수 있도록 웹 애플리케이션(HTML, JSP, 서블릿, Java 소스 등의 묶음)을 톰캣에 등록하는 일
    • http://localhost:8080/프로젝트명/xxx.jsp  <- 브라우저에서 이와 같은 주소로 접속

 

 

 

- WAR(Web Application aRchive) 파일

  • 웹 프로젝트를 압축한 파일
  • 웹 애플리케이션을 웹 서버로 내보내기 위해 WAR 파일을 사용함
    • HTML, JSP, 서블릿, 리소스와 소스 파일 등
    • 웹 서비스 제공을 위한 폴더 구조를 가짐
  • Eclipse와 서블릿 표준 규약에서 웹 프로젝트의 디렉터리 구조가 다름
    • 예) java 소스의 클래스 파일 저장 경로
      • Eclipse: [웹프로젝트폴더]\bin\classes\
      • 톰캣: [웹프로젝트폴더]\WEB-INF-\classes\

 

 

 

 

 

728x90

'KNOU > JSP프로그래밍' 카테고리의 다른 글

[JSP프로그래밍] 1. 웹과 자바  (0) 2022.10.17
728x90

 

1. 웹 관련 용어

 

✅ 웹

 

🔸웹의 의미

  • 팀 버너스 리가 제안한 인터넷 기반의 정보 공유 서비스
    • = World Wide Web, WWW, W3
    • 인터넷 상에 분산되어 존재하는 다양한 정보를 통일된 방법으로 찾아볼 수 있게 하는 정보 서비스
  • 인터넷 기반의 전 세계적인 정보 공유 공간
    • 분산된 웹 서버에 존재하는 하이퍼텍스트(hypertext) 문서들이 서로 연결된 시스템

 

🔸하이퍼텍스트

  • 웹 상에 존재하는 문서 형태로서 텍스트 외에 이미지, 동영상 등의 멀티미디어 요소를 포함 → 구조화된 문서
  • 하이퍼링크(hyperlink)를 통해 다른 하이퍼텍스트와 연결됨 = 문서와 문서가 연결된 구조
  • 웹 브라우저를 이용해 하이퍼텍스트를 볼 수 있음
  • HTML로 표현되며 HTTP 프로토콜을 사용하여 전송됨

 

🔸W3C

  • World Wide Web Consortium의 약자
  • 국제 웹 표준화 기구 => HTML, HTTP, XML 등의 웹 관련 기술 관리

 

 

 

 

 

✅ 웹 문서

 

1. 정적 웹 문서

출처: 방송통신대학교

  • 정적인 텍스트로 문서의 내용이 바뀌지 않음
  • 클라이언트가 서버에게 정적 웹 문서를 요청하면, 서버는 해당 문서를 찾아서 전달함
  • 정적 웹 문서를 요청하면 항상 동일한 결과가 전달됨

 

 

 

2. 동적 웹 문서

출처: 방송통신대학교

  • 동적 웹 문서를 사용하여 최종 결과가 동적으로 만들어짐 => 클라이언트 측 처리와 서버 측 처리 방식이 있음
  • JSP는 동적 웹 문서를 작성하는 기술

 

 

 

 

 

 

 

 


2. 웹 애플리케이션의 실행과 구성 요소

 

  • 웹 애플리케이션: 웹에서 실행되는 응용 프로그램
  • 웹 애플리케이션의 구분
    1. 클라이언트 측 실행 / 서버 측 실행
    2. 컴파일 방식 / 비컴파일 방식

 

 

 

🔸웹 서비스 제공과 구성 요소

출처: 방송통신대학교

  • 웹 클라이언트(브라우저): 웹 브라우저는 웹 서버에 요청을 보내고 응답 결과를 출력
  • 웹 서버: 클라이언트의 요청을 처리하도록 프로세스를 관리하고 요청을 처리한 결과를 클라이언트에게 보냄
  • 웹 애플리케이션 서버(WAS, 웹 컨테이너): 웹 애플리케이션의 실행 환경으로 JSP 프로그램을 실행시키고 결과를 웹 서버에 전달
  • 데이터베이스: 웹 서비스 수행에 필요한 데이터를 저장하고 제공

 

 

 

 

 

✅ 웹 애플리케이션과 실행 위치

클라이언트 측 실행 서버 측 실행
- 웹 문서에 동적 요소를 포함 시켜 클라이언트에게 전송
- 웹 브라우저가 해석하여 페이지를 생성
- 애플릿, Javascript, 플래시 
- 단점: 보안의 문제
- 서버에서 실행되어 응답 문서를 동적으로 생성
- 웹 애플리케이션 서버가 수행한 결과가 브라우저에 전송됨
- 서블릿, JSP, ASP, PHP, CGI 방식
- 단점: 서버의 부담

 

 

 

 

 

✅ 웹 애플리케이션의 구현 방식

컴파일 방식 비컴파일 방식
- 컴파일 과정을 통해 실행 파일이나 바이트 코드가 만들어져 사용됨
- Java, 서블릿, JSP
- Perl, C, C++을 이용한 *CGI 방식
- 매 요청마다 스크립트를 해석하여 실행하는 방식
- Javascript는 클라이언트에서 실행되는 스크립트 언어

 

 

 

🔸CGI(Common Gateway Interface)

출처: 방송통신대학교

  • 동적으로 웹 페이지를 생성하기 위한 방식 중 하나
    • 고급 언어 프로그램을 실행시켜 HTML 코드를 생성한 후 전달함

출처: 방송통신대학교

  • 웹 서버가 응용 프로그램을 직접 호출
    • 클라이언트의 요청이 있으면 해당 프로그램을 실행시키기 위해 개별 프로세스를 생성함 → 동일한 CGI를 요청해도 요청의 개수만큼 프로세스를 생성하므로 웹 서버에 부하를 줌

 

 

 

🔸WAS(Web Application Server)

출처: 방송통신대학교

  • 서버의 성능을 개선하기 위해 웹 서버의 기능을 분리
  • 웹 서비스의 처리를 위해 동적 페이지를 만들거나 비지니스 로직을 처리(동적 웹 서비스를 담당하는 서버)
  • 웹 애플리케이션을 실행하고 관리하는 별도의 전담 프로그램
    • 모든 요청에 대해 매번 프로세스를 생성하지 않고, 하나의 자바 가상 기계 내에서 수행함
    • 요청을 처리하기 위해 스레드를 생성
  • 웹 페이지 생성 외에도 많은 기능을 수행: API제공, 부하 균형(로드 밸런싱), 고장 조치 등

 

 

 

🔸웹 서버

출처: 방송통신대학교

  • 클라이언트로부터 요청을 받고 결과를 전달하는 기능
    • 예) Apache HTTP Server, IIS, NginX
  • HTTP 프로토콜을 사용하여 클라이언트와 통신함
    • HTTP는 클라이언트와 웹 서버 간에 웹 문서를 전송하기 위한 통신 규약이며 웹 서버를 HTTP 서버라고 함
  • 구체적인 기능
    • 클라이언트가 요청한 웹 문서를 찾아 전달
    • 클라이언트 요청에 대한 기본적 사용자 인증을 처리
    • 문제가 있으면 정해진 코드 값으로 응답
    • 프로그램 실행 요청이 있으면 처리 후 그 결과를 전달

 

 

 

 

 

 

 


3. JSP와 웹 컨테이너

 

✅ 서블릿

출처: 방송통신대학교

  • Server + Applet = Servelt
    • 웹 페이지를 동적으로 생성하기 위한 서버 측 Java 클래스
    • Java 언어에 기초한 웹 프로그램 개발 기술
  • Java 언어로 서블릿 클래스를 만들고, 컴파일된 바이트 코드를 서버에 탑재하여 웹 서비스를 제공 → 소스를 수정하면 다시 컴파일하여 서버에 탑재해야 함

 

 

 

 

 

✅ JSP(JavaServer Pages)

JSP의 처리과정

  • 서블릿 대신에 사용할 수 있는 스크립트 형식의 언어 => HTML 페이지 내에 삽입됨
  • JSP 페이지는 서블릿으로 변환됨
    • 웹 애플리케이션 서버가 자동으로 JSP페이지를 변환하고 컴파일하여 웹 서비스를 제공
  • Java EE를 구성하는 기술 중 하나 (예:JSTL)
  • 특징
    • 스크립트 언어로 HTML 페이지에 삽입됨
    • Java 언어의 특성을 활용
    • 표현 언어, 표현식, 액션 태그 등의 스크립트적 요소를 제공
    • 다양한 개발 환경이 오픈 소스로 제공됨
    • JSP는 오픈 소스 형태로 운영되므로 다양한 기술이 지원됨
    • JSP 기술은 플랫폼에 독립적(.NET 기술은 개발과 운용 환경에 제약이 있음)

 

 

 

 

 

✅ 웹 컨테이너(=WAS)

  • 웹 컴포넌트를 저장하고 서블릿의 생명주기를 관리 => 클라이언트의 서블릿 요청을 실행시키는 역할
  • 서블릿 컨테이너라고도 함
    • Java로 구현된 서블릿 엔진(서블릿 실행 환경)
    • JSP를 서블릿으로 변환하는 기능을 포함
  • Tomcat, WildFly, WebLogic, WebSphere, JBoss 등

 

 

 

 

 

🔸웹 서버에서 서블릿이 실행되기 위한 환경

  • 웹 서버
  • 자바 실행 환경(JDK)
  • 서블릿 컨테이너(예: Tomcat)

 

 

 

 

 

🔸JSP 컨테이너

  • JSP 페이지를 서블릿 프로그램으로 변환
  • 대부분의 서블릿 컨테이너는 JSP컨테이너 기능을 포함
  • JSP 컨테이너 자체가 서블릿으로 구현되어 있으며 서블릿 컨테이너에 의해 실행됨

 

 

 

 

 

 

 


4. HTTP 프로토콜

 

✅ HTTP 프로토콜

  • 웹 서버와 클라이언트가 통신하는 규약으로 TCP 프로토콜에 기초한 애플리케이션 계층 프로토콜
  • Connection oriented & Stateless 특성
    • 요청을 위해 접속을 해야 함
    • 서버가 응답한 후에 서버는 클라이언트의 상태를 유지하지 않음
    • 웹 서버의 부담이 줄어드나 상태 관리를 위해 쿠키 세션 등이 필요
  • HTTP 요청과 응답 절차
    • 연결 설정 → 요청 메세지 전송 → 응답 메세지 전송 → 연결 끊기

 

 

 

 

 

 

✅HTTP 요청 메세지 구조

 

1. 시작 라인: 요청 방식, URI, 버전 번호

  • GET: 웹 서버에게 요청 대상에 대해 처리 방식을 지정
  • /index.html: 서버에 존재하는 파일의 URI
  • HTTP/1.1:HTTP의 버전

 

2. 요청 헤더

  • 한 라인에 하나씩 헤더 정보를 기술
  • 각 라인은 "헤더필드이름:값" 형식으로 구성됨
  • 요청 헤더의 끝에 공백 라인을 둠

예) 요청 헤더

3. 요청 메세지 몸체

  • POST 요청 방식에서만 의미있음
  • HTML 폼에서 작성한 데이터를 POST 방식으로 전송할 때 사용

 

 

 

 

 

✅ HTTP 응답 메세지 구조

  • 시작 라인, 응답 헤더, 응답 몸체로 구성
    • 시작 라인 구성: HTTP 버전, 서버의 응답 코드, 설명

출처: 방송통신대학교

🔸서버의 응답 코드와 설명

200 OK 클라이언트 요청이 성공적으로 끝남
400 Bad Request 잘못된 요청
401 Unauthorized 인증 오류
403 Forbidden 사용자 허가 모드 오류
404 Not Found 요청한 문서가 존재하지 않음
405 Method Not Allowed 요청한 방식을 지원하지 않음
500 Internal Sever Error 서버에서의 실행 오류
503 Server Unavailable 일시적으로 요청을 처리할 수 없음

 

 

 

 

 

728x90

'KNOU > JSP프로그래밍' 카테고리의 다른 글

[JSP프로그래밍] 2. 개발 환경 설정하기  (0) 2022.10.30
728x90

 

1. 영역의 개요

 

✅ 변수의 영역(scope)

출처: 한국방송통신대학교

  • 프로그램에서 변수를 사용할 수 있는 범위
  • 변수에 값을 대입하거나 값을 읽어올 수 있는 범위
  • 영역의 시작: 변수 선언 위치
  • 수명의 시작
    • 수명: 변수가 메모리를 할당받는 기간 
    • 동적 바인딩: 변수 선언 위치
    • 정적 바인딩: 프로그램이 수행되는 시점

 

 

 

 

 

✅ 블록(block)

출처: 한국방송통신대학교

  • 프로그램 문장들의 묶음
  • 영역을 구분해주는 단위
  • 블록의 표현이나 적용 기준은 언어별로 다름
    • Algol 60: 복합문(begin ~ end)
    • C, C++, Java: 복합문({~}), 함수, 클래스
    • Pascal: 주 프로그램, 서브 프로그램 → 복합문(begin~end)는 블록이 아님
  • 블록 안에서 변수 선언이 가능 (※해당 변수 영역의 끝: 블록이 끝나는 지점)

 

 

 

 

 

✅ 블록과 변수

출처: 한국방송통신대학교

  • 지역변수(local variable): 블록 안에서 선언된 변수
  • 비지역변수(non-local variable): 블록 밖에서 선언되었지만 블록 안에서 사용될 수 있는 변수
  • 지역변수와 비지역변수는 상대적인 개념

 

 

 

 

 

✅ 참조 환경(reference environment)

출처: 한국방송통신대학교

  • 프로그램의 한 위치에서 사용할 수 있는 모든 변수의 모음 
  • 해당 위치의 모든 지역변수와 비지역변수로 구성
  • 위 그림은 정적 영역 규칙을 적용(동적 영영 규칙을 적용할 경우 다른 결과를 얻을 수 있음)

 

 

 

 

 

 


2. 영역 규칙

 

✅ 영역 규칙(scope rule)

  • 변수의 참조 위치를 결정하는 방법
    1. 정적 영역 규칙
    2. 동적 영역 규칙
  • 자유변수(free variable)
    • 현재 블록에서 선언되지 않고 사용하려는 변수
    • 영역 규칙에 따라 참조 위치를 결정
      1. 참조 위치를 찾은 경우(선언된 경우): 비지역변수
      2. 참조 위치를 찾지 못한 경우: 오류

Sub2 블록에 선언되지 않은 A는 자유변수(비지역변수)

 

 

 

 

 

✅ 정적 영역 규칙 = 사전적 영역 규칙(lexical scope rule)

: 블록들의 정적 내포 관계(블록의 문맥적인 포함 관계)를 이용

 

 

 

🔸용어

블록 C의 부모: B / 블록 C의 조상: B, A

  • 정적 조상(static ancestors): 현 블록을 문맥적으로 포함하는 모든 블록들
  • 정적 부모(static parent): 현 블록에 가장 가까운 정적 조상

 

 

 

🔸적용 방법

  1. 사용하려는 변수의 이름에 대한 선언이 현재 블록 안에 존재 → 지역변수
  2. 자유변수라면 현재 블록의 정적 부모에 대해
    • 자유변수 이름에 대한 선언 존재 → 비지역변수
    • 선언이 없으면 그 블로그이 정적 부모에 대해 반복
  3. 가장 바깥 영역까지 선언을 찾지 못함 → 오류

 

 

 

 

✅ 영역 구멍(scope hole)

  • 비지역변수가 같은 이름의 지역변수 때문에 보이지 않는 영역

 

 

 

 

 

✅ 동적 영역 규칙

  • 블록들의 동적 내포 관계(서브프로그램의 호출 관계)를 이용
  • 프로그램 수행시점에서만 판단 가능

 

 

 

🔸적용 방법

  1. 사용하려는 변수의 이름에 대한 선언이 현재 블록 안에 존재 → 지역변수
  2. 자유변수라면 현재 블록을 호출한 블록에 대해 
    • 자유변수 이름에 대한 선언이 존재 → 비지역변수
    • 선언이 없으면 그 블록을 호출한 블록에 대해 반복
  3. 최종 호출자 영역까지 선언을 찾지 못함 → 오류

 

 

 

 

 

🔸영역 규칙의 비교

정적 영역 규칙 동적 영역 규칙
- 컴파일 시점에서 변수의 참조 위치를 결정
- 정적 타입 검사 가능, 빠른 수행 속도
- Algol 60, Pascal, C/C++, Java, Python 등 대부분의 언어
- 수행 시점에 변수의 참조 위치를 결정
- 정적 타입 검사 불가능, 느린 수행 속도
- LISP 등의 인터프리터 방식 언어

 

 

 

 

 

 

 


3. 이름 공간

 

✅ 전역 변수(global variable)

출처: 한국방송통신대학교

  • 어떤 블록에도 포함되지 않는 곳에서 선언된 변수
  • 영역: 프로그램 전체
  • 모든 블록에서 비지역변수로 취급

 

 

 

 

 

🔸영역 구멍에서의 전역변수 사용

  • 영역 구멍: 어떤 블록 내에서 전역변수 이름과 동일한 지역변수를 사용할 경우, 지역변수가 우선권을 가지기 때문에 전역 변수는 해당 블록 내에서 보이지 않음
  • 영역 연산자(scope operator)를 이용하면 해결 가능
    • C++의 영역 연산자 → ::

출처: 한국방송통신대학교

 

 

 

 

 

✅ 이름 공간(name space)

출처: 한국방송통신대학교

  • 관련성이 높은 변수와 함수를 하나의 묶음으로 관리하는 영역
  • 영역 자체의 이름을 가짐

 

 

 

🔸이름 공간 내의 변수/함수를 이름 공간 밖에서 사용하는 방법

출처: 한국방송통신대학교

  1. 이름 공간의 이름과 영역 연산자 ::를 이용
  2. 예약어 using을 이용

 

 

 

🔸이름 공간과 영역 구멍

  • 이름 공간의 변수와 지역변수가 중첩된 경우 → 영역 연산자를 이용해서 해결

 

 

 

 

728x90
728x90
💡 현실 세계에서 다루는 데이터들을 추상화(자료구조화)하기 위해서는 트리와 그래프가 훨씬 더 많이 사용됨 

1. 트리 용어 정의

 

✅ 트리

  • 데이터 간의 관계를 나타내는 비선형 자료구조(데이터 간의 관계가 1:n) ↔ (선형 자료구조: 데이터 간의 관계가 1:1:1)
  • 노드(node)라고 불리는 부분과 노드를 연결하는 가지(branch, edge)로 구분됨
  • 노드 사이에는 계층적인 관계성을 가짐

 

출처: 한국방송통신대학교

트리 용어 정리
노드(node) - 정보 항목을 의미함
루트(root) - 빈 트리가 아닌 경우에 맨 꼭대기에 있는 하나의 노드
차수(degree) - 각 노드에 있는 가지의 수
잎 노드(leaf node) = 단말 노드(terminal node)
- 노드의 차수가 0인 노드
내부 노드(internal node) = 비단말 노드(non-terminal node)
- 루트 노드와 단말 노드를 제외한 나머지 노드
조상(선조) 노드 - 루트 노드로부터 어떤 노드 X까지의 경로(가지들의 모음) 상에 존재하는 모든 노드를 X의 조상 노드라고 함

예) K의 조상 노드 = E, B, A
자손(후손) 노드 - 어떤 노드 X에서 단말 노드까지의 경로 상에 존재하는 모든 노드를 자손 노드라고 함

예) C의 자손 노드 = G, H, I, L, M
레벨(level) - 루트 노드로부터의 거리(가지의 수)를 의미함
트리의 깊이(depth)/높이(height) - 루트 노드로부터 가장 긴 경로에 있는 단말 노드의 레벨에 1의 값을 더한 것(예: 깊이:4)
서브 트리(subtree) - 특정 노드를 루트 노드로 하고, 그 아래에 있는 열결된 구조의 트리
숲(forest) - n개의 서브 트리를 가진 트리에서 루트 노드를 제거해서 얻을 수 있는 분리된 서브 트리의 집합

(위 트리의 경우 3개의 숲을 가질 수 있음)

 

 

 

 

 

 


2. 이진 트리

 

✅ 이진 트리(binary tree)

출처: 한국방송통신대학교

  • 트리 중에서 차수가 2인 트리
  • 모든 노드의 차수는 최대 2를 넘지 않음
  • 모든 노드는 최대 2개의 서브 트리를 가짐(각 서브 트리는 왼쪽/오른쪽 서브 트리로 구분)
  • 왼쪽 노드와 오른쪽 노드에 '순서'의 의미를 부여함 → 왼쪽과 오른쪽을 구분함으로써 편하게 의사소통하고 효율적으로 알고리즘을 만들 수 있어!
  • 이진 트리의 각 서브 트리는 다시 이진 트리가 됨

 

 

 

 

 

✅ 이진 트리의 높이

  • N개의 노드를 가진 이진 트리의 높이를 계산으로 구할 수 있음
  • 트리는 높이가 낮을 수록 검색 속도가 빨라짐(비교 횟수가 줄어듬)
최대 높이 최소 높이



- N으로 노드의 개수와 같음


- 최대 2개의 자식 노드를 갖는 경우로서 [log₂ N]+1이 높이(레벨+1)가 됨

 

 

 

 

 

✅ 이진 트리 순회 연산 (암기)

  • 일정한 순서에 따라 트리에 있는 각 노드를 한 번씩 방문하는 것
    1. 전위 순회: DLR
    2. 중위 순회: LDR
    3. 후위 순회: LRD

출처: 한국방송통신대학교

Data Left Right (전위 순회; preorder)


A B D H I E J K C F L M G N O
루트노드 방문 → 왼쪽 서브 트리 방문 → 오른쪽 서브 트리 방문
Left Data Right (중위 순회; inorder)

H D I B J E K A L F M C N G O

왼쪽 서브트리 방문 → 루트 노드 방문 → 오른쪽 서브 트리 방문
Left Right Data (후위 순회; postorder)

H I D J K E B L F M N O G C A
왼쪽 서브 트리 방문 → 오른쪽 서브 트리 방문 → 루트 노드 방문 

 

 

 

✅ 포화 이진 트리(full binary tree)

출처: 한국방송통신대학교

  • 깊이가 k인 이진 트리 중에서 노드의 개수가 2^k - 1개인 이진 트리
    • 즉, 깊이가 k인 이진 트리가 가질 수 있는 노드의 최대 개수는 2^k - 1개이며, 단말 노드의 개수가 2^k-1개
  • 각 레벨에서 빈자리가 없이 노드를 모두 가지고 있음
  • 모든 내부 노드들은 2개의 자식 노드를 가짐

 

 

 

✅ 완전 이진 트리(complete binary tree)

출처: 한국방송통신대학교

  • 트리의 최대 레벨이 k 일 때, 레벨 k-1까지는 포화 이진 트리를 형성하고, 레벨 k에서는 왼쪽부터 오른쪽으로 채워진 트리

포화 이진 트리 &sub; 완전 이진 트리

  • 총 노드의 개수가 2^k+1 -1을 초과하지 않으면서, 포화 이진 트리의 노드 번호에 해당하는 연속적인 번호를 갖는 트리
  • 포화 이진 트리는 완전 이진 트리에 속함 ↔ 완전 이진 트리는 포화 이진 트리가 될 수 없음 

 

 

 

✅ 경사 이진 트리(skewed binary tree)

출처: 한국방송통신대학교

  • 한 쪽(왼쪽/오른쪽) 방향으로만 가지가 뻗어 나간 경사 이진 트리
  • 검색 시간 등 여러 가지 측면에서 수행 시간을 늘려나감 = 비효율적

 

 

 

 

 

 

 


3. 그래프

 

✅ 그래프 G

  • 정점(vertex)들의 유한 집합 V와 두 개의 정점을 연결하는 간선(edge)들의 유한 집합 E로 정의
  • G=(V,E)로 표시

 

무방향 그래프(undirected graph) 방향 그래프(directed graph, digraph)
간선이 방향성이 없는 간선으로 연결된 그래프

V(G1)={1,2,3,4}
E(G1)={(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)} 

*정점의 차수(degree): 정점에 부수된 간선의 개수
두 정점을 연결하는 간선이 방향성을 가지는 간선으로 연결된 그래프

V(G2)={1,2,3,4}
E(G2)={<1,2>,<1,3>,<3,2>,<3,4>,<4,1>,<4,2>}

*정점의 차수(degree)
- 진입 차수(indegree): 다른 정점에서 해당 정점을 향하는 간선의 개수
- 진출 차수(outdegree): 해당 정점으로부터 다른 정점으로 향하는 간선의 개수

 

 

 

🔸용어 정리

  • 두 정점이 간선으로 직접 연결되어 있으면 두 정점은 인접(adjacent)해 있다고 하며, 해당 간선은 두 정점에 부수(incident) 되었다고 함
    • '인접한다': 정점 간의 관계
    • '부수되었다': 정점과 간선 간의 관계
  • 경로(path): 간선으로 연결된 정점들의 순차적 나열을 의미함
  • 경로의 길이: 경로에 포함된 간선의 개수
  • 단순 경로(simple path): 경로 상에 존재하는 정점들이 모두 다른 경로
  • 사이클(cycle): 세 개 이상의 정점을 가진 경로 중에서 시작 정점과 끝 정점이 같은 경로 (예: 1,2,1 또는 1,2,3,4,2,1)
  • 단순 사이클(simple cycle): 시작 정점과 끝 정점을 제외하고 모든 정점이 다른 사이클 (예:1,2,3,4)
  • '두 정점은 서로 연결되었다': 두 정점 사이에 경로가 존재함
  • '그래프가 서로 연결되었다': 무방향 그래프에서 서로 다른 모든 정점들 사이에 경로가 존재함
  • 방향 그래프에서 적어도 두 정점 사이에 어느 한 쪽으로만 경로가 존재할 때, 약하게 연결되었다고 함
  • 트리는 그래프의 특수한 형태로 봄
    • 무방향 그래프에서 모든 정점이 서로 연결되어 있으면서 사이클이 존재하지 않는 그래프를 트리라고 함

 

 

 

 

 

 

 

4. 그래프의 표현

 

인접 행렬(adjacency matrix) 인접 리스트(adjacency list)
출처: 한국방송통신대학교
  • 그래프를 컴퓨터 프로그래밍 언어로 구현하기 위해서는 인접 행렬(adjacency matrix)이나 인접 리스트(adjacency list)를 이용하여 표현함
  • 인접 행렬을 이용하여 n개의 정점을 가진 그래프를 표현하기 위해서는 n*n 크기의 2차원 배열을 이용함
    • 인접 행렬 A[i][x]에 값(1)이 존재하면 그래프의 정점 Vᵢ에서 정점 Vₓ 사이에 간선이 존재함을 의미

 

 

 

 

 

✅ 그래프의 탐색

그래프의 모든 정점을 체계적으로 방문하는 것

깊이 우선 탐색(depth first search) 너비 우선 탐색(breadth first search)


- 최근에 방문하지 않은 인접한 하나의 정점을 우선적으로 방문함 
- 최종 방문 순서는 (1,2,4,5,7,6,3) 이지만 이는 구현 방법에 따라 달라질 수 있음

- 최근에 방문하지 않은 인접한 모든 정점을 모두 방문함
- 최종 방문 순서는 (1,2,3,4,5,6,7) 이지만 이는 구현 방범에 따라 달라질 수 있음

 

 

728x90
728x90

1. 변수의 개요

 

출처: 방송통신대학교

🔸변수

  • 프로그램에서 처리할 데이터를 저장/관리 할 수 있도록 메모리를 추상화한 것

 

 

 

🔸변수의 속성

배런(Barron)의 표기법

  • 변수명: 변수의 이름, 식별자(identifier)
  • 타입: 변수에 저장할 수 있는 데이터 집합의 종류, 자료형 
  • 주소: 변수가 사용하는 메모리의 위치, "참조(reference)"
  • : 변수에 저장된 데이터, 수행시간 동안 변경될 수 있음

+ 수명, 영역(scope)

 

 

 

 

 


2. 바인딩

 

출처: 방송통신대학교

🔸바인딩(binding)

  • 언어 구성 요소의 속성이 구체적으로 결정되는 것

 

 

 

🔸바인딩 시각(binding time) - 바인딩이 일어나는 시점


(바인딩 시각은 무조건 고정적이지 않음)
  • 언어 정의 시점
  • 언어 구현 시점
  • 컴파일 시점
  • 링크 시점
  • 로드 시점
  • 프로그램 수행 시점

 

 

 

🔸바인딩 시각의 구분

  1. 정적 바인딩(static binding)
    • 프로그램 수행 이전(예: 컴파일, 로드 시점)에 모두 결정되어서 프로그램 수행 시점에 바인딩의 변화가 없는 경우
    • 프로그램 수행시간의 효율성이 높음
    • 컴파일 방법에 적합
  2. 동적 바인딩(dynamic binding)
    • 프로그램 수행 시점에서 바인딩의 변화가 있는 경우
    • 실제 바인딩 시작이 프로그램 수행 시점인 경우
    • 유연한 프로그래밍이 가능
    • 인터프리터 방법에 적합

 

 

 

 

 

 


3. 변수의 바인딩

 

변수의 바인딩 예 변수명 바인딩 없이 사용되는 경우(예: 포인터)

(포인터 변수를 통해서만 값에 접근 가능)

🔸변수의 바인딩

  • 변수의 속성이 구체적으로 결정되는 것
  • 프로그램 수행 중에 변수가 사용되기 위해서는 변수의 속성이 바인딩되어야 함
    • 변수의 속성: 변수명, 타입, 주소, 값

 

 

 

🔸일반적인 변수의 속성별 바인딩 순서

①변수명 바인딩 → ②타입 바인딩 → ③주소 바인딩 → ④값 바인딩

 

 

 

①변수명 바인딩

변수명 바인딩 방법
명시적 선언(explicit declaration) 묵시적 선언(implicit declaration)
- 선언문에 명시된 이름으로 변수명을 바인딩

- 선언문 없음
- 대입문 등에 처음으로 사용된 이름으로 변수명을 바인딩

 

 

 

 

②타입 바인딩

타입 바인딩 방법
명시적 선언 묵시적 선언
- 선언문에 명시된 타입으로 변수의 타입을 바인딩 - 변수명이나 대입할 값으로부터 정해지는 타입으로 바인딩



- Fortran: 변수명의 시작 알파벳에 따라 바인딩

타입 바인딩 시각
정적 바인딩 동적 바인딩
- 컴파일 시점에 구분 분석을 통해 타입을 판단
- 명시적 선언과 묵시적 선언 모두 가능
- 변수의 타입을 고정하지 않음
- 대입할 값에 맞추어 계속 변화시킴
- 예: APL, SNOBOL 4, Python

 

 

 

③주소 바인딩

  • 변수가 사용할 메모리가 할당되어 변수의 주소가 그 메모리의 주소로 바인딩되는 것 => 변수 주소와 메모리 주소를 매칭
    • 할당(allocation): 가용한 메모리 중 필요한 만큼의 공간을 변수에 배정하는 것
    • 해제(deallocation): 할당된 메모리를 변수로부터 회수하는 것
  • 변수의 수명(lifetime/extent)
    • 변수가 메모리를 할당받고 있는 기간

※ 변수의 수명이 존재해도 무조건 해당 변수를 사용할 수 있는 것은 아님! 영역과 관련됨(8강 포스팅 확인)

 

 

 

바인딩 방법
자동 할당 수동 할당
- 선언을 통해 정해진 변수의 타입에 맞추어 필요한 메모리를 할당

- 프로그래머가 지정한 크기만큼의 메모리를 할당



- 자동 할당: 상황/언어에 따라 정적 또는 동적 세그먼트 활용
- 수동 할당: 동적 세그먼트의 힙 활용
바인딩 시각
정적 바인딩 동적 바인딩
- 로드 시점에 정적 세그먼트의 주소를 바인딩 - 프로그램 수행 중 변수가 사용되는 시점에 동적 세그먼트의 주소를 바인딩

 

 

 

  • 정적 변수(static vatiable)
    • 정적 바인딩을 하는 변수
    • 전체 프로그램 수행 시간 동안 수명 유지
    • 초기 Fortran의 모든 변수
  • 동적 변수(dynamic variable) → 동적 세그먼트의 사용 영역에 따라 구분됨
    1. 스택 동적 변수
      • 스택에서 메모리를 할당받음
      • 자동 할당을 이용하는 변수 중 정적 변수가 아닌 경우
      • 필요한 시점에 자동으로 할당/해제됨
    2. 힙 동적 변수
      • 동적 세그먼트 중에서 메모리를 할당 받음
      • 수동 할당을 이용하는 변수 (예: malloc(), free() in C)
      • 동적 타입 바인딩을 하는 언어의 변수 (예: Python)
728x90
728x90

1. 프로그래밍 언어 정의와 구현

 

✅ 프로그래밍 언어 정의

프로그래밍 언어 정의 = 구문 규칙 + 의미 규칙
  • 구문 규칙: 어떤 프로그램이 올바른 형태인지 규정하는 것
  • 의미 규칙: 올바른 형태의 프로그램을 실행하였을 때 어떻게 실행되는 것이 올바른 것인지 규정하는 것
  • 구문 규칙 정의
    • 문맥 자유 문법 - BNF, EBNF, 구문 도표 등이 있고 문맥 자유 문법 - EBNF를 주로 사용
  • 의미 규칙 정의
    • 기능적 의미론, 표기적 의미론, 공리적 의미론 등이 있지만 너무 복잡하기 때문에 대부분의 언어는 자연어를 주로 사용

 

✔️ 프로그래밍 언어 정의 예: 간단한 로봇 제어 언어
출처: 방송통신대학교

 

 

 

 

 

 

✅ 프로그래밍 언어 구현

  • 그 언어로 작성된 프로그램을 수행하는 프로그램
  • 프로그래밍 언어 L의 구현 = 아래와 같은 작업을 수행하는 프로그램
    1. Pₗ이 L의 구문 규칙을 따르는 올바른 프로그램인지 검사 (Pₗ : 언어 L로 작성된 프로그램)
    2. 올바른 경우, Pₗ을 입력으로 받아서 L의 의미 규칙에 따라 실행 

 

 

🔸CPU의 함수 모형

  • M : CPU가 받아들이는 기계어
  • Pₘ : 기계어로 작성된 프로그램
  • in : 입력 데이터
  • out : 출력 데이터

 

 

🔸프로그래밍 언어 구현의 함수 모형

  • L : 프로그래밍 언어
  • Pₗ : L로 작성된 프로그램
  • in : 입력 데이터
  • out : 출력 데이터

 

 

🔸인터프리터의 함수 모형

  • Intₗ : 언어 L의 멍령어를 해석하는 인터프리터

 

 

🔸컴파일러의 함수 모형

  • Compₗ : 언어 L의 컴파일러
  • Pₘ : CPU M이 이해하는 프로그램

 

 

 

 

 


2. 프로그래밍 언어 구현 방법

 

① 전통적인 프로그래밍 언어 구현

  • 대상: 명령형 언어, 절차형 언어, 객체지향 언어
  • 기계어를 확장하는 형태로 구현

 

② 새로운 패러다임의 언어 구현

  • 대상: 함수형 언어, 논리 언어
  • 구현 모델을 추상기계로 만들어 징검다리 삼아 구현

 

 

🔸전통적인 프로그래밍 언어 구현

  • 명령형 언어: 저급언어의 연산과 명령어를 확장하는 형태로 구현
    • b^2+4ac 
  • 절차형 언어: 명령형 언어+사용자 정의 연산(함수)과 사용자 정의 명령어(프로시저)를 지원하는 형태로 구현
  • 객체지향 언어: 절차형 언어+사용자 정의 자료형을 지원하는 형태로 구현

 

🔸새로운 패러다임의 프로그래밍 언어 구현

  • 언어별 계산 모델
    • 함수형 언어: 람다 계산법
    • 논리 언어: 연역 논리
  • 저급언어와의 연관성을 직접 파악하기 어려움
  • 계산 모델과 하드웨어 사이에 중간 기계(추상기계)를 하나 더 놓은 형태로 구현 → 프로그램을 추상기계가 알아듣는 형태로 변경
    • 추상기계
      • 함수형 언어: CPS, G-machine, TIM 등
      • 논리 언어: WAM 등
    • 가상기계: 추상기계가 구체적인 구현물로 제시되고, 코드를 독자적으로 수행할 수 있는 경우 (예: Java - JVM)

 

 

 

🔸컴파일러 구현 단계

출처: 방송통신대학교

  • 분석 단계 
    • 원시 프로그램(해당 언어로 작성된 프로그램)의 구조 파악
    • 전단부(어휘 분석, 구문 분석, 의미 분석)가 끝나면 중간 표현 생성 → 프로그래밍 언어에 종속적
  • 생성 단계
    • 목적 기계에 적합한 명령어 생성
    • 후단부(중간 코드 최적화, 코드 생성, 목적 코드 최적화)가 끝나면 효율적인 목적 코드 생성 → 목적 기계에 종속적

 

 

🔸인터프리터 구현 단계

출처: 방송통신대학교

  • 컴파일러 구현 단계의 분석 단계를 그대로 포함
  • 중간 표현을 순회하며 프로그램을 수행
  • 프로그래밍 언어의 문장 단위로 해석

 

 

 

🔸언어 구현에 필요한 자료 구조

  • 구문 트리
    • 언어 구현 단계의 중심을 차지
    • 분석 단계의 전 과정을 관통
  • 심볼 테이블(컴파일러 구현)
    • 식별자 정보(자료형, 선언 위치(전역/지역변수..)를 저장
  • 환경(인터프리터 구현)
    • 값 정보를 포함한 식별자 정보를 저장
  • 실행 환경(컴파일러 구현 시, 사용자 프로그램이 동작하려면 필요)
    • 실행을 지원하기 위한 메모리 구조
      • 정적 세그먼트: 코드, 정적 데이터
      • 동적 세그먼트: 스택, 힙
    • 메모리 및 실행 상태를 관리하기 위한 레지스터
      • PC, SP, FP등 전용 레지스터 혹은 여러 범용 레지스터

 

 

 

 

 


3. 언어 구현 실제

 

🔸어휘 분석기 구현

유한 상태 기계(FSM)

  • 어휘 분석기: 프로그램의 어휘(토큰)를 구별해 내고 속성을 구분하여 구문 분석기에 전달 (어휘: 예약어, 리터럴, 연산자 등)
  • 유한 상태 기계(FSM)를 구성하여 구현

 

 

🔸구문 분석기 구현

  • 구문 분석기는 토큰 열로부터 구문 트리를 생성
    • 구문 트리의 형태: 파스 트리, 추상 구문 트리

왼: 파스 트리 / 오: 추상 구문 트리

  • 구문 트리를 순회하는 여러 프로시저로 구성된 프로그램
  • 순환 하강 구문 분석기: 문법 규칙을 그대로 코드로 바꾼 형태
    1. 각 비단말 기호의 문법 규칙에 대해 하나의 프로시저 생성
    2. 우변을 모사할 때 단말 기호는 일치 검사, 비단말 기호는 해당 프로시저 호출

 

순환 하강 구문 분석기 예
✔️ 괄호가 맞는 문자열을 생성하기 위한 문법



(한줄 한줄 각각 다른 프로그램)
C언어로 구현

 

 

 

728x90
728x90

1. 기본 개념

 

자료 사이의 논리적 관계를 컴퓨터나 프로그램에 적용하기 위해서는 자료의 추상화가 필요함

  • 자료구조(data structure): 추상화를 통해 자료의 논리적 관계를 구조화한 것
  • 추상화: 공통적인 개념을 이용하여 같은 종류의 다양한 객체를 정의하는 것 예) 수식, 프로그램 언어 등
  • 자료(데이터)의 추상화: 다양한 객체를 컴퓨터에서 표현하고 활용하기 위해 필요한 데이터의 구조에 대해서 공통의 특징만을 뽑아 정의한 것

 

  • 자료의 추상화와 구조화가 적절히 이루어지지 못하면 소프트웨어는
    • 비효율적으로 개발되거나
    • 비요율적으로 수행되거나
    • 소프트웨어의 확장성에 문제가 생기거나
    • 소프트웨어의 유지보수에 문제가 생길 수 있음



🔸자료구조의 종류와 관계

출처: 방송통신대학교

  • 미리 정의된 자료구조
    • 프로그래밍 언어에서 제공
    • 프로그래밍 설계나 컴파일러 구현 단계에서 정의되어 개발자에게 제공되는 자료구조
  • 사용자 정의 자료구조
    • 개발자가 정의하여 사용함
    • 소프트웨어 개발 중에 개발자에 의해 만들어지는 자료구조(리스트, 스택, 큐, 트리, 그래프 등)






2. 배열

 

출처: 방송통신대학교

  • 배열(array): 동일한 자료형을 갖는 여러 개의 데이터를 동일한 변수 이름의 방에 일렬로 저장하는 자료 집합체(원소+인덱스)
  • 원소(요소): 자료 집합체에서 각 원소의 항목값 = 데이터
  • 인덱스(첨자): 자료 집합체에서 각 원소가 저장된 방을 접근하기 위한 방 번호에 해당하는 것 = 번호



🔸1차원 배열

  • 가장 간단한 형태의 배열
  • 한 개의 인덱스(첨자)를 사용해서 원소에 직접 접근
  • 배열의 원소들은 컴퓨터 메모리의 연속적인 기억장소에 할당되어 순차적으로 저장됨
  • 배열 A의 크기를 k라고 가정하고 시작 주소를 a라고 가정하면, A[i]의 저장 주소= a+i*k

1차원 배열에서의 주소 계산



🔸다차원 배열

2차원 배열


2차원 배열


다차원 배열: 두개 이상의 첨자들을 가지는 배열을 총칭함
  • 동일한 크기의 1차원 배열을 모아 놓아, 바둑판 형태로 만든 배열
  • 하나의 원소는 두개의 첨자 i와 j의 쌍으로 구분됨 → A[i][j]
    • 행(row): 첨자 i에 해당하는 것
    • 열(column): 첨자 j에 해당하는 것



🔸2차원 배열 저장 순서

  • 열 우선 순서 저장
    • 첫 열에 있는 각 행의 원소를 차례대로 컴퓨터 메모리에 저장하고 다음 열로 이동하여 각 행에 있는 원소를 차례대로 컴퓨터 메모리에 저장하는 방법

 

  • 행 우선 순서 저장
    • 첫 행에 있는 각 열의 원소를 차례대로 컴퓨터 메모리에 저장하고 다음 행으로 이동하여 각 열에 있는 원소부터 차례대로 컴퓨터 메모리에 저장하는 방법



🔸희소행렬(spare matrix)

 

  • 원소 값이 0인 원소가 그렇지 않은 원소보다 상대적으로 많은 행렬
  • 0값을 저장하기 위해 컴퓨터 메모리의 낭비를 막고, 처리의 효율성을 높이기 위해 사용
  • 희소 행렬의 0인 원소는 따로 저장하지 않고, 0이 아닌 값만 따로 모아서 저장하는 방법
  • 0이 아닌 원소를 (행 번호, 열 번호, 원소 값)의 형태로 나타내면 2차원 배열로 표현 가능함






3. 리스트

✅ 선형 리스트(linear list)

  • 순서 리스트(ordered list)라고도 함
  • 1개 이상의 원소들이 순서를 가지고 구성됨
  • A = (a₁, a₂, ..., aᵢ, ..., aₙ)와 같이 표시
    • aᵢ는 i번째 원소를 나타냄
    • aₙ의 n은 리스트의 크기가 됨
  • 예1) 요일 리스트: (월, 화, 수, 목, 금, 토, 일)
  • 예2) 전쟁 리스트: ((황산벌 전투, 660), (임진왜란, 1592), (세계 1차 대전, 1914), (세계 2차 대전, 1939))



🔸선형 리스트의 구현1(배열을 통한 구현)

 

  • 선형 리스트와 1차원 배열은 순차적인 구조를 가지고 있으므로 1차원 배열로 간단하게 표현할 수 있음
  • 원소 삽입
    • 삽입될 위치 이후의 원소들의 순서를 그대로 유지하면서 원소를 삽입해야 함
    • 그래서 삽입할 위치에 있는 원소와 그  다음에 위치한 원소들을 모두 한 칸 씩 뒤로 이동시킴
  • 원소 삭제
    • 삭제할 원소를 찾아 삭제한 후, 그 뒤에 있는 모든 원소들을 한 칸 씩 앞으로 이동시킴



🔸선형 리스트의 구현2(연결 리스트(linked list))

 

  • 노드 간의 포인터 연결을 통해서 구현됨
  • 각 노드는 적어도 두 종류의 필드(원소 값을 저장하는 데이터 필드/노드 연결을 위한 링크 필드)를 가짐
  • 선형 리스트의 논리적 순서만을 지원함
  • 포인터만 변경 시키면 되기 때문에 쉽게 연산 가능



🔸연결 리스트 종류

  • 단일 연결 리스트(singly linked list)
    • 특정 노드의 링크 필드를 사용해서 후행 노드를 가리킴
    • 특정 노드의 후행 노드는 쉽게 접근할 수 있지만, 선행 노드에 대한 접근은 헤드노드부터 새로 시작해야 함
  • 이중 연결 리스트(doubly linked list)
    • 첫번째 링크는 후행 노드를 가리키고 두번째 링크는 선행 노드를 가리킴
    • 특정 노드에서 후행 노드 뿐만 아니라 선행 노드에 대한 접근을 쉽게 제공하기 위한 것
    • 메모리 추가적으로 들겠지만 연산은 조금 더 빨라짐






4. 스택과 큐

 

 

✅ 스택(Stack)

  • 데이터의 삽입과 삭제가 한쪽 끝에서만 이루어지는 자료구조
  • 가장 먼저 입력된 데이터가 가장 나중에 제거되는 선입후출(FILO, First-In-Last-Out) 특징을 가짐 (=LIFO, Last-In-First-Out)



🔸스택의 연산

  • 삽입 연산: push
  • 삭제 연산: pop
  • 스택 오버플로(overflow)
    • 삽입 연산을 수행할 때 발생
    • 스택을 위해 할당된 저장 공간을 초과해서 더 이상 데이터를 삽입할 수 없는 현상
  • 스택 언더플로(underflow)
    • 삭제 연산을 수행할 때 발생
    • 스택에 데이터가 존재하지 않으면 삭제가 일어나지 않는 현상





✅ 큐(Queue)

  • 선형 리스트의 한쪽 끝에서는 데이터의 삭제만 이루어지고, 다른 한쪽 끝에서는 데이터의 삽입만 이루어지는 자료구조
  • 가장 먼저 입력된 데이터가 가장 먼저 제거되는 선입선출(FIFO, First-In-First-Out) 특징을 가짐



🔸큐의 연산

  • 삽입 연산: enqueue
  • 삭제 연산: dequeue
  • 오버플로(overflow)
    • 삽입 연산을 수행할 때 발생
    • 큐를 위해 할당된 저장 공간을 초과해서 더 이상 데이터를 삽입할 수 없는 현상
  • 언더플로(underflow)
    • 삭제 연산을 수행할 때 발생
    • 큐에 데이터가 존재하지 않으면 삭제가 일어나지 않는 현상



🔸큐의 만원 상태

  • 만원 상태
    • 데이터가 큐에 삽입됨에 따라 rear 변수 값이 증가하다가 n-1이 되면 더 이상 데이터가 삽입될 수 없는 상태가 됨. 하지만 이 경우가 반드시 큐에 n개의 항목이 가득 차 있다는 것을 의미하는 것은 아님

=> 큐가 가득 채워진 상태를 결정하기 위한 다른 방법이 필요함

728x90
728x90

1. 데이터와 정보

 

✅ 데이터와 정보의 관계

I = P(D)

 

 

 

🔸데이터 표현 형태

  • 데이터의 유형(문자, 정수/실수, 이미지, 오디오, 비디오...)과 무관하게 일관된 표현 방식 = "비트 패턴"
    메모리에 저장된 데이터 유형에 맞는 해석과 처리가 필요 → 입출력 장치나 프로그램의 책임

 

 

 

✅ 데이터 표현 단위

비트(binary digit) 0 또는 1 예/아니오(수치❌ 기호⭕)
1바이트(byte) 8bit 알파벳 또는 숫자 한 개
1킬로바이트(KB) 1024 byte 몇 개의 문단
1메가바이트(MB) 1024 KB 1분 길이의 MP3 노래
1기가바이트(GB) 1024 MB 30분 길이의 HD 영화
1테라바이트(TB) 1024 GB 약 200편의 FHD 영화
1페타바이트(PB) 1024 TB  
1엑사바이트(EB) 1024 PT  
1제타바이트(ZB) 1024 EB  
1요타바이트(YB) 1024 ZB  
워드(word) 컴퓨터 연산의 기본단위가 되는 정보의 양 → 32비트, 64비트

 

 

 

 


2. 진법

 

 

✅ 진법(number system)

출처: 방송통신대학교

  • 수를 세는 방법 또는 단위
  • r진수: 0, 1, ..., (r-1)까지의 숫자만을 사용해서 표현한 수
  • 각 위치에 따른 서로 다른 가중치(자릿값)가 존재
십진수 '123' = 일백이십삼 = 1*10^2+2*10^1+3*10^0
이진수 '10111.011'

 

 

 

🔸2진수 → 10진수

10진수 = (각 비트값 * 해당 비트 위치의 가중치)

출처: 방송통신대학교

 

 

 

🔸8진수, 16진수 → 10진수

10진수 = (각 비트값 * 해당 비트 위치의 가중치)  

출처: 방송통신대학교

 

 

 

🔸10진수 → r진수(r=2, 8, 16)

정수 부분소수 부분을 구분하여 각각 처리한 후, 각 결과를 단순히 연결해서 나열

 

 

 

🔸10진수_정수 부분 → r진수(r=2, 8, 16)

알고리즘 예시

 

 

 

🔸10진수_소수 부분 → r진수(r=2, 8, 16)

알고리즘
예시

 

 

- 소수 부분이 반복되는 경우, 반복 값 전까지만 변환
💡십진수 0.6 ≒ 이진수 0.1001 => 비슷한 값이긴 하지만 같은 값은 아님

 

 

 

🔸2진수 ↔ 8진수/16진수

 

 

 

 


3. 정수 표현

 

✅ 정수 표현 방법

출처: 방송통신대학교

  • 부호 없는 정수: 부호(+,-) 비트가 없음
  • 부호 있는 정수: 최상위 비트 => 부호 비트(0: 양수, 1: 음수)
  • 음의 정수는 서로 다른 형태를 가짐 (양의 정수는 모두 동일)
    1. 부호화-크기: 절대값으로 표현
    2. 1의 보수: 양수에 대한 보수로서 표현
    3. 2의 보수: (1의보수+1)로 음수 표현

 

 

 

✅ 부호 없는 정수

 

 

 

부호 있는 정수

⭐컴퓨터에서 일반적으로 사용하는 방법: 2의 보수⭐

 

 

 

 

✅ 8비트 정수 표현 방법 비교

 

 

 

✅ 2의 보수 방식의 응용

24-17

연습 문제

 

 

 

 


4. 실수 표현

 



✅ 실수 표현

  • 과학적 표기법을 활용한 부동소수점 방식으로 표현
  • 지수 → 초과표기법
  • 가수 → 정규화

 

 

 

✅ 초과표기법

  • 부동소수점 방식의 지수 부분만을 표현하기 위한 방법
  • 매직 넘버

 

 

 

✅ 정규화

  • 가수를 표현할 때 표준화된 형식이 필요
    • → 소수점의 위치를 통일
    • 소수점을 기준으로 소수점 왼쪽에 1이 오직 하나만 있도록 소수점의 위치를 조정

 

 

 

⭐ 실수 표현 예

💡 정규화 후, 소수점 왼쪽에 있는 1을 저장하지 않는 이유
정규화를 통해 소수점 왼쪽에는 무조건 1만 있다는 걸 알기 때문에이를 저장하지 않고 대신에 다른 데이터를 저장 
※ 23비트에 저장된 값을 사용하기 위해 해석할 때는 앞에 1. 붙여줘야 함!

 

 

 

🔸IEEE 부동소수점 방식의 표준 형식

 

 

 

 


5. 문자 표현

 

✅ 문자 표현

  • 키보드를 통해 입력되는 문자도 2진수로 표현되어 처리
  • 각 문자마다 유일한 값으로써 코드를 할당할 수 있는 약속된 문자 체계가 필요
  • 문자 체계의 종류: ASCII, 유니코드, ...

 

 

 

✅ ASCII

  • American Standard Code for Information Interchange
  • 미국표준협회(ANSI)
  • 7비트 코드 → 128(2^7)의 서로 다른 문자 표현 가능
  • 실제 사용할 때는 8비트로 맞춰주기 위해 왼쪽에 1비트를 추가시켜 1byte를 만듬
    • 확장된 아스키(Extended ASCII): 1비트+7비트
    • 1비트
      1. 그냥 0으로 채워 넣음
      2. 패러티(parity)비트: 데이터를 전송할 때 전송상에서 발생하는 오류를 검출하기 위한 용도로 사용
        • 짝수 패러티: 11001100
        • 홀수 패러티: 01001100

 

 

 

 

✅ 유니코드

  • 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준
  • 1990년 애플 컴퓨터, IBM, MS 등 컨소시엄으로 설립한 유니코드(Unicode)가 첫 버전발표
  • 1995년 국제 표준으로 제정 → 공식명칭: ISO/IC 10646-1
  • 사용 중인 플랫폼, 프로그램, 언어에 무관
  • 16비트 코드 체계 → 65636개(2^16)의 서로 다른 문자 표현

 

 

 

🔸EBCDIC

  • Extended Binary Coded Decimal Interchange Code
  • IBM 개발, 8비트 코드 → 실제 사용되는 문자 코드는 127개
  • IBM 메인 프레임에서만 사용

 

 

 

🔸BCD

  • Binary Coded Decimal
  •  4비트로 구성된 열 개의 코드로 10진수를 표현 →  '8421 코드'

 

 

728x90

+ Recent posts