/date 24.10.26.
📌 함수 포인터
- 함수를 포인터처럼 사용할 수 있는 방법이다. 함수명 앞에 *을 붙여주는 방식으로 함수 포인터를 선언한다. 형식이 함수와 같을 뿐, 함수의 주소값을 저장하는 변수이다.
- 함수 포인터를 사용하는 이유메
- 메모리의 크기 및 위치가 결정되는 시점은 컴파일 타임 또는 런타임 시점
- 컴파일 타임 시점에 결정은 정적 바인딩, 런타임 시점의 결정은 동적 바인딩(실행 중에 메모리 결정)
- VScode에서 사용하는 확장 프로그램들은 플러그인 방식으로 동장 → 새로운 기능을 추가할 때 매번 컴파일하지 않아도 된다. 즉, 함수 포인터의 사용은 프로그램의 유연한 확장성을 제공한다!
📌 구조체
- 다량의 데이터를 한 번에 선언하기 위해 배열을 사용했다. 다만 서로 다른 종류의 변수를 하나로 묶어서 데이터 타입을 정의해야 할 때가 있는데, 이때 사용할 수 있는 것이 구조체이다.
- 구조체의 본질은 데이터타입이다. 클래스의 원조가 구조체이므로, 클래스도 마찬가지로 본질은 데이터타입이다.
- 구조체를 왜 사용하는가?
- 연관된 변수들을 하나로 묶어서 관리함으로써 데이터 관리에 유용하다
- 데이터 양(변수의 개수)이 많아지면 구조체가 유리하다
- 구조체 정의하기
struct student
{
char name[10[;
int age;
int height;
};
여기서 구조체 student는 사용자인 내가 정의한 새로운 데이터 타입이라고 볼 수 있다.
- 구조체 멤버에 접근하기
- 구조체 변수를 통해 구조체 멤버의 값을 참조해야 한다.
- st1.name / st1.age / st1.height 와 같이 점을 통해서 접근하는 것을 직접 접근이라고 한다.
#include <stdio.h>
#include <string.h>
struct student {
char name[10];
int age;
int height;
}st1;
int main(void)
{
strcpy(st1.name, "이창현");
st1.age = 25;
st1.height = 178;
printf("이름 = %s, 나이 = %d, 키 = %d₩n", st1.name, st1.age, st1.height);
return 0;
}
📌 공용체, enum
- 공용체도 사용자 정의 자료형이다. 구조체와의 차이점은 메모리 공간을 공유한다는 점에 있다. 큰 메모리를 기준으로 메모리 공간을 공유한다.
- 열거형(enumeration -> enum): 데이터를 열거한 집합이다. 컴파일러는 열거형 멤버들을 정수형 상수로 취급한다.
enum Week
{
sun = 0,
mon,
tue,
wed,
thu,
fri,
sat
};
//0을 기준으로 자동적으로 1씩 증가
📌 동적 메모리 할당
- 메모리 영역
- 코드 영역: 실행할 명령어들이 순서대로 쌓인다. CPU가 이 영역에서 명령어들을 하나씩 가져다 처리한다.
- 스택 영역: 삽입, 삭제를 한 쪽 방향에서만 수행하도록 하는 선형 자료구조
- 우리가 지금까지 사용한 지역변수 및 매개변수 등은 모두 스택 메모리를 사용한다.
- 힙 영역: 큐. 컴퓨터 메모리의 일부가 할당되었다가 회수되는 일들이 반복된다. 컴파일 시가 아닌 실행 시 사용자로부터 할당 메모리를 입력받는다.
- 데이터 영역: 전역변수와 static 변수가 저장되는 메모리 영역이다. 이 메모리는 프로그램 종료 시 소멸된다.
- 동적으로 메모리를 할당하는 이유
- 일반 변수 선언: 메모리 할당은 컴파일 타임에 이루어진다
- 넣어야 하는 메모리의 양은 유동적이므로 실행 시 메모리를 결정하는 것이 효율적이다. 동적 메모리 할당 기법을 통해 문제 해결이 가능하다.
- 동적 메모리 할당: void* malloc(size_t size)
📌 객체 지향 프로그래밍 방식
- 왜 객체지향 철학을 이해해야 하는가?
자바스크립트는 객체를 사용하는 객체 기반 언어이다. 객체를 생성하는 원리를 이해하면 객체를 더욱 잘 사용할 수 있다.
- 객체 지향이란
객체: 사물을 나타내는 추상적인 개념
지향: 어딘가를 향한다는 의미
- 구조적 프로그래밍과 객체 지향 프로그래밍
- 구조적 프로그래밍은 순차적, 하향식, 폭포수 방식이라고 한다. 기능적인 기본 단위는 함수이다. 때문에 중간 과정에서 문제가 발생한다고 하더라도 다시 돌아가기 힘들다. 설계 단계가 굉장히 철저하고 꼼꼼해야 한다.
- 객체 지향 프로그래밍에서의 기능 단위는 객체이며, 굉장히 유연하다. 결합과 분리가 쉬워서 요구사항이나 결함이 발생하더라도 수정이 어렵지 않다. 대표적인 예가 이벤트 기반의 모든 윈도우 프로그램이다.
📌 추상화
- 추상은 대상에서 특징만을 뽑아낸 것. 우리 일상의 사물들은 관념적이고 추상적인 것들이 많다.
📌 캡슐화
- 은닉하다, 숨긴다는 의미: 외부에서 그 내부를 볼 수 없게 한다는 의미라고 볼 수 있다.
- 즉, 캡슐로 싸서 데이터를 보호한다는 것이 객체지향 프로그래밍에서의 캡슐화
- 하지만 마냥 숨기기만 한다면 데이터는 무용지물이다. 외부로부터 데이터를 조작할 인터페이스가 필요하다.
- 인증된 사용자만 들어갈 수 있도록 통로를 만들어 두는 것과 같다. (ex. 마이페이지)
📌 클래스의 기본
- 클래스란
- 사전적으로는 학급. 코딩에서는 사용자 정의 데이터 타입.
- 메소드와 데이터를 사용자인 내가 새로 정의한 데이터 타입.
- 구조체와 유사하고, 멤버 변수와 멤버 함수로 구성된다.
- 클래스의 구성
- 사물의 특성을 정리하여 필드와 메소드로 표현하는 과정이 추상화
- 추상화된 결과를 하나의 클래스에 포함시키고 스스로 보호하는 것을 캡슐화라고 한다
- 클래스 선언 형식
- class 키워드를 쓰고, 그 뒤에 클래스 이름을 붙인다.
- 생성자, 멤버 변수, 메소드 등으로 구성된다.
class 클래스 이름
{
접근 지정자 클래스 이름() {...} //생성자
접근 지정자 ~클래스 이름() {...} //소멸자
접근 지정자 데이터형 멤버 변수(필드); //변수 선언
접근 지정자 데이터형 메소드() {...}; //메소드 선언
}
- 접근 지정자
- public: 누구나 접근 가능함
- private: 내 클래스 내부에서만 접근 가능하고, 외부에서는 절대 접근할 수 없다
- 객체의 선언
- 클래스의 본질은 데이터타입이다. 데이터타입을 통해 변수를 선언할 수 있다.
- 클래스를 통해 선언한 변수 = 객체이고, new 연산자를 사용하여 객체를 생성한다.
📌 생성자
- 모든 변수는 선언이 되면 값을 초기화해야 한다.
- 객체도 본질적으로 변수이므로 선언되면 초기화해야 한다.
- 객체 생성 시 초기화 전용 메소드를 제공하는데 바로 생성자(constructor)이다.
📌 상속성
- 이미 완성된 클래스를 다른 클래스에 상속할 수 있다.
- 부모 클래스로부터 상속을 받을 때 클래스 이름 끝에 콜론(:), 자바의 경우 extends를 붙인 후 부모클래스의 이름을 붙인다.
- 프로젝트 관점에서의 상속 개념:
A 프로젝트 (종료됨) / B 프로젝트 (신규 과제) → A 프로젝트 기능이 B 프로젝트의 기능과 유사함 ⇒ B 프로젝트는 A 프로젝트를 상속받고, 추가 기능만 구현하면 됨
📌 오버로딩
- 다형성
- 함수의 이름이 같더라도 전달인자의 타입이나 개수에 따라 구분된다.
- 객체지향에서는 대표적으로 오버로딩과 오버라이딩 기법이 있다.
- 오버로딩(overloading): 이름이 같은 함수일지라도 전달인자 타입이나 개수가 다른 경우
int Plus(int a, int b)
{
return a + b;
}
char Plus(char a, char b)
{
return a + b;
}
📌 오버라이딩
- 상속 개념을 기반으로, 기존의 것을 올라타 덮어 버린다는 개념
📌 인터페이스
- 메소드의 목록만을 갖고 있는 명세(Specification), 사용자 정의 타입이다. 메소드의 목록만 선언하고 구현은 하지 않는다.
- 인터페이스를 사용하는 이유: 본체가 정의되지 않는 추상메소드만을 갖는데, 공동작업 시 표준을 정한느 역할을 한다.
- 메모리 관리: 플랫폼 기반의 객체 지향 언어는 가비지 컬렉터가 메모리를 자동 관리한다. 백그라운드에서 더 이상 사용되지 않는 메모리를 찾아 회수한다.
📌 람다
- 익명 메소드: 메소드를 미리 정의하지 않고 사용할 때 정의한다. 코드가 간결해지고, 코딩 오버헤드를 줄일 수 있다.
- 람다식은 기존의 익명 메소드를 더욱 간결하게 만든다.
'학습 기록 > 데브코스 웹 풀스택 4기' 카테고리의 다른 글
프론트엔드 기초: 타입스크립트 입문하기 (0) | 2024.10.28 |
---|---|
프론트엔드 기초: 연산자, 분기, 반복, 함수 (0) | 2024.10.24 |
프론트엔드 기초: 프로그래밍의 개념, 변수와 상수 (2) | 2024.10.23 |
프론트엔드 기초: JavaScript (1) (0) | 2024.10.21 |
백엔드 프로젝트: API 설계해보기 (0) | 2024.09.30 |