2024.01.29 TIL

Oneik·2024년 1월 29일
0

구조체

여러개의 다른 타입의 연관된 데이터를 묶어서 하나의 새로운 데이터 타입을 정의하는 것

  • 같은 타입의 데이터를 한번에 선언하기 위해서 배열을 사용할 수 있다

구조체 정의

  • struct 키워드 : 구조체라는 데이터 타입을 의미한다
  • student : 내가 만든 타입(구조체)의 이름
  • name, age, height : 구조체 멤버들
struct student
{
	char name[10];
	int age;
	int heigth;
}

구조체 접근 방법

  • 구조체변수명.구조체 멤버
  • ex) st1.name, st1.age, st1.height
  • 멤버에 접근 시 .(점)을 사용(직접 접근)

예시

#include <stdio.h>
#include <string.h>

struct student {
    char name[10];
    int age;
    int height;
}st1;

int main()
{
    strcpy(st1.name, "신원익"); // st1.name 변수에 문자열 카피
    st1.age = 20;
    st1.height = 170;
    
    printf("이름 : %s, 나이 : %d, 키 : %d \n", st1.name, st1.age, st1.height);
    return 0;
}

구조체 사용하는 이유

  • 연관된 데이터를 묶어서 관리함으로써 데이터 관리에 유용하다

예를들어, 학생 정보 관리 시스템이 존재한다고 가정해보자
학생 이름, 나이, 성별 등의 정보들은 모두 변수로 선언되어 값이 저장되는데, 각각의 변수를 별도로 관리한다면 연관성을 알 수 없다

즉, 학생 한 명을 그룹으로 지정하여 이름, 나이, 성별 등의 정보들을 그룹으로 묶기 위해 구조체를 사용한다

공용체란?

연관된 다른 타입의 데이터를 묶어 사용자 정의 데이터 타입을 만드는 것

  • 구조체와 거의 동일하나, 구조체와의 차이점은 메모리 공간을 공유한다

공용체 정의

union unTemp
{
	char a;
	int b;
	double c;
}

enum이란?

데이터를 열거한 집합

  • 연속된 데이터들이며, 열거형 멤버들은 정수형 상수로 취급한다
  • 첫번째 멤버를 1로 설정하면, 다음 멤버는 1씩 증가한다

예시

enum Week {
    sun = 1,
    mon,
    tue,
    wed,
    thu,
    fri,
    sat,
};

int main()
{
    int day;
    printf("요일을 선택하세요 :");
    scanf("%d", &day);
    
    switch(day) {
        case sun :
            printf("일요일\n");
            break;
        case mon :
            printf("월요일\n");
            break;
        case tue :
            printf("화요일\n");
            break;
        case wed :
            printf("수요일\n");
            break;
        case thu :
            printf("목요일\n");
            break;
        case fri :
            printf("금요일\n");
            break;
        case sat :
            printf("토요일\n");
            break;
        default :
            printf("잘못 입력하셨습니다.\n");
            break;
    }
    
    return 0;
}

// 5(입력)
// 목요일(출력)

동적 메모리 할당

메모리 영역

코드 영역

  • 실행할 명령어들이 순서대로 쌓이고, CPU가 하나씩 가져다 처리한다

스택 영역

  • 삽입과 삭제가 한쪽 방향으로만 이루어진다
  • 먼저 들어간 것이 나중에 나오는 구조이다(FILO)
  • 지역 변수 및 매개 변수 등은 모두 스택 메모리를 사용한다

힙 영역

  • 라고도 하며, 런타임 시 메모리 할당이 이루어진다
  • 동적 메모리 할당을 위해 사용한다

데이터 영역

  • 전역 변수와 스태틱(static) 변수를 저장한다
  • 프로그램 종료 시 소멸한다

동적 메모리 할당하는 이유

  • 예를 들어, 학교의 학생 수가 정적 메모리 할당이라면, 변경될 때마다 컴파일이 변경되어 재배포 해줘야한다
  • 유동적인 값은 컴파일 시 보다는 런타임 시 결정하는 것이 좋다

동적 메모리 할당 방법

  • 전달인자 size : 바이트 단위로 입력
  • 메모리 할당 : 메모리의 주소값 반환
  • 메모리 부족 : NULL 포인터 반환
  • void*의 의미 : 타입이 지정되지 않은 포인터
    먼저 원하는 메모리 크기만큼 할당해준 후, 형태를 정한다
void* malloc(size_t size);

예시

#include <stdio.h>

int main()
{
    int num;
    int *student;
    
    printf("학생수를 입력하세요 : ");
    scanf("%d", &num);
    
    student = (int*)malloc(sizeof(int) * num); // 포인터 student의 주소값
    if(student == NULL) {
        printf("메모리가 할당되지 않았습니다.\n");
        return 0;
    }
    
    printf("할당된 메모리 크기는 %d입니다.\n", sizeof(int) * num);
    
    free(student);  // 할당한 것 내가 해제해줘야함  
    
    return 0;
}

동적 메모리 할당의 구조

  • 동적 메모리는 힙 메모리에 생성된다
  • 스택 메모리의 student에 주소값은 힙 메모리의 첫번째 주소값을 가리킨다
  • C언어는 가비지 컬렉터가 존재하지 않는다
  • 그래서 free를 사용하여 힙 메모리를 해제해줘야한다
  • 해제하지 않았을 때, 스택 메모리의 student는 해제되더라도, 힙 메모리의 데이터는 그대로 남아있는 메모리 누수 현상이 발생한다

객체 지향이란?

사물을 향한다 즉, 이 세상의 모든 사물들을 프로그래밍 하겠다라는 뜻

  • 객체란, 내 주변에 존재하는 눈에 보이는 모든 사물이다
  • 추상적인 개념이다
  • 지향이란, ~를 향한다 라는 뜻이다

구조적 프로그래밍

사퀀스가 한 방향인 프로그래밍 방식

  • 순차적, 하향식, 폭포수 방식이라고도 한다
  • 일방적인 형식이며 위에서 아래로 진행되기 때문에, 거슬러 올라갈 수 없다
  • 중간 과정에서 결함이 발생하더라도 수정이 어렵다

객체지향 프로그래밍

객체 단위로 프로그래밍하는 방식

  • 기능 단위가 객체이기 때문에, 유연하다
  • 결함이 발생하더라도 수정할 수 있고, 고객의 요구사항을 언제든 반영할 수 있다

객체지향 철학의 이해

객체 지향 철학에는 추상화, 캡슐화, 상속성, 다형성이 존재한다

추상화란?

사물의 공통점을 묶어 본질을 파악하는 행위

  • 예를 들어, 진돗개, 삽살개, 그리고 치와와(구체화된 객체)가 있다면, 추상화는 위 객체들의 공통적인 속성(다리 4개, 입, 코)과 행위(짖기, 뛰기, 먹기)를 가진 개(추상화된 객체)라고 할 수 있다
  • 즉, 구체화된 객체들의 공통적인 특성을 파악하고 이를 기반으로 일반화된 클래스를 생성하는 것이다

캡슐화란?

은닉된 데이터와 데이터에 접근할 수 있도록 해주는 메소드(인터페이스)로 구성된 클래스를 캡슐화하는 것

  • 위의 알약의 캡슐 안에는 어떤 약이 존재하는지 알 수 없다
  • 즉, 아무나 외부에서 접근할 수 없도록 데이터를 캡슐로 감싸서 보호하는 것이다
  • 그러나, 캡슐 안의 약 성분을 누구도 사용할 수 없다면, 무용지물일 것이다
  • 외부에서도 데이터를 사용할 수 있도록 조작할 수 있는 인터페이스가 필요하다
profile
초보 개발자의 블로그입니다

0개의 댓글

관련 채용 정보