728x90
반응형

01. 선언문과 실행문

 

✅ 문장(statement)

  • 처리를 나타내는 표현
  • 데이터 처리를 위해 연산, 변수, 서브프로그램 이용
  • 문장의 구분: 선언문, 실행문

선언문과 실행문

 

 

 

🔸선언문

  • 변수나 서브프로그램을 이용할 수 있도록 준비
    1. 변수 선언문: 변수명, 타입 등을 바인딩
    2. 서브프로그램 선언문: 서브프로그램의 프로토콜을 명시

변수선언문
서브프로그램 선언문

 

 

 

🔸실행문

  • 변수, 서브프로그램 등을 이용하여 데이터를 처리
  • 실행문의 구분: 대입문, 제어문

대입문과 제어문

 

 

 

 

 

 


02. 대입문

 

✅ 대입문

  • 변수의 값을 변경
  • 프로그램에서 가장 자주 사용되는 문장
  • 대입 연산자를 이용

 

 

 

🔸대입 연산자

  • 대입 연산자의 오른쪽 부분의 값을 대입 연산자의 왼쪽 변수의 값으로 대입
  • =, :=, MOVE TO

 

 

 

 

 

대입문 - C, C++, Java
  • 수식의 끝에 세미콜론(;)을 찍으면 문장이 됨

 

 

 

 

 

▪️ 다중 대입문

  • 하나의 값을 여러 변수에 대입 
  • 대입 연산자의 특성 활용
    • 우결합
    • 대입한 값이 수식의 값

 

 

 

 

 

대입문 - C++

▪️ 조건 연산자(삼항식)를 이용한 대입문

  • 값이 대입될 변수를 조건에 따라 선택하여 대입

 

 

 

 

 

대입 연산자 - C, C++, Java

▪️ 복합 대입 연산자

  • 산술 연산자와 대입 연산자가 결합

 

 

 

 

 

▪️ 단항 대입 연산자

++: 피연산자가 가진 값에 1을 더한 값을 대입

 

--: 피연산자가 가진 값에서 1을 뺀 값을 대입

 

 

 

 

 

🔸타입 변환

  • 주어진 타입의 값을 다른 타입의 값으로 변환
  • 대입할 값의 타입과 변수의 타입이 서로 일치하지 않는 경우 필요
  • 종류: 묵시적 타입 변환, 명시적 타입 변환

 

 

▪️ 묵시적 타입 변환

  • 값의 타입을 변수의 타입으로 변환하여 대입
  • C, C++: 확대변환 및 축소변환 가능
  • Java: 확대변환만 가능

C, C++ - 축소변환

 

▪️ 명시적 타입 변환

  • 값의 타입을 프로그래머가 명시한 타입으로 변환
  • 확대변환 및 축소변환 모두 가능
  • 변환된 타입이 변수의 타입과 일치하지 않으면 추가로 묵시적 타입 변환 필요

 

 

 

 

 

 

 


03. 제어문

 

✅ 제어문(control statement)

  • 프로그램의 수행 흐름을 제어
  • 제어문의 구분: 조건문, 반복문

 

 

 

🔸조건문

  • 조건에 따라 서로 다른 처리를 하도록 제어하는 문장
  • 대표적인 조건문: if

 

 

▪️ if문

  • 조건이 참인 경우에만 then 다음의 문장을 수행
  • else가 있는 경우, 조건이 거짓인 경우에만 else 다음의 문장을 수행
  • 언어마다 표현 방법은 다양

 

 

 

조건문 - C, C++, Java

▪️ switch문

  • 조건의 값에 따라 모두 다르게 처리할 수 있음
  • 한 번에 여러 갈래로 흐름을 나눌 수 있음

 

 

 

 

 

 

 

🔸반복문

  • 원하는 문장을 반복해서 수행하도록 제어하는 문장
  • 대표적인 반복문
    • for문
    • while문
    • do-while문

 

 

▪️ for문

  • 제어변수를 초기값부터 종료값까지 증가분만큼씩 늘리며 원하는 문장을 반복 수행

 

 

▪️ while문

  • 조건이 참인 동안 원하는 문장을 반복해서 수행
  • 반복 횟수: 0번 이상

 

 

▪️ do-while문

  • 조건이 참인 동안 원하는 문장을 반복해서 수행
  • 반복 횟수: 1번 이상 

 

 

728x90
반응형
728x90
반응형

01. 수식의 개요

 

✅ 수식(expression)

  • 값(정수, 실수, 문자, 문자열 등)을 나타내는 표현
  • 연산자(연산을 수행하는 함수 포함)와 피연산자로 구성되어 하나의 값을 나타내는 표현
    • 예) 2, -5.3, "abc", i+3 ...
  • 수식은 연산자와 피연산자로 구성 되지만 피연산자와 연산자가 모두 포함될 필요는 없음!
class Main{
    public static void main(String[] args){
        int i = 1;		 
        System.out.println(i+3);   //예1) 연산자와 피연산자로 구성
        
        System.out.println(f());   //예2) 피연산자 없이 수식 구성
        System.out.println(-5.3);  //예3) 연산자 없이 수식 구성
    }
    
    public static int f(){
        return 100;
    }
}

 

 

 

 

 

 

 


02. 수식과 문장의 차이

 

  • 수식: 값을 나타내는 표현
  • 문장: 처리를 나타내는 표현
    • 처리: 값 계산, 수행 흐름 바꾸기, 값을 화면에 출력 등

 

예) Python

#수식이면서 문장
3+2 

#문장(어떤 하나의 값을 표현하지 않기 때문에 수식은 아님)
if k > 1:
   k = 1

 

예) C, C++

  • 수식의 끝에 세미콜론(;)을 찍으면 문장이 됨

  • 문장의 끝에 세미콜론이 없다고 해서 항상 수식이 되는 건 아님

 

 

 

 

 

 

 


03. 수식과 연산자

 

▪️ 수식에 사용되는 기본 연산자

  • 산술 연산자
  • 관계 연산자
  • 논리 연산자
  • 그 외 연산자

 

 

 

 

 

✅ 산술 연산자

default 기본적인 사칙연산 외에 추가되는 산술 연산자는 언어마다 다름
  • 기본적으로 사칙연산자 포함
  • 언어에 따라 추가적인 산술 연산자 포함
    • 예) 나머지, 거듭제곱 등

 

 

 

 

 

🔸피연산자 개수

  • 단항 연산자: 1개의 피연산자 필요

C, C++ 단항 연산자

  • 이항 연산자: 2개의 피연산자 필요

 

 

 

🔸우선순위

  • 하나의 수식에 여러 연산자가 사용되는 경우, 우선순위에 따라 연산 수행

 

 

 

🔸타입 변환

  • 주어진 타입의 값을 다른 타입의 값으로 변환
  • 피연산자들의 타입이 서로 일치하지 않는 경우 필요
  • 종류: 묵시적 타입 변환, 명시적 타입 변환

 

 

 

 ▪️ 묵시적 타입 변환

  • 언어의 정책에 따라 컴파일러에 의해 자동으로 변환
  • 데이터 집합이 커지는 방향의 타입으로 확대변환

 

 

 

▪️ 명시적 타입 변환

  • 프로그래머가 명시한 타입으로 변환
  • 확대변환 및 축소변환 모두 가능

 

 

 

 

 

✅관계 연산자

  • 2개의 피연산자를 서로 비교하여 둘 사이의 관계가 관계 연산자와 일치하는지 여부를 확인
  • 결과 값: 참(true), 거짓(false)

 

 

 

🔸우선 순위

  • 산술 연산자보다 우선순위가 낮음

C, C++

 

 

 

🔸타입 변환

  • 묵시적 타입 변환이나 명시적 타입 변환 가능

 

 

 

 

 

 

 

✅ 논리 연산자

  • 논리곱, 논리합, 부정 등
  • 피연산자 및 결과 값: 참(true), 거짓(false)

 

 

 

 

🔸우선 순위

 

 

 

🔸단락 평가(short-circuit evaluation)

  • 모든 논리 연산을 수행하지 않고도 수식의 값을 얻음

 

 

 

 

 

 

 

 

✅ 그 외 연산자

C, C++

  • 비트 단위 논리 연산자: &, ^, |, ~
  • 조건 연산자: 조건 ? 참인 경우 : 거짓인 경우

 

 

 

 

728x90
반응형
728x90
반응형

01. 알고리즘 개념

 

🔸컴퓨터과학: 컴퓨터를 활용해서 주어진 문제를 해결하기 위한 학문

문제를 풀기 위해선 알고리즘이 반드시 있어야 함

 

 

 

 

 

✅ 알고리즘

  • 문제 해결을 위한 레시피
    • 단계적인 조리 절차를 따르면 음식을 만들 수 있듯이, 주어진 문제도 단계적인 풀이 절차("알고리즘")를 따르면 문제의 해를 구할 수 있음
    • 맛있고 좋은 음식 ↔ 효율적인 알고리즘

 

  • 주어진 문제를 풀기 위한 명령어들을 단계적으로 나열한 것
    1. 입출력: 0개 이상의 외부 입력, 1개 이상의 출력
    2. 명확성: 각 명령은 모호하지 않고 단순 명확해야 함
    3. 유한성: 한정된 수의 단계를 거친 후에는 반드시 종료해야 함
    4. 유효성: 모든 명령은 컴퓨터에서 실행 가능해야 함
    5. (실용적 관점) 효율성
➡️ 주어진 문제에 대한 결과를 생성하기 위해 모호하지 않고 간단하며 컴퓨터가 수행 가능한 일련의 유한개의 명령들을 순서적으로 구성한 것

 

 

 

 

 

✅ 알고리즘 생성 단계

  1. 설계
  2. 표현/기술
    • 기술 방법
      • 일상언어
      • 의사코드
      • 순서도
  3. 정확성 검증
  4. 효율성 분석

 

 

 

 

 

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

  • 자료구조
    • 데이터 사이의 논리적 관계를 표현하고 조직화하는 방법
    • 배열, 연결 리스트, 스택, 큐, 트리, 그래프
  • "효율적" 프로그램 ← 자료구조+알고리즘
    • 자료구조에 대한 고려 없는 효율적인 알고리즘의 선택 또는 알고리즘에 대한 고려 없는 효율적인 자료구조의 선택은 무의미

 

 

 

 

 

 

 

02. 알고리즘 설계

 

🔸최대값 찾기

두 알고리즘 모두 비교 횟수가 7번으로 효율성이 같음.

Q. 어떤 수의 최대/최소값을 찾기 위해 몇 번의 비교가 필요할까?
A. n→(n-1)
두 개의 데이터 중 최대값을 찾으려면 1번 비교, 세개의 데이터 중 최대값을 찾으려면 2번 비교...

 

 

 

 

🔸뒤섞인 카드에서 원하는 카드 찾기

 

 

 

🔸순서대로 나열된 카드에서 찾기

 

 

 

 

 

 

✅ 알고리즘 설계 기법

  • 문제와 그에 따른 조건 등이 매우 다양 → 일반적이고 범용의 설계 기법은 없음
  • 대표적인 설계 기법
    1. 분할정복(divide-and conquer)방법
    2. 동적 프로그래밍(dynamic programming)방법
    3. 욕심쟁이(greedy)방법

 

 

 

🔸분할정복 방법

  • 순환적으로(recursively) 문제를 푸는 방법
    • 문제의 입력을 더이상 나눌 수 없을 때까지 두 개 이상의 작은 문제로 순환적으로 분할하고, 분할된 문제들을 각각 해결한 후 이들의 해를 결합하여 원래 문제의 해를 구하는 하향식 접근 방법
  • 특징
    • 분할된 작은 문제는 원래 문제와 동일, but 입력 크기만 작아짐
    • 분할된 작은 문제는 서로 독립적
  • 각 순환 호출마다 세 단계의 처리 과정을 거침
분할 주어진 문제를 여러 개의 작은 문제로 분할한다.
정복 작은 문제를 순환적으로 분할. 만약 작은 문제가 더이상 분할되지 않을 정도로 크기가 충분히 작다면 순환호출 없이 작은 문제의 해를 구한다.
결합 작은 문제에 대해 정복된 해를 결합하여 원래 문제의 해를 구한다.
※결합 단계가 없는 문제도 존재
  • 예) 퀵 정렬, 합병 정렬, 이진 탐색

 

 

 

🔸동적 프로그래밍 방법

  • 최적화 문제의 해를 구하기 위한 상향식 접근 방법
    • 문제의 크기가 작은 소문제에 대한 해를 구해서 테이블에 저장해 놓고, 이를 이용하여 크기가 보다 큰 문제의 해를 점진적으로 만듦
  • 예) 모든 정점 간의 최단 경로를 구하는 플로이드 알고리즘

 

 

 

🔸욕심쟁이 방법

  • 해를 구하는 일련의 선택 과정마다 전후 단계의 선택과는 상관없이 각 단계에서 '가장 최선'이라고 여겨지는 국부적인 최적해를 선택해 나가면 결과적으로 전체적인 최적해를 얻을 수 있을 것이라고 희망하는 방법
    • 희망 → 각 단계의 최적해를 통해 전체적인 최적해를 만들어 내지 못할 수 있음
    • 적용 범위는 제한적, 간단하면서도 강렬한 설계 기법
    • 예) 거스름돈 문제, 배낭 문제

 

 

 

▪️ 거스름돈 문제

고객에게 돌려줄 거스름돈이 T만큼 있을 때 고객이 받을 동전의 개수를 최소로 하면서 거스름돈을 돌려주는 방법을 찾는 문제
동전의 종류 → 500원, 100원, 50원, 10원

 

 

 

▪️ 배낭 문제

  • 최대 용량 M인 하나의 배낭, n개의 물체
    • 각 물체 i에는 물체의 무게 wᵢ와 해당 물체를 배낭에 넣었을 때 얻을 수 있는 이익 pᵢ
  • 배낭의 용량을 초과하지 않는 범위에서 배낭에 들어 있는 물체의 이익의 합이 최대가 되도록 배낭에 물체를 넣는 방법을 찾는 문제
    • 가정 → 물체를 쪼개서 넣을 수 있다

 

물체의 무게가 가벼운데 이익이 큰 놈부터 집어넣으면 됨. 단위 무게당 이익이 큰 놈부터!!

 

 

 

 

 

 

 

03. 알고리즘 분석

 

🔸정확성 분석

  • 유효한 입력, 유한 시간 → 정확한 결과 생성
    • 다양한 수학적 기법을 사용한 이론적 증명이 필요 (교과 과목을 통해 배우는 알고리즘은 정확성 검증 완료!)

 

🔸효율성 분석

  • 알고리즘 수행에 필요한 컴퓨터 자원의 양을 측정
    • 메모리 양: 공간 복잡도(space complexity)
    • cpu 수행 시간: 시간 복잡도(time complexity)

 

 

 

 

 

✅ 시간 복잡도

 ▪️ 알고리즘의 수행 시간

  1. 컴퓨터에서 실행시켜 완료될 때까지 걸리는 실제 시간을 측정
    • 컴퓨터의 종류와 속도, 프로그래밍 언어, 프로그램 작성 방법, 컴파일러의 효율성 등에 종속적 → 일반성 결여!
  2. "알고리즘에서 단위 연산의 수행 횟수를 모두 더한 값"
    • 입력 크기가 증가하면 수행 시간도 증가
      • 단순히 단위 연산의 개수가 아닌 입력 크기의 함수로 표현
      • 예) f(n) = 2n^2+5n+10
    • 입력 데이터의 상태에 종속적
      • 평균 수행 시간: 모든 데이터가 입력될 수 있는 경우를 고려
      • 최선 수행 시간: 어떤 데이터가 주어졌을 때 가장 빠른 수행 시간
      • 최악 수행 시간: 데이터의 상태가 알고리즘과 안 맞아서 가장 오래 걸리는 수행 시간 

 

 

 

 

 

✅ 점근성능

▪️ 입력 크기 n이 충분히 커짐에 따라 결정되는 성능

알고리즘을 수행하는데 수행되는 명령어들의 횟수 → 값이 작을 수록 좋은 알고리즘

▪️ 다항식의 수행 시간에서 가장 큰 영향을 미치는 것: 최고차항

  • 계수 없이 '최고차항'만을 이용해서 표현
  • 수행 시간의 어림값, 수행 시간의 증가 추세 → 알고리즘의 우열

 

 

 

🔸 점근성능의 표기법

  • 알고리즘 수행시간 f(n)이 아무리 나빠도 cg(n)보다 나빠질 수 없음 → 최악의 수행 시간

 

 

  • 최선의 수행 시간

 

 

 

  • 최선과 최악의 시간을 동시에 표기

 

 

예)

 

 

 

 

 

▪️ 데이터 입력 크기가 증가해도 수행 시간 증가가 크지 않은 알고리즘이 BEST

 

 

 

 

 

 

 

04. 정렬 알고리즘

:선택 정렬, 버블 정렬, 삽입 정렬

 

📌 분포 기반 정렬이 성능이 더 좋은 이유
분포 기반 정렬은 내가 정렬하고 싶은 데이터가 어떤 분포적인 특성을 가지고 있는지에 대한 정보를 사전에 알고서 그걸 정렬에 활용→ 성능은 좋으나 일반성이 떨어짐(보통 정렬할 때 해당 데이터가 통계적으로 어떤 분포 특징을 가지고 있는지 잘 모름)

 

 

 

 

 

▪️ 정렬을 위한 기본 가정

 

 

 

 

 

✅ 선택 정렬

  • 주어진 데이터 중에서 가장 작은 값부터 차례대로 선택해서 나열하는 방식(오름차순)

 

 

 

 

 

 

✅ 버블 정렬

  • 왼쪽에서부터 모든 인접한 두 데이터를 차례대로 비교하여 왼쪽의 값이 더 큰 경우에는 오른쪽 값과 자리를 바꾸는 과정을 통해 정렬

예1
예2

입력 데이터가 8개니까 7번(8-1)의 단계를 수행하는데 4단계부터는 자리바꿈이 발생하지 않음!
== 6, 7단계는 확인하지 않아도 됨(이런 팁을 알고리즘에 적용할 수 있음)

 

 

 

 

🔸버블 정렬의 특징

  • 선택 정렬에 비해 데이터 교환이 더 많이 발생 → 선택 정렬보다 비효율적
  • 데이터의 입력 순서에 따라 성능이 달라짐

 

 

 

 

 

✅ 삽입 정렬

  • 주어진 데이터를 하나씩 뽑은 후, 나열된 데이터들이 항상 정렬된 형태를 가지도록 뽑은 데이터를 바른 위치에 '삽입'해서 나열하는 방식
  • 입력 배열을 정렬 부분과 미정렬 부분으로 구분
    • 미정렬 부분의 가장 왼쪽에 있는 데이터("첫번째 데이터")를 꺼낸 후, 정렬된 부분에서 제자리를 찾아 삽입하는 과정을 반복

 

 

 

 

🔸삽입 정렬의 특징

  • 버블 정렬과 동일

 

 

 

728x90
반응형
728x90
반응형

01. 배열

 

✅ 배열

  • 동질형 데이터의 모음으로 구성된 타입
    • 원소(element): 배열의 각 데이터
    • 배열의 크기: 배열이 가지는 원소의 개수
  • 각 원소는 첨자로 구분
    • 첨자(subscript): 첫 원소와의 상대적 위치

 

 

 

 

🔸데이터 집합

  • 원소의 타입에 해당하는 데이터 집합이 배열의 크기만큼 모인 집합
  • 원소의 타입과 배열의 크기에 따라 다양한 타입 존재
    • 원소의 타입: 단순타입 및 복합타입 모두 가능
    • 배열의 크기: 양의 정수 범위*차원

 

▪️ 차원(dimension)

  • 배열에 사용되는 첨자의 개수
    • 1차원 배열 → [크기]
    • 2차원 배열 → [행][열]
    • 3차원 배열 → [면][행][열]

 

 

✅ 배열의 구현 

고려해야 할 점 1. 저장공간 확보

  • 정적 변수: Fortran
  • 스택 동적 변수: 배열의 크기는 정적 바인딩 또는 동적 바인딩
  • 힙 동적 변수: 배열의 크기도 동적 바인딩
//스택 동적 변수의 배열 크기 정적 바인딩 in C++
char arr[5];

//스택 동적 변수의 배열 크기 동적 바인딩 in C
int n = 5;
char arr[n];

//힙 동적 변수의 배열 크기 동적 바인딩 in Java
char[] arr = new char[5];

 

고려해야 할 점 2. 첨자를 통한 원소의 주소 계산

▪️ 크기 N인 1차원 배열 A

  • 주소(A[i]) = 주소(A[0]) + i * 원소크기

 

▪️ 크기 M*N인 2차원 배열 B

  • 행우선 저장: 대부분의 언어가 사용
  • 주소(B[i][j]) = 주소(B[0][0]) + i*n*원소크기 + j*원소크기

예) 주소(B[1][2]) = 주소(B[0][0]) + 1*4*1 + 2*1

 

  • 열우선 저장: Fortran
  • 주소(B[i][j]) = 주소(B[0][0]) + j*m*원소크기 + i*원소크기

예) 주소(B[1][2] = 주소(B[0][0]) + 2*3*1 + 1*1

 

 

 

 

 

🔸연산 집합

  • 배열 전체를 다루는 연산들의 집합
  • 개별 원소 연산은 원소 타입의 연산 집합에 의존
  • 배열 전체에 대한 연산은 PL에 따라 다름
    • C, C++, Java: 초기화 연산만 기본적으로 제공
    • Ada, Perl, Python: 대입 연산 등이 포함

 

 

 

 

 

 

 

02. 문자열형

 

✅ 문자열형

  • 문자열(문자들의 나열) 데이터를 다루는 타입
    • 예) "123", "a", "good night", "KNOU", ...

 

 

 

🔸 데이터 집합

  • 모든 문자열이 모인 집합
//C, C++ 문자형의 1차원 배열
char str[] = "abc";

//Java String 클래스타입
String str = "abc";

 

 

 

🔸연산 집합

  • PL마다 많은 차이가 존재
    • C, C++: 기본적인 문자열 연산 없음
    • Java
      • 대입연산: str2 = str;
      • 연결 연산: "good"+"night" → "good night"

 

 

 

 

 

 

 

03. 연관배열과 해싱

 

✅ 연관배열(associative array)

  • 동질형 데이터의 순서 없는 모음으로 구성된 타입 → 원소 간의 위치 관계는 의미 없음
  • 각 원소는 키(key)로 구별
    • 키: 각 원소의 절대 위치. 중복 불가(↔원소는 중복 가능)

=> 연관배열과 해싱은 동일한 개념!

 

 

 

 

 

🔸데이터 집합 

  • 키의 데이터 집합원소 타입의 데이터 집합 쌍이 모인 집합
  • 키의 타입(정수, 문자열 등)과 원소의 타입에 따라 다양한 타입 존재
//Perl - 해시(hash)타입
%walk = ('Tue' => 2000, 'Mon' => 2000, 'Wed' => 2500, 'Sun' => 1000);

//C++ - map 타입
map<String, int> walk {{"Tue", 2000}, {"Mon", 2000}, {"Wed",2500}, {"Sun", 1000}};

 

 

 

 

 

🔸연산 집합

  • 원소 참조, 원소 추가, 원소 삭제 등
//Perl 원소 참조
$walk{'Sun'};

//Perl 원소 추가, 원소 삭제
$walk{'Thu'} = 3000;
delete $walk{'Mon'};

//C++ 원소 참조
walk['Sun'];

//C++ 원소 추가, 원소 삭제
walk.insert({"Thu", 3000});
walk.erase("Mon");

 

 

 

 

 

 

 

04. 구조체와 공용체

 

✅ 구조체(structure type)

= 레코드형(record type)

  • 데이터의 모음으로 구성된 타입
    • 원소: 동질형/이질형 모두 가능 
    • 각기 다른 타입의 데이터라도 서로 연관이 있다면 모아놓은 것
  • 각 원소는 이름으로 구별
    • 이름: 각 원소의 타입으로 선언된 변수명

 

 

 

 

 

🔸데이터 집합

  • 각 원소의 타입에 해당하는 데이터 집합들이 모인 집합
  • 원소의 개수와 각 원소의 타입에 따라 다양한 타입 존재
    • 각 원소의 타입: 단순타입, 복합타입 모두 가능

 

 

 

 

 

🔸연산 집합

  • 초기화, 대입 연산

 

 

 

 

 

✅ 공용체(union type)

  • 저장공간을 공유하는 데이터의 모음으로 구성된 타입
  • 원소들의 구성 형태는 구조체와 유사함 → 각 원소는 이름으로 구별
  • 하나의 공간을 같이 쓰기 때문에 공간 절약 가능하지만 한 원소의 값이 변경되면 다른 원소들이 영향을 받음

 

 

 

 

 

🔸데이터 집합

  • 각 원소의 타입에 해당하는 데이터 집합의 합집합
  • 각 원소의 타입에 따라 다양한 타입 존재
    • 각 원소의 타입: 단순타입, 복합타입 모두 가능
//C, C++ → union
union uni
{
   int i;
   char a;
   double f;
};

 

 

 

 

 

🔸연산 집합

  • 개별 원소 타입의 연산 집합

 

 

 

 

 

 

 

05. 포인터형과 참조형

 

✅ 포인터형(pointer type)

  • 특정 데이터가 저장되는 주소 자체를 데이터로 다루는 타입
    • 특정 데이터 타입은 사용자가 지정(단순/복합타입)

C,C++

 

 

 

🔸데이터 집합

  • 가용한 범위의 주소를 포함
    • 32비트 시스템 → 2^32 이내
    • 64비트 시스템 → 2^64 이내

 

 

 

 

 

🔸연산 집합

  • 대입 연산
  • 덧셈, 뺄셈

C,C++ → 역참조 연산자 (*)

 

 

 

 

 

✅ 참조형(reference type)

  • 사용자가 지정하는 타입의 데이터가 저장된 주소 자체를 자신의 주소로 사용하는 타입

C,C++

 

 

 

 

 

 

🔸데이터 집합

  • 지정한 타입의 데이터 집합

 

 

 

 

 

🔸연산 집합

  • 지정한 타입의 연산 집합

 

728x90
반응형
728x90
반응형

 

01. 스택의 개념과 추상 자료형

 

✅ 스택

  • 객체와 그 객체가 저장되는 순서를 기억하는 방법에 관한 추상 자료형
    • 가장 먼저 입력된 자료가 가장 나중에 출력되는 관계를 표현(First In Last Out, LIFO)
  • 0개 이상의 원소를 갖는 유한 순서 리스트
  • push(add)와 pop(delete)연산이 한곳에서 발생되는 자료구조

 

 

 

 

 

🔸스택의 추상자료형

  • 스택 추상 자료형: 세 개의 연산(create, push, pop)만 해당 객체에 접근 가능하도록 제한하는 것
  • 추상 자료형은 운영체제/컴파일러 개발자들이 만드는 것으로 소프트웨어/애플리케이션 개발자들이 다른 연산으로는 객체(데이터)에 접근할 수 없도록 막고, 이를 이용해서 OS나 프로그래밍언어가 효율적으로 작동하게 만듬

▪️ CreateS 연산

Stack CreateS(maxStackSize) ::= 스택의 크키가 maxStackSize인 빈 스택을 생성하고 반환;

▪️ Push 연산

Element Push(stack, item) ::= if( isFull(stack) ) then{ 'stackFull' 출력; }else{ 스택의 가장 위에 item을 삽입하고 스택 반환; }

▪️ Pop 연산

Element Pop(stack) ::= if( IsEmpty(stack) ) then{ 'stackEmpty' 출력; }else{ 스택의 가장 위에 있는 원소를 삭제하고 반환; }

 

 

 

 

 

🔸Pop/Push 연산 실행

ⓡ CreateS(3);
② Push(stack, 'S');
③ Push(stack, 'T');
④ Pop('T');
⑤ Push(stack, 'R');
⑥ Push(stack, 'P');
⑦ Push(stack, 'Q');
⑧ Pop(stack);

  • top: 현재 스택에서 제일 위에 있는 값만을 가리키는 변수로 top을 이용해서만 스택에 접근할 수 있음

 

 

 

 

 

 

 

02. 스택의 응용과 구현

 

🔸스택의 다양한 응용

  • 변수에 대한 메모리의 할당과 수집을 위한 시스템 스택
  • 서브루틴 호출 관리를 위한 스택
    • 예) main 함수에서 A 함수를 호출하고 A함수에서 B함수를 호출할 경우, B함수 실행 종료 후 돌아가야할 위치, A함수 실행 종료 후 돌아가야할 위치를 저장하는데 스택이 사용됨
  • 연산자들 간의 우선순위에 의해 계산 순서가 결정되는 수식 계산
  • 인터럽트의 처리와 이후 리턴할 명령 수행 지점을 저장하기 위한 스택
  • 컴파일러, 순환 호출(재귀호출) 관리

 

 

 

 

 

🔸스택의 삭제 연산

int a = 5;
int b = a--; //b = 5, a = 4

int a = 5;
int b = --a; //b = 4, a = 4
  • top--에서 사용된 '--' 연산자의 위치에 따라 연산의 적용 순서가 달라질 수 있음

 

 

 

 

 

🔸스택의 구현

 

▪️ 스택의 생성

#define STACK_SIZE 10
typedef int element;
element stack[STACK_SIZE];
int top = -1;

 

▪️ 스택의 삭제 연산

element pop(){
	if(top == -1){
            printf("Stack is Empty!\n")
            return 0;
    }else{
    	return stack[top--]; //리턴 후, 삭제
    }
}

 

▪️ 스택의 삽입 연산

void push(element item){ //스택의 삽입 연산, item=400
	if(top >= STACK_SIZE-1){
            printf("Stack is Full!\n");
            return;
    }eles{
    	stack[++top] = item;
    }
}

 

 

 

 

 

 

 


03. 사칙 연산식의 전위/후위/중위 표현

 

📌 컴퓨터가 계산을 하기 위해 혹은 계산을 더 빠르게 하기 위해서 수식을 가지고 있어야 하는데 이는 사람이 사용하는 수식 표현 방법과 다름

 

🔸수식의 계산

  • 연산자의 계산순서를 생각해야 함
  • A+B*C+D ▶ ((A+(B*C))+D)

 

 

 

 

 

🔸수식의 표기 방법

  • 중위 표기법(infix notation)
    • 연산자를 피연산자 사이에 표기하는 방법
    • A+B

 

  • 전위 표기법(prefix notation)
    • 연산자를 피연산자 앞에 표기하는 방법
    • +AB

 

  • 후위 표기법(postfix notation)
    •  연산자를 피연산자 뒤에 표기하는 방법
    • AB+

 

 

 

 

 

🔸중위 표기식의 후위 표기식 변환 방법

  1. 먼저 중위 표기식을 연산자의 우선순위를 고려하여(피연산자, 연산자, 피연산자)의 형태로 괄호로 묶어줌
  2. 각 계산 뭉치를 묶고 있는 괄호 안에서 연산자를 계산뭉치의 가장 오른쪽으로 이동시킴
  3. 각 계산 뭉치를 하나의 피연산자로 고려하여 위의 작업을 반복함
  4. 괄호를 모두 제거함

 

 

 

 

예)

입력받다가 연산자가 나오면 하위 두개의 값을 pop해서 연산한 뒤 다시 push
위 작업을 반복하다보면 결과값이 도출됨

 

728x90
반응형

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

[자료구조] 6. 연결 리스트의 응용  (0) 2022.11.30
[자료구조] 5. 연결리스트  (0) 2022.11.28
[자료구조] 4. 큐  (1) 2022.11.25
[자료구조] 2. 배열  (0) 2022.11.05
[자료구조] 1. 자료구조의 개념  (0) 2022.11.04
728x90
반응형

 

01. 배열의 정의

 

✅ 배열

  • 메모리 공간(메인 메모리, DDR)에 저장되는 원소의 물리적인 위치순차적으로 결정
    • 배열의 순서 == 메모리 공간에 저장되는 원소값의 물리적 순서
  • 원소들은 모두 같은 자료형과 같은 크기의 기억 공간을 가짐
  • 인덱스와 원소값(<index, value>)의 쌍으로 구성된 집합

 

인덱스와 주소값의 관계(인덱스와 메모리 주소값을 매핑하는 건 운영체제)

  • 인덱스(index)
    • 컴퓨터의 내부구조나 메모리 주소와 무관하게 개발자에게 개념적으로 정의됨(추상화된 값) → 불변
    • 보통 배열의 인덱스는 0부터 시작
    • 인덱스를 이용해서 원소값에 접근하기 때문에 직접 접근 가능
  • 메모리 주소값은 실제 메모리의 물리적인 위치값(주소값)
    • 실제로 연속된 메모리에 저장됨
    • 주소값은 가변적임(시간이 지나거나 프로그램을 실행할 때마다 변경됨)

 

 

 

 

 

 


02. 배열의 추상 자료형

 

▪️ 추상자료형: 객체 및 관련된 연산의 정의
예를 들어 C언어의 printf() 처럼 C 컴파일러 개발자가 만들어 놓은 것을 다른 개발자들은 가져다 쓰기만 하면 되는...

▪️ 자료형: 메모리 저당 할당을 위한 선언
int, float, ...
'내가 프로그래밍에서 이 변수에 대해서 이러한 메모리 영역을 할당받고 싶어'라고 선언하는 것

 

🔸ADT Array 객체

  • < i∈Index, e∈Element > 쌍들의 집합
    • Index: 순서를 나타내는 원소의 유한집합
    • Element: 타입이 같은 원소의 집합

 

 

 

🔸연산

a∈Array;
i∈Index;
item∈Element;
n∈Integer;
  • a: 0개 이상의 원소를 갖는 배열
  • item: 배열에 저장되는 우너소
  • n: 배열의 최대 크기를 정의하는 정수값

 

 

 

 

 

 

 

03. 배열의 연산의 구현

※ 컴파일러 개발자의 역

 

▪️ 배열 생성

//① Array create(n) ::= 배열의 크기가 n인 빈 배열을 생성하고 배열을 반환;
void create(int *a, int n){	//n=5
	int i;
    for(i=0, i<n, i++){
    	a[i] = 0;
    }
}

 

▪️ 배열 생성 결과

 

 

 

▪️ 배열값 검색(retrieve 연산)

/*
	② Element retrieve(a, i) ::= if(i∈Index) then{ 
                                                    배열의 i번째에 해당하는 원소값 'e'를 반환; 
                                                 }else{  
                                                    에러 메세지 반환; 
                                                 }
*/
#define array_size5
int retrieve(int *a, int i){ //i=2
	if(i>=0 && i<array_size){
    	return a[i];
    }else{
    	printf(Error\n);
        retrun(-1);
    }
}

 

▪️ 배열값 검색 결과

다음과 같이 원소값이 저장되어있다고 가정하며, 30이 출력됨

 

 

 

▪️ 배열값 저장(store 연산)

/*
	③ Array store(a, i, e) ::= if(i∈Index) then{ 
    				배열 a의 i번째 위치에 원소값 'e'를 저장하고 배열 a 반환; 
        	}else{ 
                    인덱스 i가 배열 a의 크기를 벗어나면 에러메세지 반환; 
            }
*/
#define array_size 5
void store(int *a, int i, int e){ //i=3, e=35
	if(i>=0 && i<array_size){
    	a[i] = e;
    }else{
    	printf("Error\n")
    }
}

 

▪️ a[3]의 값이 35로 변경되어 저장된 모습

 

 

 

 

 

 

 


04. 1차원 배열 및 배열의 확장

 

✅ 1차원 배열

예) A[3] 주소계산 = 00+3*1

  • 한 줄짜리 배열을 의미하며 하나의 인덱스로 구분됨
  • A[]의 시작주소값을 a라고 가정하면, A[i] 저장 주소는 [a+i*k]가 됨(k: 메모리할당단위)
  • 운영체제가 이러한 규칙을 기반으로 데이터에 접근

 

 

 

 

 

✅ 행렬의 배열 표현

  • 행렬을 컴퓨터에서 표현하기에는 2차원 배열(1차원 배열을 여러 개 쌓아 놓은 것)이 적합함

 

 

 

 

 

🔸행 우선 배열

 

 

 

🔸행 우선 할당

  • 가로의 1차원 배열 단위로 메모리 영역을 우선 할당함

 

 

 

 

 

🔸열 우선 배열

 

 

 

🔸열 우선 할당

  • 세로의 1차원 배열 담위로 메모리 영역을 우선 할당함

 

 

 

 

 

🔸C언어에서의 2차원 배열(행 우선 순서 저장)

  • C언어에서 A[5][3]을 선언하면 다음과 같은 배열 생성
  • 사용하는 언어가 어떠한 배열 저장 규칙을 갖고 있는지를 알면 좀 더 향상된 프로그램 실행 속도를 찾아낼 수 있다!
0, 0 0, 1 0, 2 0, 3 0, 4
1, 0 1, 1 1, 2 1, 3 1, 4
2, 0 2, 1 2, 2 2, 3 2, 4

 

 

 

 

 

 

 


05. 희소행렬의 개념

 

✅ 희소행렬

  • 원소값이 0인 원소가 그렇지 않은 원소보다 상대적으로 많음
  • 메모리 낭비를 막고 효율성을 높이기 위해서 0인 원소는 저장하지 않고 0이 아닌 값만을 따로 모아서 저장하는 방법이 필요 => 희소행렬(추상화를 한 번 더한 것)

 

 

 

728x90
반응형

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

[자료구조] 6. 연결 리스트의 응용  (0) 2022.11.30
[자료구조] 5. 연결리스트  (0) 2022.11.28
[자료구조] 4. 큐  (1) 2022.11.25
[자료구조] 3. 스택  (0) 2022.11.05
[자료구조] 1. 자료구조의 개념  (0) 2022.11.04
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
반응형

 

오류 내용

The server cannot be started because one or more of the ports are invalid. Open the server editor and correct the invalid ports.
:실행시킨 톰캣 포트 번호가 유효하지 않아서 발생한 에러


 


1. 이클립스 하단에 있는 서버 탭에서 등록한 톰캣을 더블클릭 한다.

 







2. Tomcat admin port란에 사용하지 않는 포트 번호를 입력한다. (8005, 8009...)

-> 보통 서버를 새로 설정하면 '-'로 설정되어있어서 위의 에러가 발생

 







3. 설정 후, 서버를 재시작하면 정상적으로 실행된다

 




 

728x90
반응형

+ Recent posts