
빅오(Big O)?
어떤 문제에 대한 해결 방법은 당연 하나만 존재하지 않을 것이다.
적게는 2개에서 많게는 수십가지 그 이상이 될 수도 있다. 근데 그중에 어떤 해결 방법이 최고인지 어떻게 알 수 있을까?
먼저 간단하게 작은 문제로 생각해보자
- 하나의 문제가 있고 두개의 해결 방법이 있다.
- 하나는 루프(loop)를 사용하고, 하나는 리스트와 같은 것을 이용해서 똑같은 것을 해결한다고 생각하자
- 자, 어떤 것이 더 좋은 해결 방법일까?
=> 이것이 바로 빅오(Big O)의 핵심이다.
빅오는 하나의 시스템이자 여러가지 코드를 일반적으로 서로 비교하고 성능을 평가하는 방법이다.
코드 분류/비교 시스템
우리가 사용하는 많은 코드 중 코드를 분류하거나 비교 할 수있는 시스템이 있으면 얼마나 좋을까?
빅오 표기법이 그런 목적을 갖고 있다.
이런 분류 시스템이 중요할까? 근본적인 궁금증이자 물음일 것 같다.
나도 공부를 시작할 때 굳이?, 어떤게 더 좋은 코드인지 비교하고 확인하는게 중요한가? 작동만 되면 해결아님???
이라고 생각했다.
예를 들어 일상에서 자주 보는 먹거리 그 중에 과일, 사과를 생각해보자
내가 사과를 살 것인데 어떤 사과가 좋은지 알기 쉽지 않다. 하지만 사과와 같은 과일은 비교할 수 있는 수단이 여러가지 있다.
1. 생김새와 같은 외형이 될 수도
2. 당도가 표시되어 있다면 당도를 볼 수도
3. 아니면 어떤 지역에서 생산된 사과인지를 보고 비교한 후 결정을 할 수있을 것이다.
같은 사과인데 왜 비교를 해야할까? 결론은 당연하다 내 돈주고 사먹는데 더 맛있을걸 먹고 싶으니까
다시 코드 이야기로 돌아가보자
내가 당장 만들고 있는 프로젝트 내의 코드는 딱히 흠잡을 곳이 없다고 생각된다. 왜? 잘 돌아가니까
그렇기 때문에 굳이 자료구조와 알고리즘이 왜 필요한지 와닿지 않는다.
그럼 나는 왜 자료구조와 알고리즘을 공부하고 그 중 기초이자 핵심인 빅오(Big O)에 대해서 알아보고 있을까
알고리즘과 자료구조가 필요해?
이에 대한 근본적인 해답은 사실 너무 간단하다.
아마 나와 같은 개발자가 되기 위해 공부하거나 신입 개발자에게 한정으로 말이다.
알고리즘과 자료구조를 공부하는 이유, 바로 면접 때문이다!
정확히는 코딩 테스트를 보고 면접을 봐야되는데 코테에서 떨어지고 붙는다고 해도 면접에서 질문이 들어오면 벙어리가 되기 때문에 공부한다. 이게 나의 알고리즘 공부 시작의 이유이고 나와 비슷한 사람이 많지 않을까 한다.(아님말고)
그럼 궁금하다 회사에서는 왜 알고리즘과 자료구조를 중요하게 여길까?
대학에서 공부할 때도 사실 알고리즘과 자료구조에 대한 수업을 듣긴 했다. 왜냐면 다들 듣길래ㅋㅋ
앞전에 이야기 한듯이 내가 지금 만들고 있는 혹은 만들 예정인 토이 프로젝트나 포트폴리오용 사이트는 구조가 간단하다.
만드는 사람이 나 혼자고, 검수하는 것도 나 혼자고, 주로 이용하는 사람도 나 혼자인데 당연하다.
하지만 회사 입장은 다르다. 적어도 수백, 수천명의 사용자에 대한 여러 데이터가 존재할 것이다. 이렇게 큰 데이터셋을 다루는 기업에서 한 알고리즘이 다른 알고리즘보다 실행하는데 한 시간이 더 빠르다면 코드의 흐름이 바뀌고 많은 시간을 덜수 있을 것이다.
- 그렇기 때문에 코드의 성능을 얘기할 때 정확한 전문용어를 사용하는 것이 중요하다.
- 내가 만든 해결방법이 만족스럽더라도 다른 사람이 만든 해결방법과 비교하면서 성능이 어떤지 이해하는 것이 나에게 도움이 될 것이고, 나의 성장은 곧 팀의 성장이된다.
- 여러 접근법의 장단점을 이야기 할때도 유용하다.
- 이 해결법은 많은 데이터를 다루는 것을 잘 할 수 있고, 다른 하나는 오래걸리되 처리시간에 변수가 적어 더 안정적이게 사용이 가능할 수 있다라는 장단점을 생각할 수 있다.
- 하나의 기능을 만들었는데 속도가 느리다면 디버깅을 할 때 왜 속도가 느린지 이해할 수 있다.
- 빅오를 이해하면 어디서 문제가 생겼는지, 비효율적인 코드를 찾는데 도움이 된다.
- 그리고 코테던 면접이던 실무던 개발자로서 살아갈거면 결국엔 한번쯤은 당면하게될 문제가 될 수 있으니 공부하자