CS 21

클래스 파고들기

클래스가 뭔가요?클래스는 객체를 만들기 위한 설계도로 데이터와 함수를 하나로 묶어 표현한 구조를 의미합니다.클래스는 객체가 가져야할 상태와 행동을 정의하고, 이 클래스를 기반으로 여러 객체를 생성할 수 있습니다. 클래스와 구조체의 차이가 뭔가요?클래스와 구조체는 문법상 비슷해 보이지만, 메모리할당방식과 참조방식에 중요한 차이점이 있습니다.클래스는 힙 메모리에 할당되는 참조타입이며, 구조체는 스택 메모리에 할당되는 값 타입 입니다.이로인해 클래스는 변수를 다른 변수로 변경할 시 기존에 같은 메모리를 참조하고 있던 다른 변수 또한 영향을 받으며구조체의 경우 스택에 할당되어, 값 자체만 복사하므로 복사본을 수정하더라도 원본에는 영향이 없다는 차이점이 있습니다.또한 구조체의 경우 특수한 상황이 아니라면 스택메..

CS 2025.04.24

컴파일의 각 단계 파고들기

컴파일 과정어휘분석 - 구문분석 - 의미분석 - 중간언어코드생성 - 최적화 - 기계어코드생성 - 링킹 어휘 분석 단계컴퓨터는 소스코드로 작성된 문자열을 그대로 해석할 수 없습니다.그렇기에 소스코드를 이해하기 앞서 문장을 키워드 단위로 분할하고 각 키워드 용도(변수, 기호, 연산자 등)를확인해 종류별로 태그를 붙이는 과정을 의미합니다. 구문 분석 단계어휘 분석 단계로 분리된 키워드를 통해 문장이 형성되는지 검사하는 단계입니다.각 문장은 세미콜론으로 구분되며 '주어와 동사관계가 옳바르게 형성되었는지'와 같이각 키워드들이 문법에 맞게 작성되었는지 확인하는 과정입니다. 의미 분석 단계문장의 형태가 완성되었더라도 의미가 부적합하다면 의미오류로 검출되는 과정입니다.타입의 불일치와 같이 실행할수 없는 상황인지 ..

CS 2025.04.22

컴파일 파고들기

컴파일이 뭔가요?사람이 이해하기 쉬운 코드로 구성된 고수준언어를 컴퓨터가 이해할 수 있는 저수준 언어 기계어 또는 중간언어로 번역하는 과정을 의미합니다. 왜 기계어와 중간언어로 나뉘는건가요?프로그램 빌드시 중간언어로 번역하는 컴파일 과정이 한번 발생되며, 프로그램 실행 시 준비되어 있던 중간언어를 CPU가 이해할 수 있게 번역하는 컴파일 과정이 일어납니다. 왜 굳이 두번으로 나뉘는건가요? 그냥 한번에 기계어로 끝내면 되는거 아닌가요?우선 CPU 마다 이해할 수 있는 기계어가 전부 다릅니다. 이에따라 고수준언어를 기계어로 바로 번역하게 될 경우모든 CPU 마다 다른 빌드작업이 필요하게 됩니다.그에 반면 중간언어로 컴파일을 미리 준비해놓고 이를 실행환경에 맞게 약간의 컴파일 과정으로 유연성을 확보할 수 있습..

CS 2025.04.22

오버로드, 오버라이드(가상테이블 개념) 파고들기

오버로딩이란?같은 이름을 가진 메서드 또는 연산자를 매개변수의 형태를 다르게 정의해 여러 버전으로 정의하는것을 의미합니다. 연산자의 오버로딩이란 무엇인가요?기존에 기본적으로 정의되어있던 연산자(+,-,== 등) 동작방식을사용자가 정의한 타입에 대해 별도로 새롭게 정의하는 방식입니다. 예를들어 '내 타입끼리 +를 하게되면 이런식으로 계산해' 와 같이 새로운 규칙을 추가하거나, 개념을 덧붙이는 것을 의미합니다.대신 연산자의 의미와 너무 다르게 동작할 경우 코드의 가독성이 떨어질 수 있어 주의해야 합니다.public static Vector2 operator +(Vector2 a, Vector2 b){ return new Vector2(a.x + b.x , a.y+b.y) } 오버로딩은 어떻게, 이렇게 동..

CS 2025.04.21

Static 파고들기

스태틱이란 뭔가요?클래스의 인스턴스가 아닌 클래스 자체에 속한 멤버를 의미합니다.일반적으로 클래스 내부 변수, 메서드는 인스턴스가 생성될때마다 개별적으로 존재하지만스태틱으로 선언된 멤버는 프로그램 시작시 메모리에 한번에 로드되어 모든 인스턴스가 공유하게 됩니다. 그로 인해, 전역적으로 관리되어야 하는 값, 공용 함수를 스태틱으로 선언해 활용이 가능합니다.다만 유의할 점은 스태틱 멤버의 메모리 해제 시점이 명확하지 않으므로씬 전환시 메모리에 남아 예상치 못한 공유 문제가 발생될 수 있습니다. 스태틱 멤버는 어떤 메모리에 할당되나요?정적 메모리 영역의 Data,BSS 각 영역에 할당되며 이는 프로그램이 종료될때까지 남아있게 됩니다.스태틱 멤버는 클래스가 처음 활용할때 초기화되며 이후 인스턴스가 활용할 수 있..

CS 2025.04.18

절차지향 프로그래밍 POP

절차지향 프로그래밍은 순차, 순서대로 진행 되는 프로그램을 설계하는 방식으로프로그램이 데이터를 처리하는 순서를 중요시 여기며, 위에서 아래로 실행되는 구조를 의미한다. 장점 구조 파악코드가 절차적으로 실행되므로 로직이 직관적이고 전체 로직의 가독성이 좋음코드 흐름이 명확해 디버깅, 테스트가 쉬움 적은 메모리 활용프로그램이 함수 중심으로 실행되기에 불필요한 메모리 소비가 적다 함수사용의 재사용성자주 사용되는 기능을 함수로 만들어 여러곳에서 재사용이 가능  단점 유지보수성프로그램의 규모가 커질수록 함수 간 관계가 복잡해지며 이는 유지보수성 저하와 관련되어있음변경 사항이 있을 경우 관련된 모든 함수에 영향이 있을 수 있음 제한적인 재사용성POP 의 경우 함수의 재사용만 가능하며 OOP 와 같은 상속을 통한 코..

CS 2025.02.13

객체지향 프로그래밍 OOP

객체지향 프로그래밍은 객체 라는 개념을 중심으로 설계 및 구현하는 프로그래밍 패러다임이다프로그램을 데이터와 동작을 가진 객체로 구성하며, 이 객체들간 상호작용으로 프로그램이 동작하는 방식으로 개발이 진행된다. 객체지향은 절차지향의 단점의 재사용성, 유지보수, 확장성을 개선하며협업에 용이한 소프트웨어 개발을 위해 도입된 개발 방식이다.  장점 재사용성의 증가이는 객체지향의 특징 상속성으로기존 클래스를 재사용해 새로운 파생 클래스를 제작할 수 있다.이는 부모클래스, 자식클래스로 나뉠 수 있으며 상속이라는 개념을 통해 제작된 클래스는제작될 때부터 이미 부모에 대한 데이터, 기능을 모두 갖게된다. 유지보수성 향상객체단위로 구성되므로 특정 기능을 수정해도 다른 부분의 영향이 최소화 될 수 있다.수정해야 할 부분이..

CS 2025.02.13

실행 플랫폼 별 생성되는 기계어 코드가 다른 이유

컴파일러는 실행할 플랫폼에 맞는 기계어 코드를 생성해야한다.하지만 운영체제와 CPU 아키텍처마다 명령어 세트, 실행 방식이 다르기에 동일한 소스코드라도 각 플랫폼에 맞게 다르게 변환된다. 주요 원인1. CPU 아키텍처의 차이 - CPU 마다 지원하는 명령어 세트가 다름 대표적 아키텍쳐 종류x86 = 데스크톱, 서버에서 사용ARM = 스마트폰, 임베디드 시스템 같은 코드라도 x86 과 ARM 에서 실행되는 코드가 다르게 컴파일 됨int Add(int a, int b){ return a + b; }====== x86 ======mov eax, edi ; // a 값을 eax 레지스터에 저장add eax, esi ; // b 값을 더함ret ; // 함수 반환====== ARM64 ..

CS 2025.02.10

컴파일러 Compiler

컴파일러는 프로그래밍 언어로 작성된 소스 코드를 기계어로 변환하는 프로그램이다.평소에 작성하는 코드는 사람이 이해하기 쉬운 고수준 언어이지만 컴퓨터는 기계어 0과 1로 된 코드만 이해할 수 있다.컴파일러는 이 둘을 연결해주는 역할을 하며, 소스 코드를 실행 가능한 프로그램으로 변환해준다. 컴파일러의 주요 역할1. 코드 변환 : 프로그래머가 작성한 코드를 컴퓨터가 실행할 수 있는 기계어로 변환2. 코드 최적화 : 성능 향상을 위해 중복 코드 제거, 실행 속도 개선, 메모리 최적화 등을 수행3. 오류 감지 : 코드에 문법 오류, 의미 오류가 있는지 검사 컴파일러 동작 과정1. 전처리 Preprocessing컴파일 전 코드에서 #include, #define 같은 전처리기 지시문을 처리하는 단계로이 과정에서는..

CS 2025.02.10

DI & DIP 의존성주입과 의존관계 역전원칙

의존성 주입이란 메인 모듈이 직접 다른 하위 모듈을 참조하지 않고 중간 매개체를 통해모듈 간 간접적인 의존성을 주입하는 방식이다.  이미지 출처 https://velog.io/@tiger/CS-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85 의존성 주입 전 이미지의 경우 메인 모듈이 하위 모듈을 직접 참조하고 있으며의존성 주입 후 이미지의 경우 메인 모듈이 모든 하위 모듈을 직접 참조하지 않고 중간 주입자를 통해상호작용을 진행하는 구조이다. 의존한다 의 의미A 가 B 에 의존한다 => B 가 변하면 A 에 영향을 끼친다public class A{ private B _b; pu..

CS 2024.12.11