
자료구조란?
자료 구조
는 데이터가 어떤 구조로 저장되고, 또 어떻게 사용되는지를 나타냅니다.
우리가 평소에 선언하여 사용하던 변수나 배열 같은 것이 자료구조에 해당합니다.
오늘은 이 자료 구조가 정확히 어떤 것이고, 또 왜 중요한 지에 대해 쉽게 알아보도록 하겠습니다!
그러기 위해서, 자료구조의 개념을 우리가 잘 아는 동화인 <여우와 두루미> 이야기에 빗대어 알아보는 시간을 가져보려 합니다.
여우의 음식은 어디에 담아야 할까?
여우와 두루미가 서로 음식을 준비한 뒤 바꾸어 먹기로 약속을 하였습니다.
그래서 여우는 두루미를 위한 식사로 두부를 준비하였네요!
1번 네모난 그릇, 2번 동그란 그릇, 3번 컵 중 어느 용기에 담아가는 것이 좋을까요?
이렇게 음식을 담을 때 어느 용기에 담을 지 고민하는 것 처럼, 데이터를 담을 형식을 선택할 때에 개발자들은 항상 고민하게 됩니다.
예를 들어, 반 아이들의 평균 시험 점수를 계산하는 코드를 짠다고 가정해봅시다.
데이터를 정수형 변수에 담아 표현한다면,
int grade1 = 70;
int grade2 = 80;
int grade3 = 52;
int grade4 = 100;
int grade5 = 38;
return (grade1 + grade2 + grade3 + grade4 + grade5) / 5;
이렇게 표현이 될 수 있겠죠?
그러면 이번엔 배열이라는 자료 구조를 사용해서 표현해볼까요?
int[] gradeArr = {10, 40, 30};
int gradeSum = 0;
for(int grade : gradeArr) {
gradeSum += grade;
}
return gradeSum / gradeArr.length;
여러분은 어떤 방법이 더 좋아보이나요?;
성적 자체를 구하는 과정이 더 직관적인건 1번 코드일 수 있겠지만,
성적의 값이 변하거나 추가, 삭제 되는 경우를 고려했을 때는 2번 코드가 더 좋아보입니다.
이처럼 데이터를 담는 용기가 무엇이냐에 따라 코드가 달라지게 됩니다.
여우와 두루미가 서로의 음식을 먹을 수 있을까?
우여곡절 끝에 여우와 두루미가 서로의 음식을 준비해왔습니다.
여우는 평소에 자신이 편하게 사용해왔던 넓적한 그릇에 음식을 준비해왔고, 두루미는 자신이 먹던 입구가 좁은 호리병 모양 그릇에 음식을 준비했습니다.
이 상황에서 여우와 두루미는 서로의 음식을 바꾸어 먹을 수 있을까요?
여우와 두루미가 먹을 수 있는 그릇이 정해져있는 것 처럼, 자료 구조는 사용자의 요구사항에 따라 달라져야 합니다.
속도나 메모리 등 여러 요인들을 고려해서 좋은 자료구조에 데이터를 담아내는 것이 개발자의 역할입니다.
예를 들어, 간단한 연락처 관리 서비스를 개발한다고 가정해 보겠습니다.
class Contact {
String name;
String phoneNumber;
Contact(String name, String phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
}
public class BadContactManager {
Contact[] contacts = new Contact[10];
int size = 0;
void addContact(Contact contact) {
if (size < contacts.length) {
contacts[size++] = contact;
}
}
String findPhoneNumberByName(String name) {
for (int i = 0; i < size; i++) {
if (contacts[i].name.equals(name)) {
return contacts[i].phoneNumber;
}
}
return null; // 연락처를 찾지 못했을 경우
}
}
이 코드의 경우 배열을 사용해서 연락처 정보를 저장합니다.
연락처를 저장하고 검색하는 기능을 제공하지만, 배열의 크기가 고정되어 있어서 동적으로 연락처를 추가하기가 힘들죠.
또한, 특정 연락처를 검색할 때 모든 원소를 순차적으로 검색하므로 효율성이 떨어집니다.
import java.util.HashMap;
public class GoodContactManager {
HashMap<String, String> contacts = new HashMap<>();
void addContact(String name, String phoneNumber) {
contacts.put(name, phoneNumber);
}
String findPhoneNumberByName(String name) {
return contacts.get(name); // 키를 통해 바로 값(전화번호)를 검색
}
}
하지만 코드를 이렇게 작성하면 HashMap
을 사용하여 연락처 정보를 관리하면서, 연락처를 동적으로 추가 삭제하는데에 자유롭고, 연락처의 이름을 키로하여 효율적인 검색 기능을 제공할 수 있습니다.
이는 HashMap 자료구조가 내부적으로 해시 테이블을 사용하는 자료구조이기 때문입니다. 따라서 연락처가 많아질수록 더욱 효율적입니다.
이처럼 데이터를 어느 자료 구조에 담는지, 또 어떠한 자료 구조로 코드를 작성하는 지에 따라 좋은 코드와 나쁜 코드가 구분될 수 있습니다.
앞으로 다양한 자료구조에 대해 더 알아보도록 하겠습니다!
안녕하세요, 저는 주니어 개발자 박석희 입니다. 언제든 하단 연락처로 연락주세요 😆