💻 개발자 취업과 커리어에 필요한 컴퓨터 공학 기초
이제 업스테이지 AI Lab 4주차 과정에 들어섰습니다. 이번 4주차 과정에서는 컴퓨터 공학 개론을 주제로 실시간 강의와 온라인 강의를 통해 정말 핵심적인 내용을 배웠습니다.
AI(인공지능)를 이해하기에 앞서 필요한 학습과정이라고 느꼈기에, 해당 강의가 필수로 포함되어 매우 반가웠어요. 복잡하게만 느껴졌던 컴퓨터 시스템의 구조를 조금씩 이해하게 되니, 앞으로 어떤 프로젝트에서 이 지식이 어떤 역할을 하게 될지 기대가 됩니다. 또한, 비전공자로서 컴퓨터 공학에 대한 전반적인 이해를 할 수 있는 시간이 되었습니다.
그렇다면, 이번에 배운 내용을 바탕으로, 제가 이해한 컴퓨터 공학에 대한 전반적인 개념을 복습할 겸 간단히 정리해볼게요.
🖥️ 컴퓨터 아키텍처
컴퓨터 아키텍처 수업을 들으면서, 컴퓨터 내부 구조가 복잡하지만 체계적인 구성으로 이루어졌다는 사실을 다시 한번 깨닫게 되었어요. 그동안 그냥 작동한다고만 생각했던 컴퓨터 안의 세계가 얼마나 정교하고 복잡하게 움직이는지를 실감했습니다.
⚙️ 핵심 구성 요소 간의 상호작용
특히, 컴퓨터 아키텍처는 CPU, 메모리, 입출력 시스템과 같은 주요 구성 요소들이 서로 어떻게 상호작용하며, 정보를 처리하는지를 이해하는 데 중점을 둡니다. 이러한 구성 요소들이 어떻게 조화를 이루어 전체 시스템을 효율적으로 운영하는지 배울 수 있었습니다.
- CPU: 데이터를 계산하고 명령을 실행하는 컴퓨터의 두뇌
- 메모리: CPU가 자주 쓰는 데이터를 임시로 저장하는 공간
- 입출력 시스템: 사용자와 컴퓨터가 소통하는 창구
CPU는 컴퓨터의 핵심적인 처리 장치로, 데이터를 계산하고 명령을 실행하는 역할을 한다. 메모리는 CPU가 빠르게 접근할 수 있는 데이터를 저장하는 공간이며, 입출력 시스템은 외부 기기와의 상호작용을 담당한다.
이 세가지 구성 요소들이 유기적으로 움직여야 프로그램 하나가 제대로 실행된다는 걸 배우고 나니, 그동안 당연하게만 여겼던 기술이 새삼 대단하게 느껴졌어요.
🔢 데이터는 어떻게 처리될까?
특히, 인상 깊었던 부분은 데이터 처리 방식이었습니다. 컴퓨터는 모든 정보를 이진수로 처리하기 때문에, 우리가 쉽게 이해할 수 있는 텍스트나 숫자도 모두 0과 1로 변환됩니다.
이와 같이, 컴퓨터는 모든 걸 0과 1로 처리한다는 것은 익히 들어왔지만, 실제로 부동 소수점 숫자의 처리, ASCII/유니코드 인코딩 등을 배우면서 그 원리를 좀 더 깊이 이해할 수 있었습니다. 이 과정에서 단순히 데이터를 입력하고 출력하는 것처럼 보이는 행위가 실제로는 매우 복잡한 과정을 거친다는 점이 흥미로웠어요.
컴퓨터 아키텍처를 통해 기술적 요소들의 상호작용을 더 넓은 시각으로 보게 되었고, 이를 통해 컴퓨터가 작동하는 원리와 그 안에 내포된 복잡성을 이해할 수 있었습니다.
🔧 운영체제의 역할
운영 체제 파트에서는 하드웨어와 소프트웨어 자원을 효율적으로 관리하는 데 운영 체제가 얼마나 중요한 역할을 하는지 깨달았습니다. 운영 체제는 말 그대로 시스템을 운영하는 소프트웨어로, 시스템의 하드웨어와 응용 프로그램 간의 매개체 역할을 하고 있어요. 이번 파트를 배우면서, 운영체제가 얼마나 많은 일을 도맡아 하고 있는지 알게 되는 시간이었습니다.
🔧 시스템 호출로 자원 관리하기
운영체제는 시스템 호출(System Call)을 통해 사용자 프로그램이 하드웨어 자원을 쓸 수 있도록 도와줍니다. 예를 들어, 우리가 파일을 열거나, 인터넷을 사용할 때 이 시스템 호출이 작동하는 거죠.
이를 통해 운영 체제가 사용자와 하드웨어 사이의 중요한 다리 역할을 한다는 점을 이해하게 되었어요. 정리하자면, 운영 체제는 이러한 시스템 호출을 통해 하드웨어 자원(예: 메모리, CPU, 디스크 등)을 관리하고, 사용자가 원활하게 컴퓨터를 사용할 수 있도록 합니다.
🧵 프로세스와 스레드 관리
프로세스 및 스레드 관리는 저에게 특히 흥미로운 주제였습니다. 프로세스는 실행 중인 프로그램을 의미하고, 스레드는 프로세스 내에서 실행되는 작은 작업 단위를 뜻합니다.
여기서 운영 체제는 여러 프로세스와 스레드를 동시에 효율적으로 관리해서 멀티태스킹이 가능하게 만들어줘요. 처음 배울 때에는 멀티태스킹과 동기화의 개념이 다소 복잡해하게 느껴졌지만, 이를 이해하고 나니 운영 체제가 각 작업을 어떻게 조율하고 조정하는지 더 명확해졌습니다.
특히, 교착 상태(deadlock)와 같은 문제가 발생할 수 있다는 사실을 배우면서, 자원 관리의 복잡성을 실감할 수 있었습니다.
💾 가상 메모리의 마법
가상 메모리 개념도 매우 흥미로웠어요. 가상 메모리를 통해, 운영체제는 실제 메모리보다 더 큰 프로그램도 실행할 수 있습니다.
여러 프로그램이 동시에 실행될 때, 운영 체제는 가상 메모리를 사용해 각 프로그램에 필요한 메모리 공간을 할당하고, 물리적 메모리의 한계를 극복하는 데 도움을 줍니다. 이를 통해 제가 실행하는 여러 프로그램들이 실시간으로 어떻게 메모리를 효율적으로 관리하고 있는지 알게 되었고, 그 과정에서 운영 체제의 역할을 다시 한 번 실감하게 되었어요.
결국 운영 체제는 컴퓨터 자원의 효율적이고 안정적인 운영을 책임지는 핵심적인 소프트웨어라는 사실을 명확히 알게 되는 시간이었습니다.
🌐 네트워크 - 컴퓨터의 소통 방식
네트워크를 배우면서 컴퓨터 간 통신 방식에 대한 이해가 크게 확장되었습니다. 그동안 인터넷이 어떻게 작동하는지 기술적인 측면에서 항상 궁금했었는데, 이 과정이 그 궁금증을 해소해 주었어요.
📡 네트워크 계층과 프로토콜
네트워크 계층에서 물리적 연결, 데이터 전송 방법, 그리고 상위 계층에서의 프로토콜이 어떻게 함께 작동하는지를 배웠습니다. TCP/UDP 같은 전송 계층 프로토콜과 HTTP와 같은 애플리케이션 계층 프로토콜이 네트워크 통신에서 어떻게 중요한 역할을 하는지도 알게 되었어요.
이 과정을 통해 네트워크상에서 장치들이 데이터를 주고받는 방식에 대한 전반적인 흐름 등 네트워크의 기본 원리를 파악할 수 있었습니다.
🔍 Wireshark로 패킷 들여다보기
특히 인상 깊었던 점은, Wireshark와 같은 네트워크 분석 도구를 통해 패킷 전송을 실시간으로 분석해본 경험이었습니다. Wireshark는 네트워크 상에서 주고받는 패킷을 캡처하고 분석할 수 있는 도구로, 네트워크 통신이 어떻게 이루어지는지를 시각적으로 확인할 수 있었어요.
이 도구를 통해 실제로 데이터가 어떻게 전송되고, 그 과정에서 발생하는 오류들이 어떻게 처리되는지를 직접 보게 되니 매우 놀라웠습니다. 이론적으로만 배웠던 내용들이 실제로는 어떻게 적용되는지 눈으로 확인하는 것은 큰 만족감을 주었어요.
⚖️ TCP vs UDP
또한, TCP와 UDP 같은 전송 계층 프로토콜의 차이점을 배우면서 데이터 전송의 신뢰성과 속도 간의 트레이드오프에 대해 더 깊이 이해하게 되었습니다.
- TCP: 신뢰성을 중요시하여 전송 중 데이터 손실을 감지하고 재전송
- UDP: 속도를 우선시하여 오류 검출을 생략하고 빠르게 데이터를 전송
이러한 차이를 알게 되니 왜 어떤 애플리케이션은 TCP를 사용하고, 다른 애플리케이션은 UDP를 사용하는지 그 이유가 명확해졌습니다.
결국 네트워크 학습을 통해, 프로토콜이 서로 어떻게 협력하여 데이터를 한 장치에서 다른 장치로 안정적으로 전송하는지에 대한 이해를 깊이 할 수 있었습니다. 단순히 인터넷을 사용하는 것이 아니라, 그 뒤에서 일어나는 복잡한 통신 과정을 알고 나니, 네트워크의 작동 원리에 대해 보다 깊은 통찰력을 얻게 되었습니다.
⚡ 시스템 프로그래밍
시스템 프로그래밍 부분에서는 하드웨어 및 운영 체제와의 직접적인 상호작용에 대해 깊이 이해하게 되었습니다. 평소 애플리케이션 개발에만 집중했던 저로서는, 프로그래밍이 시스템의 리소스와 어떻게 통신하고 관리하는지 알게 되면서 새로운 시각을 얻게 되었어요.
📁 파일 처리와 프로세스 관리
그중에서도 파일 처리와 프로세스 관리는 소프트웨어가 시스템 자원을 어떻게 활용하고 제어하는지 보여주는 중요한 부분이었습니다. 파일 입출력은 운영 체제가 하드웨어를 통해 데이터를 어떻게 읽고 쓰는지, 그리고 프로세스가 생성되고 종료되는 과정은 어떻게 관리되는지를 이해할 수 있었어요.
🔄 IPC(프로세스 간 통신)
특히, 흥미로웠던 것은 프로세스 간 통신(IPC, Inter-Process Communication)이었습니다. 여러 프로세스가 독립적으로 실행되면서도, 서로 데이터를 공유하고 협력하는 방식은 매우 복잡하면서도 필수적인 개념이었어요.
이를 배우면서 마치 시스템의 내부 구조를 들여다보는 듯한 느낌을 받았습니다. 파이프(pipe), 메시지 큐(message queue), 공유 메모리(shared memory) 등 IPC를 통해 프로세스가 어떻게 효율적으로 데이터를 주고받는지 알게 되었고, 이런 메커니즘이 시스템의 성능과 안정성에 얼마나 중요한 역할을 하는지도 깨닫게 되었습니다.
🔌 소켓 프로그래밍
또한, 소켓 프로그래밍은 저에게 완전히 새로운 기술이었습니다. 소켓 프로그래밍을 통해 TCP와 UDP를 사용하여 네트워크 애플리케이션을 직접 구축할 수 있게 되었어요.
이제는 단순히 웹 브라우저나 채팅 애플리케이션이 어떻게 작동하는지 개념적으로 아는 것을 넘어서, 실제로 그들의 통신 방식을 코드로 구현할 수 있게 되었습니다. TCP는 안정적이지만 느린 반면, UDP는 속도가 빠르지만 신뢰성이 떨어진다는 특징을 살펴보며 각각의 장단점을 파악할 수 있었어요.
시스템 프로그래밍을 통해 컴퓨터와 네트워크 간의 상호작용이 단순히 애플리케이션 레벨에서 이루어지는 것이 아니라, 운영 체제와 하드웨어 레벨에서 깊이 연결되어 있다는 사실을 체감하게 되었어요. 이러한 이해는 앞으로 제가 더 복잡한 시스템이나 애플리케이션을 개발할 때 매우 유용한 기반 지식이 될 것 같아요.
🗄️ 데이터베이스 - 데이터를 다루는 법
데이터베이스 섹션을 배우면서, 관계형 데이터베이스와 비관계형 데이터베이스의 차이점을 명확히 이해하게 되었어요. 이는 실무적으로, 어떤 상황에서 어떤 DB를 써야하는지 등의 데이터 관리 전략을 선택하는 데 매우 중요한 기준이 될 것 같아요.
🔗 관계형 데이터베이스의 체계적 관리
관계형 데이터베이스는 구조화된 데이터를 효율적으로 관리하는 시스템으로, MySQL을 통해 직접 테이블을 생성하고, SELECT, INSERT, UPDATE, DELETE와 같은 SQL 명령을 사용해 데이터를 처리하는 법을 배웠습니다.
특히, 기본 키(primary key)와 외래 키(foreign key)를 통해 테이블 간의 관계를 설정함으로써 데이터 간의 일관성과 참조 무결성을 보장할 수 있음을 알게 되었어요. 이런 구조 덕분에 복잡한 데이터를 체계적으로 관리하고, 필요한 정보를 효율적으로 추출할 수 있었습니다.
이와 같이, 관계형 데이터베이스는 데이터의 정합성 유지와 관계 형성에서 특히 강력하다는 점에서 깊은 인상을 받았습니다.
📄 NoSQL MongoDB의 유연성
반면, NoSQL 데이터베이스인 MongoDB는 저에게 새로운 경험이었습니다. 관계형 데이터베이스와 달리 NoSQL은 더 유연하게 구조화되지 않은 데이터를 처리할 수 있었으며, 특히 문서 기반의 데이터 모델을 사용해 대용량 데이터에 적합하다는 것을 깨달았거든요.
전통적인 테이블 대신 JSON 형식의 문서로 데이터를 저장하고 관리하는 방식은 구조적 제약이 적어, 빠르게 변화하는 데이터 환경에 유리했어요. 이런 시스템이 실시간 데이터 처리나 비정형 데이터 관리에 얼마나 유용한지 알 수 있었습니다.
📊 데이터베이스 선택 기준
MongoDB와 같은 비관계형 데이터베이스가 빅데이터와 같은 방대한 양의 데이터를 처리하는 데 적합하다는 점이 크게 와닿았습니다. 현대의 데이터 양은 기하급수적으로 증가하고 있으며, 이처럼 유연하고 확장성 높은 데이터베이스 시스템이 그 데이터를 처리하고 관리하는 데 필수적이라는 점이 명확해졌어요.
다양한 데이터베이스 시스템을 학습하면서, 데이터 관리의 효율성뿐만 아니라 그 선택이 프로젝트의 특성과 데이터 구조에 맞춰 얼마나 중요한 결정인지를 이해할 수 있는 시간이었습니다.
💡 핵심 요약 및 시사점
4주차에 학습한 내용을 종합해보면, 컴퓨터 시스템의 다양한 부분들이 서로 긴밀하게 연결되어 작동하는 방식에 대한 깊은 이해를 얻게 되었습니다.
이번주에 학습한 내용을 요약하면 다음과 같습니다:
- 🖥️ 컴퓨터 아키텍처에 대한 이해 : 컴퓨터의 내부 구조와 데이터 처리 방식, CPU와 메모리 간 상호작용을 통해 시스템의 기본 동작을 파악
- 🔧 운영체제의 핵심 역할 : 운영 체제가 하드웨어와 소프트웨어 자원을 관리하며, 프로세스와 메모리, 파일 시스템 등을 조정하여 시스템 안정성을 보장하는 역할
- 🌐 네트워크 통신의 원리 : 컴퓨터 간 통신을 가능하게 하는 네트워크 프로토콜과 모델을 학습하여 인터넷과 네트워크 시스템의 작동 원리를 이해
- ⚡ 시스템 프로그래밍의 실무 적용 : 파일 처리, 프로세스 제어, 소켓 프로그래밍을 통해 시스템 자원과 하드웨어와의 직접 상호작용을 프로그래밍으로 구현
- 🗄️ 데이터베이스 관리 전략 : 관계형 및 NoSQL 데이터베이스를 사용하여 데이터를 효율적으로 구조화하고 관리하며 쿼리를 통해 데이터를 처리하는 방법
🔄 시스템 통합적 사고의 중요성
컴퓨터 아키텍처는 하드웨어가 시스템의 기초를 형성하는 방식을 보여주었고, 운영 체제는 이러한 자원들이 어떻게 효율적으로 관리되는지 깨닫게 해주었습니다. 네트워킹을 통해 시스템들이 실시간으로 소통하는 방식을, 시스템 프로그래밍을 통해서는 저수준에서의 제어력을 배웠으며, 데이터베이스는 데이터 관리와 쿼리의 중요성을 알게 되었어요.
모든 것이 조화롭게 작동함으로써 현대 시스템이 구현되고 있음을 체감하게 되었습니다.
🚀 개발자 관점에서의 적용분야
배운 내용을 기반으로 실제 개발 프로젝트에 적용할 방법을 고민하는 것은 중요한 과정입니다. 이번 학습에서 얻은 지식들을 통해 제가 앞으로 어떻게 더 나은 개발자가 될 수 있을지, 그리고 어떤 분야에 이를 적용할 수 있을지를 생각하게 됩니다.
효율적인 코드 작성과 성능 최적화 측면에서, 컴퓨터 아키텍처를 이해하면서 CPU의 구조와 메모리 계층을 깊이 있게 배운 덕분에 프로그램을 더 효율적으로 설계하는 방법을 고민하게 되었어요. 프로세스와 스레드 관리에 대한 이해를 바탕으로 병렬 처리를 효율적으로 수행할 수 있는 코드를 작성할 수 있다면, 애플리케이션 성능을 획기적으로 개선할 수 있습니다. 특히 서버 애플리케이션이나 대용량 처리가 필요한 서비스에서 이러한 기술을 사용해 성능을 최적화할 수 있을 것입니다.
네트워크 기반 애플리케이션 개발에서는 TCP/UDP, HTTP와 같은 프로토콜을 통해 데이터를 주고받는 방식을 알게 되었고, 이를 기반으로 더 신뢰성 있고 효율적인 네트워크 애플리케이션을 구축할 수 있을 것이라고 기대해요. 특히 멀티스레드 네트워크 서버나 실시간 통신이 중요한 애플리케이션, 예를 들어 채팅 애플리케이션이나 스트리밍 서비스 등에서 그 지식을 적용할 수 있을 것입니다.
대규모 데이터 관리와 처리 영역에서는 MySQL이나 MongoDB와 같은 데이터베이스 시스템을 사용해 데이터를 빠르고 효율적으로 쿼리하고 관리하는 방법을 배운 것이 데이터 중심 애플리케이션 개발에 큰 강점이 될 수 있습니다. 대규모 트래픽을 다루는 웹 서비스나 데이터 분석이 중요한 프로젝트에서 관계형과 비관계형 데이터베이스의 특성을 적절히 활용하는 방식으로 최적화된 시스템을 설계할 수 있어요.
이러한 학습 내용들을 종합해보면, 성능 최적화와 대규모 데이터 처리, 그리고 네트워크 애플리케이션 개발이 앞으로 제가 적용할 수 있는 주요 분야가 될 것입니다. 컴퓨터 아키텍처에서 배운 지식을 바탕으로 하드웨어의 성능을 최대한 끌어내는 소프트웨어를 작성하고, 네트워킹에서 배운 통신 기술을 활용해 원활하고 빠른 연결을 보장하는 시스템을 만들며, 데이터베이스 기술로는 방대한 데이터를 효율적으로 처리하는 애플리케이션을 구현하는 것이 목표가 됩니다.
결론적으로, 이번 학습에서 얻은 지식들은 단순한 이론이 아니라, 실제 개발 상황에서 효율적으로 적용될 수 있는 도구로 작용할 것으로 기대됩니다.
🔮 5주차 학습 계획 및 기대 : Git
Upstage AI Lab 5주차 과정에서는 Git에 대한 이해와 사용법, 팀프로젝트 적용 등과 관련하여 실시간 강의와 온라인 강의로 병행할 예정입니다.
해당 학습 기간에는 Git에 대한 이해와 사용법을 다룰 예정인데, 이는 코드 관리를 위한 필수 도구라, Git을 통해 저장소의 개념을 이해하고, 팀 프로젝트에서 발생할 수 있는 다양한 상황들을 해결하는 방법을 배울 수 있을 것 같습니다.
특히, 팀 프로젝트에서의 Git 활용은 매우 중요한데, 이는 실전과도 같은 경험을 제공하며 협업과 문제 해결 능력을 키워주지 않을까 하는 기대감이 있어요. 또한, Git과 GitHub를 능숙하게 다루는 것은 향후 프로젝트 관리 및 협업에 큰 도움이 될 것으로 기대됩니다.
컴퓨터 공학 기초를 탄탄히 다진 만큼, 이제 실제 개발 협업 도구인 Git을 마스터해서 더 체계적이고 전문적인 개발 역량을 기를 수 있을 것이라 기대하고 있어요! 🚀
🔗 관련 글 보기
기초 이론 학습 여정:
팀 경진대회:
'📚 AI 개발 노트' 카테고리의 다른 글
[Upstage AI Lab 5기부트캠프] 부트캠프 지원 과정 (7) | 2024.11.03 |
---|---|
Git 기초부터 팀 협업까지 ─ Upstage AI Lab 5주차 (5) | 2024.10.26 |
AI를 위한 데이터 분석의 기초 : 통계 ─ Upstage AI Lab 5기 3주차 (1) | 2024.10.14 |
AI 엔지니어로서의 준비 ─ Upstage AI Lab 5기 2일차 (5) | 2024.09.25 |
Upstage AI Lab 5기 OT 후기 (3) | 2024.09.24 |
댓글