⏳ 들어가며 - 자료구조란?
실생활에서 우리는 물건(데이터)들을 그룹(조직화)화 하고 정리(관리)하기 위해 다양한 방법을 사용합니다.
이러한 방법들은 자료구조의 개념과 유사하게 데이터를 효율적으로 다루기 위해 필요한 아이디어들을 반영하고 있습니다.
데이터 세계에서 이러한 개념을 자료 구조(Data Structure)라고 표현합니다.
⏳ 기본적인 자료구조
프로그래밍에서 데이터를 효과적으로 조작하고 저장하는 것은 매우 중요한 역할을 합니다.
이를 위해 다양한 자료구조가 개발되었으며, 각 자료구조는 특정 작업을 더 효율적으로 수행할 수 있도록 설계되었습니다.
자료구조는 데이터의 구조와 데이터 간의 관계를 나타내는 방법을 제공하며,
데이터의 삽입, 삭제, 검색, 정렬 등과 같은 연산을 효율적으로 수행할 수 있도록 도와줍니다.
이 중 선형 데이터 구조와 비선형 데이터 구조에대해 알아보겠습니다.
이제부터 다룰 자료구조 중 (어레이, 리스트, 스택, 큐, 트리, 그래프) 는 프로그래밍 언어에 독립적인 자료구조로써 프로그래밍에서 자주 사용되는 여러 가지 자료구조 중 일부입니다. 이러한 자료구조는 언어마다 조금씩 차이가 있을 수 있습니다.
⏳ 그래서 이걸 어디써요?
자료구조는 알고리즘의 구현과 최적화에 중요한 역할을 하며, 주어진 문제를 해결하는 데 필요한 데이터 구성과 접근 방법을 결정하는 데 도움을 줍니다. 이를 통해 프로그램의 성능을 개선하고 메모리 및 시간을 효율적으로 사용할 수 있습니다.
예를들면, 여행지 도착을 위해 목적지에 가장 빠르게 갈 수 있는 교통안내 수단 알고리즘을 적절한 자료구조 및 설계로 만들수 있습니다.
택시, 버스, 기차, 도보이동 등의 방법으로요.
⏳ 선형 구조? 비선형 구조?
⏳ 배열(Array)이란?
동일한 데이터 타입의 요소들을 순차적으로 저장하는 선형 자료구조입니다.변수가 하나의 데이터를 저장하기 위한 것이라면 배열은 여러 개의 데이터를 저장하기 위한것입니다.
여러 개의 데이터 중 내가 찾고싶은 데이터는 인덱스를 사용하여 각 요소에 접근할 수 있으며, 메모리상에서 연속적으로 할당된 공간에 요소들이 저장됩니다.
// 크기가 3인 정수형 배열 선언 및 생성
int[] numbers = new int[3];
자바 프로그램에서 위 코드로 배열을 생성하면 컴퓨터는 메모리에 크기 3만큼의 공간을 할당해서 사용자가 사용할 수 있도록 합니다.
위 그림과 같이 배열을 구성하는 데이터의 자료형에 따라서 배열의 메모리 크기가 결정됩니다.
크기가 3인 int형(4byte)이므로, array 배열의 메모리는 총 12byte의 메모리 크기를 차지하게 됩니다.현대는 메모리가 풍족한 시대라서 임베디드 시스템이나 모바일 기기와 같은 제한된 리소스를 가진 환경 외 메모리를 개발자가 직접 다루는 일은 잘 없다고 봐도 무방하지만, 이러한 기본적인 원리, 구조 정도는 알고있는 것이 차후 훌륭한 개발자로 성장하는데 도움이 될 것이라 생각합니다.
⏳ 배열을 선언하고 초기화 안하면 어떻게 되나요?
자바에서 배열을 선언하면 해당 배열은 기본적으로 해당 데이터 타입의 기본값으로 초기화 됩니다.
// 선언만 할 경우 각 요소가 기본값 0으로 초기화.
int[] numbers = new int[3];
// 다른 값을 가진 배열을 생성하고 싶다면, 초기화 과정을 직접 수행.
int[] numbers = { 10, 20, 30 };
데이터 타입의 기본값은 아래와 같습니다.
byte // 0
short // 0
int // 0
long // 0
float // 0.0
double // 0.0
char // \0 (U + 0000)
boolean // false
string // null
map // null
⏳ 배열은 언제 사용해야 할까요?
배열은 생성할 때 크기를 정해줘야 하기 때문에 당연히 데이터의 수가 정확하지 않을 때 보다 데이터의 수가 정확할 때 사용해야 합니다.
배열의 크기를 작게한다면 원하는 만큼의 데이터를 담지 못할 수 있고, 반대로 크게 한다면 메모리가 낭비될 수 있습니다.
배열은 크기가 고정되어 있고 요소의 삽입 및 제거가 일반적인 상황에서는 다소 복잡한 작업이 될 수 있습니다.
배열의 크기를 변경하려면 새로운 배열을 생성하고 기존 요소를 복사해서 만드는 방법이 있지만, 비효율적이며 성능상 문제로 일반적으로는 다른 자료구조를 사용하는 것이 더 효율적입니다.
이러한 고정된 상태를 정적 배열(Static Array)이라고도 불린다고 합니다.
배열의 경우 인덱스를 사용하여 요소에 빠르게 접근할 수 있습니다.
인덱스를 통해 직접적으로 해당 요소에 접근하므로 검색 속도가 빠르다는 장점이 있습니다.
그럼 반대로 배열의 크기를 동적으로 조절할 수 있는 상태를 동적 배열(Dynamic Array)라고 하며,
List와 유사한 기능을 제공하는 ArrayList와 LinkedList가 있는데 이는 다음 장에서 다루겠습니다.
정리하면..
저장할 데이터의 개수가 정해져 있으면 배열
반대로 저장할 데이터의 개수가 정해져 있지않으면 리스트
⏳ 저는 자바를 쓰는데 컬렉션이란 것도 있던데 그건 뭐에요?
각 언어마다 자체적으로 제공되는 내장된 자료구조 프레임워크나 라이브러리는 조금씩 차이가 있습니다.
C++에서는 std::vector, list, map 과 같은 STL(Standard Template Libaray) 컨테이너를 제공하고,
Java에서는 Java Collections Framework라는 내장 된 자료구조 라이브러리를 통해 제공되며,
다양한 데이터 구조를 쉽게 활용할 수 있도록 도와줍니다.
⏳ 자료구조에서 리스트(List)란?
자료구조에서 리스트는 프로그래밍에서 데이터 요소를 순차적으로 저장하고 관리하기 위한 추상화된 개념을 나타냅니다.
리스트는 데이터를 담는 컨테이너로, 여러 개의 요소가 순차적(선형적)으로 연결되어 있습니다.
배열과 반대로 크기가 고정이 되어있지 않고 가변적입니다. 추가, 제거, 탐색하는 등의 작업을 편리하게 할 수 있는 기능을 제공합니다.
아래 그림은 자바의 내장 패키지인 java.util에 포함되어 있는 컬렉션입니다.
다음장에서 자바 컬렉션 프레임워크와 시간복잡도에 대해서 다룰 예정입니다.
⏳ 정리하며
자료구조와 배열에 대해 좀 더 명확하게 알게되는시간이였습니다.
다음장에서는 자바에 컬렉션 프레임워크와 시간복잡도도 학습하여 다룰예정입니다.
긴글 읽어주셔서 감사합니다.
틀린점이나 고칠점이 있으면 거침없는 피드백을 댓글로! 부탁드립니다!
'BackEnd > Java' 카테고리의 다른 글
Scanner VS BufferedReader 차이 (1) | 2023.11.11 |
---|---|
Spring의 3대 요소 (IoC, DI, PSA, AOP) (0) | 2023.10.13 |
Spring Boot 설치 세팅 (STS 설치) - Oracle, Mybatis (4) | 2023.02.06 |
자바 Java JDK 설치하기 (0) | 2023.02.05 |