자료구조(Data Structure) 는 자료를 저장하는 구조 데이터를 저장하고 관리하는 방식이라고 한다.
ex) 전화번호부
전화를 알게 될 때마다 그때그때 하위로 저장한다.
하지만 저장된 번호가 많아질 수 록? 검색하는 속도가 늘어나고 찾기 힘들어 지게 된다.
만일 가,나,다 순으로 저장을 할 경우 위 경우보다 전화번호를 찾기 쉽게 된다.
하지만 가에 지정된 번호로 저장을 하게 된다면 또 다시 하위에 있는 리스트목록은 리셋되게 된다.
조금 더 효율적인 구조를 생각하게 된다면?
ㄱ, ㄴ, ㄷ 순으로 분류를 하되 각각의 데이터 공간을 널널하게 주어 준다. 그리고 전화번호를 저장할 땐 해당하는 공간에 선착순으로 저장하게 된다.
이 구조는 저장도 쉽고 검색속도가 빨라지게 된다.
하지만 주어진 각각의 ㄱ, ㄴ, ㄷ... 의 공간낭비가 초래된다.
이런식으로 전화번호를 어떤 구조에 저장할지에 따라서 장,단점이 분명하게 나타난다.
프로그래밍의 자료구조도 어떤 자료구조에 저장하느냐에 따라서 검색과 같은 알고리즘의 속도도 분명 차이나게 된다.
이에 따라 실행 시간의 차이가 나고 메모리 공간도 효율적으로 사용할 수 있다.
즉 자료구조와 알고리즘은 실행 시간의 차이와 메모리 공간을 고려하여 효율적으로 설계를 해야한다.
(알고리즘은? ) 어떠한 문제를 해결하는 방법이라고 한다.
예를 들어 전화번호부가 자료구조라면 전화번호를 찾는 방법을 말할 수 있다.
ex) 전화번호부 구조에 따라 검색 알고리즘이 달라지는 것
*프로그래밍 기본 원리*
[메모리]
데이터를 저장하는 곳은 '메모리' 이다.
메모리에는 하드디스크와 램 메모리가 있다.
저장버튼을 누르면 하드디스크에 저장이 되고, 저장 된 실행할 경우 램 메모리에 데이터가 올라가게 된다.
비효율 적인 자료구조를 사용하게 되면 램 메모리를 낭비하고 프로그램 성능 속도를 저하의 원인이 된다.
램 메모리: 전기 신호를 저장해줄 수 있는 트랜지스터의 전기 신호로 off일 경우 0, on일 경우 1로 나타낸다.
[Bite & Byte]
Binary Digit(2진수) 를 표현할 수 있다. 이를 bit이라고 표현하고
1 bit: 0, 1 (2) 하나의 bit는 참 or 거짓
2bits (2² = 4) : 2bit는 00, 01, 10, 11 총 0~4가지의 숫자를 표현할 수 있다.
4bits (2⁴ = 16) : 0000 ~ 1111 더 많은 숫자 표현 (0 ~15)
8bits(2⁸ = 256 ): (0 ~ 256) 8개의 단위를 묶어서 데이터의 최소단 byte라고 표현한다.
[2진수와 16진수 이해]
* [8bits = 2nibble => 1Byte] *
- 1bit 4개 => nibble (4bits)
- 1Byte의 앞, 뒤 각 4bits를 nibble
- 16진수는 nibble단위로 표기한다.
- nibble 2개 => 8bits는 Byte라고 한다.
*컴퓨터가 저장하는 최소단위는 1 byte (8bits)이다.
[nibble] : 2x2x2x2 = 16
nibble은 2⁴, 4bits로 0 - 15까지 표현할 수 있다.
*10진수 체계에서 0- 9까지 숫자는 존재하지만, 10의 자리 숫자들을 한자리 숫자로 표현하는 것은 존재하지 않았다.
그래서 10의자리 숫자(10 - 15까지) 를 알파벳 (a- f)까지로 표현하게 됐다.
이로인해 16진수가 등판하게 된다.
*2 nibble (4bits : 4bits)
- nibble은 16진수로 F(15)
- 0xFF: 16진수(0x) 앞 뒤 두개의 nibble(F)
- 1Btye : 8개의 bits로 구성되어 있음 2⁸ = 256 ( 0~ 255 데이터 저장 )
8 bits = 1 byte
16 bits = 2 bytes
32 bits = 3 bytes
64 bits = 8 byes
1 byte = 1 Kbyte ( 10³ )
1000 Kbyte = 1 Mbyte ( 10⁶ )
1000 Mbyte = 1 Gbyte ( 10⁹ )
1000 Gbyte = 1Tbyte ( 10¹² )
컴퓨터는 2진법을 사용한다.
- 2진법 binary: 0b를 앞에 붙임
- 16진법 hexadecimal : 0x를 앞에 붙임
숫자가 커지면 2진법으로 표현하기 힘들어 지기때문 16진법을 사용하게 된다.
217의 10진법: 217
217의 2진법 : 11011001
217의 16진법: 2⁴ (2진수 4개를 16진수 하나로 표현을 하게 된다.) 1101은 13이고 1001은 9이다.
변환 표기법을 사용하여 16진수로 사용하면 13은 D이고 9는 9이기에 16진법으로 217은 0xD9이 된다.
★ 0과 1을 사용해서 2진수를 나타내고 이를 통해서 10진수를 나타내고
10진수를 사용하여 화면상의 글자나 색상을 나타낸다. 나아가 영상까지 만들어낸다.
오늘날 컴퓨터에서 정보를 표현하는 거의 모든 방법이다.
어떤 방법을 사용해서 정보를 나타내든 결국 0과 1들로 표현이 된다.
[메모리 주소]
컴퓨터가 특정 데이터 값을 찾을 때 해당 데이터의 주소 값으로 찾게 된다.
1Byte마다 특정 주소값을 갖는다.
컴퓨터는 숫자로바께 표현을 할 수가 없다.
그래서 문자를 출력시엔 컴퓨터에서 문자를 숫자로 표현할 수 있도록 국제적으로 규약을 맺었.
이것을 ASCIIcode라하고 128개의 문자를 숫자와 1=1매칭 시켰다.
Character또한 1byte를 갖는다.
만약 문자 ASCII = 'A'를 표현하자면 01000001 = 65 이다.
LIST는 Array와 Linked List가 있다.
Array는 메모리상에서 연속적으로 할당된다.
만약 1,2,3,4의 int형 변수 4개를 묶어서 저장하고 싶다면 하나하나가 int변수이기에 각각 4바이트 총 16바이트의 메모리를 차지한다. 16바이트 메모리에 1, 2, 3, 4를 2진법으로 저장시킨다.
각 데이터는 가장 작은 데이터를 대표 address로 표현한다.
Linked List는 array와 다르게 불연속적으로 저장이 된다.
값만 저장한다면 무엇이 나올 지 모르기에 다음으로 나올 값의 address도 함께 저장한다.
이런식으로 저장한다면 연속성을 나타낼 수 있게 된다.
그래서 하나의 데이터에 value와 address를 같이 묶은것을 하나의 Node라 칭한다.
address의 메모리가 만일 4btye라 한다면 하나의 메모리(value + address) 는 8byte가 된다.
다음 주소값이 저장되어 있기 때문에 연결된채로 연속성을 유지할 수 있게 된다.
★메모리구조는 추후에 자료구조를 이해하는데 큰 도움이 된다.
'CS > 자료구조와 알고리즘' 카테고리의 다른 글
프로그래밍 기본 원리_데이터 (0) | 2023.05.10 |
---|---|
퀵 정렬, 병합 정렬, 힙 (0) | 2022.09.04 |
시간복잡도와 공간복잡도 (0) | 2022.09.03 |
댓글