본문 바로가기
Game DevTip/STL

1. 자료구조 전 기초 상식(?)

by LIKE IT.라이킷 2024. 12. 7.

  • 객체지향 프로그래밍 OOP
    • 클래스는 Define하기 위해 만드는 객체이다.
    • 엔진들은 모두 모듈화(상속이 되어있다.)
  • 프로그래밍 동작 순서
    • 하드 → 메모리(용량 큼) 속도 조금 느림 → 레지스터(용량 작음) 속도 빠름 → CPU
  • 선언파일(h), 구현파일(cpp)차이점
    • 헤더파일은 이름같은거 정의 할때 선언(public, protected, private으로 공개 범위 적용)
    • 구현파일은 헤더파일을 가지고 오거나 해당 변수를 이용하여 기능을 구현.
  • 변수(*메모리에 공간을 할당하는 것은 운영체제가 해줌.) 빌트인 타입, 유저인 타입(*클래스도 마찬가지임)
  • 즉, 메모리 공간하면, 구조를 생각 후 → 객체를 생각해줘야 한다.
  • 유저 디파인 타입 : 구조체 타입을 사용하여 만들어야 함(예시 : 캐릭터가 가질 수 있는 속성들을 보관.)
  • 변수는 메모리를 할당하여 데이터를 저장 → 객체가 만들어 진다는 뜻임.

 

  • 재귀호출(this)(스택 메모리를 씀.) → 주소를 복사하지 않고 객체 데이터 자체를 복사.재귀호출 잘못 짜면 스택이 쌓이고 메모리가 쌓이면서 무한 루프로 메모리 누수에 빠짐.
  • (*스택 오버플로우) → 주의해서 쓸 것.
  • 전역변수 : 힙 메모리에 저장.
  • 자기가 자기 자신을 호출한다.(클래스 자기 자신을)
  • 인풋장치에서 데이터가 들어오면?
  • 바이너리 데이터가 생성되어 CPU에서 처리된다.
  • 컴퓨터 시스템 게층구조순서 : 하드웨어→운영체제→응용프로그램→통신

  • 메모리 구성
    • 높은 번지(High Address) 순으로 정렬 : 힙 → 미사용공간 → 스택 → 전역변수 → 기계코드
    • 지역변수가 사용하는 공간 : 스택공간. → 미사용공간에데가 할당하면서 만들어줌.
    • 글로벌 변수(전역변수) : 별도로 따로 메모리를 저장함(전역변수 공간에)
    • 동적할당 (포인터) : 힙 메모리에 만들어짐.
    • 기계코드 : 함수들이 들어감(main(), fcn()*함수는 파라미터(스택)
  • 함수 호출에 따른 활성화 레코드 코드 예시
    • 리턴되면 함수가 사라짐(fcn는 사라지고 main 함수가 다시 cpu에서 처리를 함.)
    • fcn함수가 호출 되는 순간에는 main 함수를 건들지 않음.
    • 스택 메모리는 제일 위에 있는 영역만 건드리고 힙 메모리는 동적메모리 할당하고, 해제하면 다른 포르그램이나 함수에서 사용 가능하도록 해당 메모리를 비워둠.
  • 함수호출 관련 예시.
    • 컨텍스트 스위칭을 수반함.
    • 새로운 활성화 레코드를 생성함.
    • 연속적인 함수호출에 따라 활성화 레코드가 스택에 생성됨.
    • 함수 종료시 제일 위의 활성화 레코드가 사라지고 직전의 상황을 복원.(return 코드임..)
    • (나중에 들어온 메모리가 우선순위가 높다.)
  • 자료구조란?
    • 데이터를 구성, 처리 , 검색, 저장하기 위한 특별한 형식.
    • 자료구조는 데이터 값, 관계, 연산의 모음이다.(규칙적인 놈들)
    • 자료구조는 대량의 데이터를 효율적으로 관리하는 메커니즘이다.
  • 기본 자료구조
    • 컴파일러에서 제공해주는 기본 타입 : 리니어 타입. - 빌트인 타입. (float, bool, int, 배열, 스택, 큐, 링크드 리스트.)
    • 배열 : 맵
    • 스택 : 메뉴관리 (*경로탐색 ( 깊이우선 탐색가능))
    • 미로라면 방문하는 위치가 계속 스택에 들어감(
    • 링크드 리스트 : 발사된 총알 개수 관리
    • 큐 : 스택과 다르게 먼저 들어온 녀석이 먼저 서비스로 나감. (*경로탐색 (너비 우선 탐색가능))
    • 마치 벽을 짚고 미로를 탈출하는 것마냥 경로탐색.(너비우선 탐색)
    • 컴파일러에서 제공하지 않는 타입 : 논리니어 타입. 트리, 그래프, 트리, 해쉬 테이블 - (검색효율은 짱임.)
  • 문제해결 과정에서 중요한 개념
    • 코딩을 하기전에 문제를 먼저 분석, 분해
    • 패턴 파악
    • 객체를 확인하고 추상화(뼈대만 남기고 세부적인거 다 제거)
    • 객체에 대한 요소들을 파악
    • 자료구조를 설계(데이터 구조 + 알고리즘)
    • 클래스를 세분화 하여 코딩
    • 전체를 조립해서 프로그램을 완성한다.
반응형

댓글