일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- r
- 삼성SW역량테스트
- Bit
- REACT
- BFS
- 이분탐색
- 펜윅 트리
- dp
- 데이터 분석
- 백준 1753번
- 접미사 배열
- 고속 푸리에 변환
- LCS
- 다이나믹 프로그래밍
- 수학
- 그리디
- jpa
- ICPC
- 다익스트라
- 종만북
- 삼성 SW 역량테스트
- 생활코딩
- Cloud Pub/Sub
- Air Table
- CI/CD
- 컴퓨터 구조
- 시뮬레이션
- JavaScript
- 우선순위 큐
- Cloud Run
- Today
- Total
코딩스토리
1장 - 기본개념 본문
자료구조와 C++ 1장 정리
목차
- 시스템 생명 주기
- 객체 지향 설계
- 데이터 추상화와 캡슐화
- c++의 기초
- 알고리즘 명세
- 표준 템플릿 라이브러리
- 성능 분석과 측정
1. 시스템 생명주기
Data Structure(자료구조) - Sequential (순차적) : 배열
- Non-Sequential (비순차적) : 연결 리스트
- 스택, 큐, 트리, 그래프는 둘 다 표현 가능
먼저 시스템은 Input - Process - output의 단계를 거친다.
이에 생명주기는
① 요구조건 -> ② 분석 -> ③ 설계 -> ④ 정제와 코딩 ->⑤ 검증 단계를 거친다.
2. 객체 지향 설계
객체 지향 설계 vs 구조화 프로그래밍
유사점 : 분할 - 정복 기법 사용
차이점 : 분할 방법
객체 지향 설계 | 구조화 프로그래밍 |
소프트웨어 = 객체의 집합 소프트웨어를 객체로 분해 재사용성 변경에 유연 (객체만 수정하면 됨) |
소프트웨어 = 프로세스 프로세스의 스텝을 나타낸다 모듈로 분해 전통적 프로그래밍 |
객체 -> 데이터 + 연산 +oid(객체 식별자)
객체 지향 언어의 조건 : 객체 지원, 모든 객체는 class에 소속, 계승 지원
3. 데이터 추상화와 캡슐화
데이터 캡슐화 - 외부에 대해 내부 표현을 사용자에게 은폐 (정보 은닉) ex. private(전용) 멤버 함수로 선언
데이터 추상화 - 데이터 객체의 명세와 구현을 분리 ex. 멤버 함수의 선언은 class내에서, 구현은 class밖에서
데이터 캡슐화와 추상화의 장점
- SW 개발 간소화
- 디버깅 단순화
- 재사용성
- 데이터 타입 표현의 수정
C++의 데이터 타입
- 기본 데이터 타입 : char, int, double, float... (타입 수식어 - short, long, unsigned, signed)
- 파생 데이터 타입 : pointer, reference(참조)
- 데이터 캡슐화 구조 : structer, class, array
- 사용자 정의 데이터 타입 : user defined data type
추상 데이터 타입 (ADT) : 객체의 명세와 객체에 대한 연산의 명세를 객체의 표현과 연산의 구현으로부터 분리시킨 데이터 타입 (사용자 정의 타입도 이에 해당) -> 명세와 구현을 분리한다는 것이 중요!
데이터 | 연산 | |
추상화 | ADT | 알고리즘 |
구체화(구현) | 데이터 타입 | 프로그램 |
4. C++의 기초
C++에서의 영역
- 파일 영역 : 함수 정의에 속하지 않은 선언
- 네임스페이스 영역 : 논리적으로 연관된 변수나 함수를 한 그룹으로 묶은 영역 (이름 공간)
- 지역 영역 : 블록 안에 선언된 이름 ex. (), {},...으로 이루어진 블록
- 클래스 영역 : 클래스 정의에 관련된 영역
Q1) 블록 안에서 전역 변수의 이름을 지역 변수로 다시 사용했을 때, 전역 변수 접근 방법은?
A1) int y=:: x ->영역 연산자 : 가장 바깥에 있는 x 사용
Q2) 어떤 전역 변수가 file1.c에 정의되어있고, file2.c에서 사용되어야 한다. 어떻게 선언해야 사용할 수 있는가?
A2) extern int x; ->extern은 외부에 있는 변수, 전역 변수를 쓸 것이란 이야기이다.
Q3) 한 프로그램에서 file1.c와 file2.c가 같은 이름의 전역 변수를 사용하였다. 변수명을 바꾸지 않고 사용하는 방법은?
A3) static int x; -> 정적 전역 변수 = 이것에 해당되는 파일에서만 유효한 변수
지역 변수의 정적 변수화 -> 함수 내에서 static으로 선언이 되면 함수 실행 시 초기화되지 않음
추가적으로
const -> 상수 변수 ex. const int Max=500; -> Max 변수를 500으로 고정
enum -> 열거 타입 ex. enum semester {Spring, Summer, Fall, Winter};
매개 변수 전달 방법
call by value | call by reference |
전달된 객체를 값으로 받음 저장소에 복사, 실인자 영향X ex) void bfs (int x) {}; |
전달된 객체의 주소만 저장 직접 접근을 하므로 실인자 영향 O 타입 명세자에 & 추가 ex) void bfs (&const int x) |
call by reference로 매개 변수 전달 시 실 인자가 변하는 것을 원하지 않는다면 const(상수 참조) 사용!!
C++ 메모리 동적 할당
동적 할당 시 - new
메모리 해제 시 - delete
ex) int * kr = new int [10] //kr이라는 이름의 int형 배열의 크기를 10으로 할당하겠다.
delete [] kr; //kr의 메모리 해제
inline 함수 -> 함수 호출과 인자 복사의 오버헤드를 줄임, 함수를 호출하지 않고 바로 실행
5. 알고리즘 명세
알고리즘 - 특정 일을 수행하기 위한 명령어의 유한 집합
요건
- 입력, 출력
- 명백성 : 모호하지 않은 명확한 명령
- 유한성 : 반드시 종료되어야 함
- 유효성 : 기본적, 실행 가능
ex. flowchart 가 알고리즘이 아닌 이유 - 명백성, 유효성 결여
선택 정렬, 이원 탐색 코드 등은 https://github.com/kimtaehyun98/-에 정리해 놓았음
6. 표준 템플릿 라이브러리 (Standard Template Library)
STL 사용 시 이미 많은 기본적인 함수들이 정의되어 있기 때문에 보다 빠르고 쉽게 코드를 작성 가능하다.
예시는 위의 github에 정리해 놓았다.
7. 성능 분석과 측정
- 명세에 부합
- 정확히 작동
- 문서화
- 논리적 작업 단위를 위한 함수 효과적 이용
- 코드의 판독 용이
- 메모리 효율적 사용
- 적절한 시행 시간
프로그램에 필요한 공간
고정 공간 요구 : c
-> 명령어 공간, 단순 변수, 고정 크기의 구조화 변수
가변 공간 요구 : Sp(I)
-> 문제의 인스턴스, I에 의존하는 공간, 즉 가변 공간, 스택 공간
따라서 공간 요구량은 S(p) = c + Sp(I)
시간 복잡도 : 컴파일 시간 + Tp(실행시간)인데 컴파일은 한번 완료 후에는 더 이상 하지 않으므로 고려하지 않음
점근 표기법 - 정확한 단계의 계산이 무의미 하기 때문에 평균,최대 수행 단계수를 구하는 방법 |
O(n) - f(n) <= c * g(n)이고, 모든 n이 n>n0 인 어떠한 n0와 c가 존재한다면, f(n)=O(g(n)) 이다. |
- 가장 작은 g(n)을 O(n)으로 표시한다, n>n0인 모든 n에 대하여 f(n)의 상한 값은 g(n)이 된다. |
Ω(n) - f(n) >= c * g(n)이고, 모든 n이 n>n0 인 어떠한 n0와 c가 존재한다면, f(n)=Ω(g(n)) 이다. |
- n>n0인 모든 n에 대하여 f(n)의 하한 값은 g(n)이 된다. |
Θ(n) - c1 * g(n) <= f(n) <= c2 * g(n)이고, 모든 n이 n>n0 인 어떠한 n0와 c1,c2가 존재한다면, f(n)=Θ(g(n)) 이다. |
- 상한값과 하한값 모두 가짐 |
시간 복잡도와 매직 스퀘어 관련 코드는 https://github.com/kimtaehyun98/-
'자료구조와 c++' 카테고리의 다른 글
6강 - 그래프 (0) | 2020.06.12 |
---|---|
5장 - 트리 (0) | 2020.06.07 |
4강 - 연결리스트 (1) | 2020.06.03 |
3장 - 스택과 큐 (1) | 2020.05.29 |
2장 - 배열 (0) | 2020.05.27 |