<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>think and scratch</title>
    <link>https://thinkandscratch.tistory.com/</link>
    <description>사람이 여행을 하는 것은 도착하기 위해서가 아니라 여행하기 위해서이다 - 괴테</description>
    <language>ko</language>
    <pubDate>Wed, 27 May 2026 21:48:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>HYndrome</managingEditor>
    <image>
      <title>think and scratch</title>
      <url>https://tistory1.daumcdn.net/tistory/6508418/attach/f659ac377cd34a04b23e604c2c536095</url>
      <link>https://thinkandscratch.tistory.com</link>
    </image>
    <item>
      <title>객체 지향 프로그래밍 (Object-Oriented Promgramming) 4가지 특징</title>
      <link>https://thinkandscratch.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;면접에서 제대로 답변 못한 김에 정리하는 객체 지향 프로그래밍 4가지 특징!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체 지향 프로그래밍 (OOP) 란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object-Oriented Promgramming의 약자로, 객체 지향 프로그래밍(OOP)은 데이터를 객체라는 단위로 나누고, 객체 간의 상호작용을 통해 프로그램을 설계하는 방식이다.&lt;br /&gt;&lt;b&gt;캡슐화, 상속, 다형성, 추상화&lt;/b&gt; 같은 개념을 활용하여 코드의 재사용성, 유지보수성, 확장성을 높인다.&lt;br /&gt;즉, 현실 세계를 모델링하여 프로그래밍에 적용하는 방법론이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++ 예제 코드로 각각의 특징에 대해서 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;캡슐화 (Encapsulation)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡슐화는 데이터와 메서드를 하나의 객체로 묶고 데이터 접근을 제어한다. 이를 통해 외부에서 직접 접근하지 못하게 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;brand 와 speed는 private로 선언되어 외부에서 직접 접근할 수 없음&lt;/li&gt;
&lt;li&gt;getBrand와 SetSpeed() 같은 메서드를 통해 데이터를 간접적으로 조작&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734354196727&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;

class Car 
{
private: // 외부에서 직접 접근 불가
	std::string brand;
	int speed;

public:
	// 생성자
	Car(std::string b, int s) : brand(b), speed(s) {}

	// getter와 setter로 데이터 접근 제어
	std::string getBrand()
	{
		return brand;
	}

	void setBrand(std::string b)
	{
		brand = b;
	}

	int getSpeed()
	{
		return speed;
	}

	void setSpeed(int s)
	{
		if (s &amp;gt;= 0) // 유효성 검사
		{
			speed = s;
		}
	}

	void display()
	{
		std::cout &amp;lt;&amp;lt; &quot;Brand: &quot; &amp;lt;&amp;lt; brand &amp;lt;&amp;lt; &quot;\n&quot;;
		std::cout &amp;lt;&amp;lt; &quot;Speed: &quot; &amp;lt;&amp;lt; speed &amp;lt;&amp;lt; &quot;km/h\n&quot;;
	}
};

int main()
{
	Car myCar(&quot;Tesla&quot;, 120);
	myCar.display();

	myCar.setSpeed(150);
	std::cout &amp;lt;&amp;lt; &quot;Updated speed: &quot; &amp;lt;&amp;lt; myCar.getSpeed() &amp;lt;&amp;lt; &quot;km/h\n&quot;;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상속(Inheritance)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속은 기존의 클래스의 속성과 동작을 새로운 클래스가 물려받는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Dog 클래스는 Animal 클래스를 상속받아 eat() 메서드를 사용할 수 있음&lt;/li&gt;
&lt;li&gt;상속을 통하여 코드 재사용성을 높일 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734354761731&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class Animal
{
public:
	void eat()
	{
		std::cout &amp;lt;&amp;lt; &quot;This animal eats food.\n&quot;;
	}
};

class Dog : public Animal // Animal class를 public 상속
{
public:
	void bark()
	{
		std::cout &amp;lt;&amp;lt; &quot;This dog barks\n&quot;;
	}
};

int main()
{
	Dog myDog;
	myDog.eat(); // 상속 받은 메서드
	myDog.bark(); // Dog 클래스 고유의 메서드

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;: public&quot; 은 public 상속으로&amp;nbsp; 아래와 같이 상속된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상위 클래스의 public 멤버는 하위 클래스에서 public으로 상속&lt;/li&gt;
&lt;li&gt;상위 클래스의 protected 멤버는 하위 클래스에서 protected로 상속&lt;/li&gt;
&lt;li&gt;상위 클래스의 private 멤버는 하위 클래스에서 접근 불가능하지만, 상위 클래스의 메서드를 통해 간접적으로 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다형성 (Polymorphism)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다형성은 같은 인터페이스로 다양한 동작을 구현하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 가상 함수와 오버라이딩을 통하여 구현된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;draw() 메서드는 Shape 클래스의 포인터를 통해 호출되지만 실체 객체 타입 (Circle 또는 Rectangle)에 따라 동작이 달라짐&lt;/li&gt;
&lt;li&gt;코드의 유연성과 확장성을 높일 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734355728066&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class Shape
{
public:
	virtual void draw() // 가상함수
	{
		std::cout &amp;lt;&amp;lt; &quot;Drawing a shape.\n&quot;;
	}
};

class Circle : public Shape
{
public:
	void draw() override // 오버라이딩
	{
		std::cout &amp;lt;&amp;lt; &quot;Drawing a circle.\n&quot;;
	}
};

class Rectangle : public Shape
{
public:
	void draw() override // 오버라이딩
	{
		std::cout &amp;lt;&amp;lt; &quot;Drawing a rectangle.\n&quot;;
	}
};

int main()
{
	Shape* myShape; // 기본 클래스 포인터
	Circle myCircle;
	Rectangle myRectangle;

	myCircle.draw();
	myRectangle.draw();

	myShape = &amp;amp;myCircle;
	myShape-&amp;gt;draw(); // Circle의 draw() 호출

	myShape = &amp;amp;myRectangle;
	myShape-&amp;gt;draw(); // Rectangle의 draw() 호출

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가상 함수 (Virtual Fucntion)&lt;/b&gt;는 기본 클래스(Base Class)에서 선언되며, 하위 클래스(Derived Class)에서 재정의(Override)될 수 있는 함수이다. 재정의하지 않아도 기본 클래스의 구현을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;virtual&lt;/b&gt; 키워드를 사용해 선언한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추상화 (Abstraction)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상화는 객체의 복잡성을 숨기고 꼭 필요한 부분만 노출하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++에는 추상클래스와 순수 가상 함수로 구현할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Animal 클래스는 추상 클래스이며, sound()는 순수 가상 함수&lt;/li&gt;
&lt;li&gt;Dog와 Cat 클래스는 이를 구현하여 자신만의 동작을 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734356390182&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

// 추상 클래스 (순수가상함수 사용)
class Animal
{
public:
	virtual void sound() = 0; // 순수 가상 함수
};

class Dog : public Animal
{
public:
	void sound() override
	{
		std::cout &amp;lt;&amp;lt; &quot;Woof! Woof!\n&quot;;
	}
};

class Cat : public Animal
{
public:
	void sound() override
	{
		std::cout &amp;lt;&amp;lt; &quot;Meow?\n&quot;;
	}
}; 

int main()
{
	Animal* myAnimal; // 추상 클래스 포인터
	Dog myDog;
	Cat myCat;

	myAnimal = &amp;amp;myDog;
	myAnimal-&amp;gt;sound(); // Dog의 sound() 호출

	myAnimal = &amp;amp;myCat;
	myAnimal-&amp;gt;sound(); // Cat의 sound() 호출

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;순수 가상 함수 (Pure Virtual Function)&lt;/b&gt;는 C++의 추상 클래스(Abstract Class)에서 사용되는 함수로, 해&lt;b&gt;당 클래스에서 반드시 하위 클래스에서 재정의해야 하는 메서드를 정의&lt;/b&gt;할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 가상 함수는 아래와 같은 형태로 선언된다.&lt;/p&gt;
&lt;pre id=&quot;code_1734356507618&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;virtual void functionName() = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순수 가상 함수가 포함된 클래스는 &lt;b&gt;추상 클래스&lt;/b&gt;가 됨&lt;/li&gt;
&lt;li&gt;추상 클래스는 인스턴스화할 수 없음. 즉, 직접 객체를 생성할 수 없음&lt;/li&gt;
&lt;li&gt;순수 가상 함수를 정의함으로써, 공통 인터페이스를 제공하고, 해당 인터페이스에서 반드시 구현하도록 강제할 수 있음&lt;/li&gt;
&lt;li&gt;순수 가상 함수는 &lt;b&gt;= 0&lt;/b&gt;을 사용하여 선언되며, 하위 클래스에서 반드시 재정의해야 함&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Science</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/91</guid>
      <comments>https://thinkandscratch.tistory.com/91#entry91comment</comments>
      <pubDate>Mon, 16 Dec 2024 22:44:26 +0900</pubDate>
    </item>
    <item>
      <title>main argument</title>
      <link>https://thinkandscratch.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;c언어의 main()은 실행 파일 옵션을 매개 변수로 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예제를 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1734183197162&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(int argc, char* argv[] )
{
	printf(&quot;argument count: %d\n&quot;, argc);
	int i = 0;
	while (i &amp;lt; argc)
	{
		printf(&quot;argument value[%d]: %s\n&quot;, i, argv[i]);
		i++;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파일의 경로로 가서 파일을 실행시킴과 동시에 옵션을 전달해줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;window에서 실행파일이 있는 경로로 가서 주소창에 cmd를 입력하면 커맨드창을 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vt2JB/btsLkcNqSl7/q6iKllq9lKtGwvv2h5sZT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vt2JB/btsLkcNqSl7/q6iKllq9lKtGwvv2h5sZT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vt2JB/btsLkcNqSl7/q6iKllq9lKtGwvv2h5sZT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVt2JB%2FbtsLkcNqSl7%2Fq6iKllq9lKtGwvv2h5sZT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;125&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;argv의 0 번째에는 파일이름 나머지에는 전달한 옵션이 저장되어 있는 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>C language</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/90</guid>
      <comments>https://thinkandscratch.tistory.com/90#entry90comment</comments>
      <pubDate>Sat, 14 Dec 2024 22:39:40 +0900</pubDate>
    </item>
    <item>
      <title>함수포인터</title>
      <link>https://thinkandscratch.tistory.com/89</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;함수 포인터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 이름도 주소이다.&lt;/p&gt;
&lt;pre id=&quot;code_1734181868093&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

void Func1(int a) {
	printf(&quot;Func1 %d\n&quot;, a);
}
int Func2() {
	printf(&quot;Func2\n&quot;);
	return 10;
}
int main() {

	void (*p)(int);
	p = Func1;
	(*p)(10);

	int (*q)();
	q = Func2;

	printf(&quot;%d&quot;, (*q)() + 100);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;104&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IDcSI/btsLkizZDgY/BscM4hcQQzCuQvhVCS0FF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IDcSI/btsLkizZDgY/BscM4hcQQzCuQvhVCS0FF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IDcSI/btsLkizZDgY/BscM4hcQQzCuQvhVCS0FF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIDcSI%2FbtsLkizZDgY%2FBscM4hcQQzCuQvhVCS0FF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;104&quot; height=&quot;56&quot; data-origin-width=&quot;104&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 내에서 함수 포인터를 사용하여 아래와 같이 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1734181971318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct file_operations {
	struct module *owner;
	loff_t (*llseek) (struct file *, loff_t, int);
	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
	ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
	ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
	int (*iopoll)(struct kiocb *kiocb, struct io_comp_batch *,
			unsigned int flags);
	int (*iterate) (struct file *, struct dir_context *);
	int (*iterate_shared) (struct file *, struct dir_context *);
	__poll_t (*poll) (struct file *, struct poll_table_struct *);
	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
	long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
	int (*mmap) (struct file *, struct vm_area_struct *);
	unsigned long mmap_supported_flags;
	int (*open) (struct inode *, struct file *);
	int (*flush) (struct file *, fl_owner_t id);
	int (*release) (struct inode *, struct file *);
	int (*fsync) (struct file *, loff_t, loff_t, int datasync);
	int (*fasync) (int, struct file *, int);
	int (*lock) (struct file *, int, struct file_lock *);
	ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
	int (*check_flags)(int);
	int (*flock) (struct file *, int, struct file_lock *);
	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
	ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
	void (*splice_eof)(struct file *file);
	int (*setlease)(struct file *, long, struct file_lock **, void **);
	long (*fallocate)(struct file *file, int mode, loff_t offset,
			  loff_t len);
	void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMU
	unsigned (*mmap_capabilities)(struct file *);
#endif
	ssize_t (*copy_file_range)(struct file *, loff_t, struct file *,
			loff_t, size_t, unsigned int);
	loff_t (*remap_file_range)(struct file *file_in, loff_t pos_in,
				   struct file *file_out, loff_t pos_out,
				   loff_t len, unsigned int remap_flags);
	int (*fadvise)(struct file *, loff_t, loff_t, int);
	int (*uring_cmd)(struct io_uring_cmd *ioucmd, unsigned int issue_flags);
	int (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *,
				unsigned int poll_flags);
} __randomize_layout;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 예제로 작성해보자&lt;/p&gt;
&lt;pre id=&quot;code_1734182428222&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

// 구조체 정의: 함수 포인터를 멤버로 가지는 구조체
struct Hyndrome_operation {
    void (*act1)(int); // 함수 포인터 멤버
    void (*act2)(int); // 함수 포인터 멤버
};

// 함수 선언
void Func1(int x) {
    printf(&quot;Func1 : % d\n&quot;, x);
}

void Func2(int x) {
    printf(&quot;Func2 : %d\n&quot;, x);
}

int main() {
    // 구조체 변수 선언 및 선택적 초기화
    struct Hyndrome_operation hyops = {
        .act1 = Func1,
        .act2 = Func2,
    };

    // 함수 포인터를 멤버로 갖는 구조체의 함수 호출
    hyops.act1(10); // Func1 호출
    hyops.act2(20); // Func2 호출

    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>C language</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/89</guid>
      <comments>https://thinkandscratch.tistory.com/89#entry89comment</comments>
      <pubDate>Sat, 14 Dec 2024 22:22:31 +0900</pubDate>
    </item>
    <item>
      <title>변수 키워드 const, volatile</title>
      <link>https://thinkandscratch.tistory.com/88</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;const&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변수에 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const는 영어로 constant 상수를 뜻한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수에 해당 키워드가 붙으면 값의 변경이 불가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1734168688430&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main()
{
	const int var1 = 1;
	var1 = 2; // 불가능: const가 붙으면 값의 변경이 불가능하다
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;포인터에 적용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터에 사용되면 위치에 따라 의미가 달라짐&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;포인터가 가리키는 값이 변경 불가능한 경우&lt;/h4&gt;
&lt;pre id=&quot;code_1734169678004&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const int *ptr = &amp;amp;x;  // ptr은 x를 가리킬 수 있지만, 값을 변경할 수 없음
*ptr = 20;            // 오류! 가리키는 값 변경 불가
ptr = &amp;amp;y;             // OK! ptr이 다른 변수를 가리키는 것은 가능&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;포인터 자체가 변경 불가능한 경우&lt;/h4&gt;
&lt;pre id=&quot;code_1734169697057&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int *const ptr = &amp;amp;x;  // ptr은 x를 가리키며, 포인터의 주소를 변경할 수 없음
*ptr = 20;            // OK! 가리키는 값 변경 가능
ptr = &amp;amp;y;             // 오류! ptr의 주소 변경 불가&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;포인터와 가리키는 값 모두 변경 불가능한 경우&lt;/h4&gt;
&lt;pre id=&quot;code_1734169704630&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const int *const ptr = &amp;amp;x;  // ptr이 가리키는 값과 주소 모두 변경 불가
*ptr = 20;                  // 오류! 값 변경 불가
ptr = &amp;amp;y;                   // 오류! 주소 변경 불가&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;volatile&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적화를 방해하는 키워드이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러는 사용하지 않는 쓸모 없는 코드들을 정리한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;volatile 용도&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 주소를 가진 IO 레지스터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;H/W가 연결된 메모리 주소값은 사용자가 값을 수정하지 않아도 H/W에 의해 변경될 수 있는데, 컴파일러가 최적화 한다고 주소값을 없애버릴 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터럽트 핸들러가 값을 변경하는 전역 변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터럽트 핸들러가 값을 변경할 수 있다는 것을 컴파일러가 인지 못할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최적화에 의해 오류가 발생할 가능성이 있는 변수&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>C language</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/88</guid>
      <comments>https://thinkandscratch.tistory.com/88#entry88comment</comments>
      <pubDate>Sat, 14 Dec 2024 18:58:08 +0900</pubDate>
    </item>
    <item>
      <title>변수 키워드 static과 extern</title>
      <link>https://thinkandscratch.tistory.com/87</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 소스파일이 같은 프로젝트에 있어서 컴파일할 때 링킹이 되는 경우 함수는&amp;nbsp; 별다른 추가 코드 작성 없이 공유된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 예시로 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.c&lt;/p&gt;
&lt;pre id=&quot;code_1734161596572&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main()
{
	Hyndrome();
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hyndrome.c&lt;/p&gt;
&lt;pre id=&quot;code_1734162036261&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

void Hyndrome()
{
	printf(&quot;I am HYndrome\n&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 변수는 공유되지 않는다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;extern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;extern&lt;/b&gt; 키워드를 사용하면 변수도 공유할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래 예시를 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;main.c&lt;/p&gt;
&lt;pre id=&quot;code_1734162058148&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

extern int a = 1;

int main() {
	printf(&quot;main1 %d\n&quot;, a);
	Hyndrome();
	printf(&quot;main2 %d\n&quot;, a);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hyndrome.c&lt;/p&gt;
&lt;pre id=&quot;code_1734162075425&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int a;
void Hyndrome() {
	//main.c 에서 extern 된 a 값 출력
	printf(&quot;Hyndrome1 %d\n&quot;, a);
	a = 2;
	printf(&quot;Hyndrome2 %d\n&quot;, a);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;활용&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;header에 extern 변수를 사용하는 경우&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#include만 하면, 누구나 쓸 수 있는 전역 변수가 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;common.h&lt;/p&gt;
&lt;pre id=&quot;code_1734162326000&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ifndef COMMON_H
#define COMMON_H

extern int globalVariable;

#endif&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;소스 파일에 extern 변수를 사용하는 경우&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로 전역 변수를 사용할 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1734162401518&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;common.h&quot;

void function1()
{
	extern int globalVariable;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Static&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static은 다양한 곳에 쓰인다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 내 지역 변수 앞 : 전역 변수화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 종료될 때까지 변수의 값이 유지되지만 해당 함수 내부에서만 접근이 가능함&lt;/p&gt;
&lt;pre id=&quot;code_1734168422638&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

void function1()
{
	static int var1 = 0;
	for (int i = 0; i &amp;lt; 5; i++)
	{
		printf(&quot;function1: %d\n&quot;, var1++);
	}
}

int main()
{
	function1();
	function1();
	// printf(&quot;result : %d\n&quot;, var1); 불가능: var는 function1 내부에서만 접근 가능

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;162&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qieRG/btsLh2zi5kY/ULetoA8QQlwbINZay7R1P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qieRG/btsLh2zi5kY/ULetoA8QQlwbINZay7R1P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qieRG/btsLh2zi5kY/ULetoA8QQlwbINZay7R1P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqieRG%2FbtsLh2zi5kY%2FULetoA8QQlwbINZay7R1P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;162&quot; height=&quot;196&quot; data-origin-width=&quot;162&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전역 변수 앞 : 다른 소스 파일에서 공유 불가 ( static &amp;gt; extern)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 내부에서만 접근할 수 있는 파일 범위(File scope)를 가지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 파일에서 전역 변수 이름이 충돌하지 않도록 보호한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static은 extern 보다 우선 순위를 가진다.&lt;/p&gt;</description>
      <category>C language</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/87</guid>
      <comments>https://thinkandscratch.tistory.com/87#entry87comment</comments>
      <pubDate>Sat, 14 Dec 2024 18:29:04 +0900</pubDate>
    </item>
    <item>
      <title>전처리지시문, Header Guard</title>
      <link>https://thinkandscratch.tistory.com/86</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;전처리 지시문&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MS learn challenge 전처리 지시문&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734139598272&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;전처리기 지시문&quot; data-og-description=&quot;자세한 정보: 전처리기 지시문&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c0JjlS/hyXKt4OXcN/9mDaNCcE7JDtKT83Vi6I40/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c0JjlS/hyXKt4OXcN/9mDaNCcE7JDtKT83Vi6I40/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;전처리기 지시문&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자세한 정보: 전처리기 지시문&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXSxUF/btsLiHOGGnN/A9XD3zHUOvcaVJiIXkgDrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXSxUF/btsLiHOGGnN/A9XD3zHUOvcaVJiIXkgDrk/img.png&quot; data-alt=&quot;https://learn.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXSxUF/btsLiHOGGnN/A9XD3zHUOvcaVJiIXkgDrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXSxUF%2FbtsLiHOGGnN%2FA9XD3zHUOvcaVJiIXkgDrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;819&quot; height=&quot;168&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://learn.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#define&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매크로 함수라 한다. 단순 치환이 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점: 함수 호출이 아니므로 실행속도가 빠름&lt;/li&gt;
&lt;li&gt;단점: 실제 코드로 변경되므로 코드 사이즈가 늘어남&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734139775318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define SUM(a,b) a+b

int main()
{
	int result = SUM(3, 5);
	
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;#undef&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정의된 매크로를 해제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정의되지 않은 매크로에 해제에 대한 에러가 발생하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다수의 소스파일에서 정의된 매크로를 재정의할 때 사용한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;#ifdef ~ #endif , #ifndef&amp;nbsp; ~ #endf&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 매크로 확인에 적합하다. 간결하고 읽기 쉽다.&lt;/p&gt;
&lt;pre id=&quot;code_1734140257447&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

#define RELEASE
// #define DEBUG

#ifdef DEBUG
int main()
{
	printf(&quot;debug mode\n&quot;);
	return 0;
}
#endif

#ifdef RELEASE
int main()
{
	printf(&quot;release version\n&quot;);
	return 0;
}
#endif&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;#if ~ #elif ~ #else ~ #endif&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;amp;&amp;amp;, ||, ==, !=, &amp;gt;, &amp;lt; 등 연산 기호를 사용할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;#if defined&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#ifdef와 동일하게 사용 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;amp;&amp;amp;, ||, ==, !=, &amp;gt;, &amp;lt; 등 연산 기호를 사용할 수 있어서 다중 조건에 사용 가능하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;#error&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;error 메세지를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 장치를 장착할 지 알수 없는 초기 개발 단계에서 초기화 코드를 작성할 때 쓰인다고 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1734140965037&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt; 

#define DEV1
#define MODE 3

#if defined DEV1 &amp;amp;&amp;amp; MODE == 3
int main()
{
	printf(&quot;success!\n&quot;);
}
#elif !defined(DEV1)
#error no device
#else
#error incorrect mode
#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Header Guard&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더 파일에서 중복으로 포함되는 것을 방지하기 위한 기법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건부 컴파일 전처리기 지시자로 헤더 파일이 중복으로 포함되는 것을 방지할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 1 - #pragma once&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하고 사용하기 쉬운 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 현재 대부분의 컴파일러가 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 방법 2에 비해서 잘 사용하지 않는다. 그 이유는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;방법 2인 #ifndef가 gcc 표준이다 (gcc ver3.4 이전 버전에서 지원 x)&lt;/li&gt;
&lt;li&gt;같은 파일이 여러 경로에 있을 경우에 컴파일러가 다른 파일로 인식해서 중복 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 ; 를 계속 포함하듯 gcc가 워낙 메이저하다보니 잘 사용이 안되는 것 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1734142525980&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma once
// 헤더 파일 내용
#include &amp;lt;stdio.h&amp;gt;

void func1();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법2 - #ifndef ~ #define ~ #endif&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 이름의 매크로가 없을 경우 해당 이름의 매크로를 정의하고 헤더파일을 작성하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 헤더 파일을 다시 부를 경우 해당 이름의 매크로가 있어서 생략되게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1734142497096&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ifndef HEADER_FILE_H
#define HEADER_FILE_H
// 헤더 파일 내용
#include &amp;lt;stdio.h&amp;gt;

void func1();
#endif // !&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C language</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/86</guid>
      <comments>https://thinkandscratch.tistory.com/86#entry86comment</comments>
      <pubDate>Sat, 14 Dec 2024 11:16:43 +0900</pubDate>
    </item>
    <item>
      <title>c 구조체, 유니온, typedef, 패딩, 비트필드</title>
      <link>https://thinkandscratch.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 신호를 주고 받을 때, 일반적으로 1 byte 단위가 자주 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소는 byte 단위이다. 리틀 엔디안을 잊지 말자!&lt;/p&gt;
&lt;pre id=&quot;code_1734067978487&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

int main()
{
	uint8_t target[5] = { 0xAB, 0x12, 0x34, 0x56, 0xCD };

	union _Data_
	{
		uint8_t receiveData[5];

		struct {
			uint8_t head;
			uint8_t body[3];
			uint8_t tail;
		}msg;
	}data;

	memcpy(&amp;amp;data, target, 5);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;C 구조체&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;struct&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입을 모아 새로운 타입을 만드는 문법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c와 c++에서 차이가 있다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c에서는 만들고 난 뒤, 한꺼번에 초기화 불가능 (선언할 때는 가능)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;c에서는 선언할 때 앞에 struct 붙여줘야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기본 문법&lt;/h4&gt;
&lt;pre id=&quot;code_1734070424005&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct AB
{
	int a;
	int b;
};

int main()
{
	struct AB ab;

	ab.a = 1;
	ab.b = 2;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4zpwk/btsLijmkRXI/tKbvfnZ5hk8dLk7KsINTtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4zpwk/btsLijmkRXI/tKbvfnZ5hk8dLk7KsINTtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4zpwk/btsLijmkRXI/tKbvfnZ5hk8dLk7KsINTtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4zpwk%2FbtsLijmkRXI%2FtKbvfnZ5hk8dLk7KsINTtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;355&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 초기화는 선언할 때만 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzdLgD/btsLikeqrDG/rLPCkZWNsKdH8FUGGZK8EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzdLgD/btsLikeqrDG/rLPCkZWNsKdH8FUGGZK8EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzdLgD/btsLikeqrDG/rLPCkZWNsKdH8FUGGZK8EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzdLgD%2FbtsLikeqrDG%2FrLPCkZWNsKdH8FUGGZK8EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;362&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 특정 멤버를 선언 시, 선택해서 초기화할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gsq3V/btsLii15d2b/giSuxesqJBvkMiUZNAhE40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gsq3V/btsLii15d2b/giSuxesqJBvkMiUZNAhE40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gsq3V/btsLii15d2b/giSuxesqJBvkMiUZNAhE40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGsq3V%2FbtsLii15d2b%2FgiSuxesqJBvkMiUZNAhE40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;247&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체를 만들면서 변수를 만들 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbcOUH/btsLiT1xbPJ/okmgv0JR3HivQ5FbFiXJA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbcOUH/btsLiT1xbPJ/okmgv0JR3HivQ5FbFiXJA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbcOUH/btsLiT1xbPJ/okmgv0JR3HivQ5FbFiXJA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbcOUH%2FbtsLiT1xbPJ%2Fokmgv0JR3HivQ5FbFiXJA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;238&quot; height=&quot;347&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 내부에 구조체를 만들 수 있음 (구조체의 이름은 필요하지 않아서 생략 가능)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxx4uR/btsLhKxXTC5/ZVXTeZmPO4fXyQenFExKTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxx4uR/btsLhKxXTC5/ZVXTeZmPO4fXyQenFExKTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxx4uR/btsLhKxXTC5/ZVXTeZmPO4fXyQenFExKTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdxx4uR%2FbtsLhKxXTC5%2FZVXTeZmPO4fXyQenFExKTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;425&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;typedef&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 타입을 원하는 이름으로 정의해서 사용할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시에서는 struct AB 를 SAB로 typedef 하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfwmYh/btsLh1M5IMN/nYeQKhksSNJ8n8OwKIwfNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfwmYh/btsLh1M5IMN/nYeQKhksSNJ8n8OwKIwfNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfwmYh/btsLh1M5IMN/nYeQKhksSNJ8n8OwKIwfNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfwmYh%2FbtsLh1M5IMN%2FnYeQKhksSNJ8n8OwKIwfNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;313&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방식보다는 아래 방식이 더 많이 사용된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z3Sx0/btsLiKqbNgA/yMCTUMyHmJZXRXlVdoKAi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z3Sx0/btsLiKqbNgA/yMCTUMyHmJZXRXlVdoKAi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z3Sx0/btsLiKqbNgA/yMCTUMyHmJZXRXlVdoKAi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ3Sx0%2FbtsLiKqbNgA%2FyMCTUMyHmJZXRXlVdoKAi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;236&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아예 구조체 이름을 생략해버릴 수도 있다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpIsRS/btsLiITvq5y/ZKVKVg8Mh0O2LrETztFLR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpIsRS/btsLiITvq5y/ZKVKVg8Mh0O2LrETztFLR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpIsRS/btsLiITvq5y/ZKVKVg8Mh0O2LrETztFLR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpIsRS%2FbtsLiITvq5y%2FZKVKVg8Mh0O2LrETztFLR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;415&quot; height=&quot;234&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;union&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생긴 건 구조체와 비슷하지만 &lt;b&gt;멤버끼리 값을 공유&lt;/b&gt;한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시를 보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJSIp/btsLitbfZs1/31EXfGVqYDhJzfADAJKPHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJSIp/btsLitbfZs1/31EXfGVqYDhJzfADAJKPHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJSIp/btsLitbfZs1/31EXfGVqYDhJzfADAJKPHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJSIp%2FbtsLitbfZs1%2F31EXfGVqYDhJzfADAJKPHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;492&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;union 안에 있는 두 변수의 &lt;b&gt;시작 메모리 주소가 같은&lt;/b&gt; 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소는 byte 단위로 리틀 엔디안이 적용되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용을 적용해보자&lt;/p&gt;
&lt;pre id=&quot;code_1734073951013&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdint.h&amp;gt;

#pragma pack(1) // 여기서 부터 패딩 사용 안함
typedef union {
	uint8_t ori[6];

	struct {
		uint8_t opcode;

		uint8_t lba_part1 : 5;
		uint8_t reserved : 3;

		uint8_t lba_part2;
		uint8_t lba_part3;

		uint8_t length;
		uint8_t control;
	} field;
}Node;
#pragma pack(4) // 여기서 부터 패딩 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#pragma는 뭐고 uint8_t lba_part1 : 5; 뒤에 붙은 ' : ' 는 뭘까 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;padding에 대한 개념을 알아보자!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;padding&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 상황을 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AB 구조체에서 a 는 char라서 1 byte인데 뒤에 3byte가 비고 b가 오는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oADst/btsLh3xqtcp/XotcjAQXMK87WalHxG96jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oADst/btsLh3xqtcp/XotcjAQXMK87WalHxG96jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oADst/btsLh3xqtcp/XotcjAQXMK87WalHxG96jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoADst%2FbtsLh3xqtcp%2FXotcjAQXMK87WalHxG96jK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1177&quot; height=&quot;503&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 CPU가 값을 편하게 읽을 수 있도록 컴파일러가 padding을 줘서 그렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU가 4byte 씩 읽을 수 있다면 아래와 같은 차이가 생긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brdvnN/btsLhNn3Ehp/LNuShJmamrEOwB6Cgnjzz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brdvnN/btsLhNn3Ehp/LNuShJmamrEOwB6Cgnjzz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brdvnN/btsLhNn3Ehp/LNuShJmamrEOwB6Cgnjzz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrdvnN%2FbtsLhNn3Ehp%2FLNuShJmamrEOwB6Cgnjzz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;252&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 여기서 문제가 생기는데 &lt;b&gt;컴파일러마다 padding을 주는 조건이 다르다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;padding을 주지 않도록 설정해주는 매크로가 바로 #pragma&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint8_t lba_part1 : 5 에서 &lt;b&gt;:&lt;/b&gt;은 &lt;b&gt;비트 필드(bit-field)&lt;/b&gt;의 크기를 지정하는 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비트 필드는 구조체의 각 멤버가 &lt;b&gt;1비트&lt;/b&gt; 또는 그 이상의 비트 단위로 할당될 수 있도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정할 경우 uint8_t&amp;nbsp; 타입에서 5비트만 사용 하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1byte 내에서 5비트만 차지하게 된다&lt;/p&gt;</description>
      <category>C language</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/85</guid>
      <comments>https://thinkandscratch.tistory.com/85#entry85comment</comments>
      <pubDate>Fri, 13 Dec 2024 16:45:14 +0900</pubDate>
    </item>
    <item>
      <title>Memory Mapped IO</title>
      <link>https://thinkandscratch.tistory.com/84</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Memory Mapped IO란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;주기억장치들의 일부 주소를 입출력장치에 할당하는 방법으로,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 방식은 별도의 하드웨어 신호핀을 두지않고 Address line에 따라 분기하여 하드웨어에 접근하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징으로는&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 일부 공간을 I/O 포트에 할당&lt;/li&gt;
&lt;li&gt;메모리와 입출력 번지 사이의 구별이 없음&lt;/li&gt;
&lt;li&gt;메모리 명령으로 사용 가능&lt;/li&gt;
&lt;li&gt;기억장치 이용 효율이 낮고 (I/O 포트가 주소영역을 공유하기 때문에)&amp;nbsp; H/W가 간단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상대되는 방식으로는 I/O Mapped I/O가 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;STM32F103RB 기준으로 확인하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베디드 프로그래밍에 사용되는 ARM&amp;nbsp; 프로세서는 memory mapped I/O 방식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSAFY 수업에서 사용했던 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;STM32F103RB&lt;span&gt; 기준으로 설명해보겠다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STM32F103RB&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;referenece manual
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://www.st.com/resource/en/reference_manual/rm0008-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf&quot;&gt;https://www.st.com/resource/en/reference_manual/rm0008-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;datasheet
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.st.com/resource/en/datasheet/stm32f103c8.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.st.com/resource/en/datasheet/stm32f103c8.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;datasheet에서 Memory mapping 부분을 확인하면 메모리가 어떻게 사용되는지 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;956&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkwaCt/btsLiJj200R/tqITgYmkCpSK1846UGeDX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkwaCt/btsLiJj200R/tqITgYmkCpSK1846UGeDX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkwaCt/btsLiJj200R/tqITgYmkCpSK1846UGeDX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkwaCt%2FbtsLiJj200R%2FtqITgYmkCpSK1846UGeDX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;956&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;956&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소가 낮은 곳에 시스템과 기억장치가 맵핑되어 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소가 높은 곳에 입출력관리 및 peripherals(주변장치)가 메모리에 맵핑되어 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 임베디드 시스템에 사용되는 memory mapped i/o 방식은 메모리에 맵핑된 해당 장치의 레지스터 직접 접근하여 제어한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어 방법은 referenece manual을 참고하여 해당 레지스터에 값을 입력하는 방식으로 제어할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 port A의 GPIO를 제어하고 싶으면 referenece manual의 3.3장 Memory map에서 base address를 찾고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ESAYz/btsLg7fK4XF/jc8tU6AoP7bAKI9MeXx1k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ESAYz/btsLg7fK4XF/jc8tU6AoP7bAKI9MeXx1k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ESAYz/btsLg7fK4XF/jc8tU6AoP7bAKI9MeXx1k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FESAYz%2FbtsLg7fK4XF%2Fjc8tU6AoP7bAKI9MeXx1k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;670&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 설정 값에 따라서 base address + offset 주소에 설정 값을 넣어주면 제어할 수 있다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpCMx8/btsLhM91QJI/fXPpP2AKw12WlT1ZfPetk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpCMx8/btsLhM91QJI/fXPpP2AKw12WlT1ZfPetk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpCMx8/btsLhM91QJI/fXPpP2AKw12WlT1ZfPetk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpCMx8%2FbtsLhM91QJI%2FfXPpP2AKw12WlT1ZfPetk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;561&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Computer Science/임베디드</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/84</guid>
      <comments>https://thinkandscratch.tistory.com/84#entry84comment</comments>
      <pubDate>Fri, 13 Dec 2024 14:13:15 +0900</pubDate>
    </item>
    <item>
      <title>임베디드 개발 영역</title>
      <link>https://thinkandscratch.tistory.com/83</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;임베디드 개발 영역&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베디드 개발 영역은 크게 3개로 나뉜다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Application Level 임베디드 sw 개발자&lt;/li&gt;
&lt;li&gt;Middleware Level 임베디드 sw 개발자&lt;/li&gt;
&lt;li&gt;Low level 임베디드 sw 개발자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베디드에서 사용되는 운영체제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-style=&quot;style1&quot;&gt;리눅스&lt;/li&gt;
&lt;li data-ke-style=&quot;style1&quot;&gt;RTOS&lt;/li&gt;
&lt;li data-ke-style=&quot;style1&quot;&gt;자체적 운영체제 (firmware)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Applicaiton level 개발자&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;application이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;운영체제 안&lt;/b&gt;에서 동작하는 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;application 개발이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각각 운영체제에 맞는 앱을 개발
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리눅스 운영체제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리눅스 App 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RTOS 운영체제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RTOS 운영체제 App 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GUI 개발&lt;/li&gt;
&lt;li&gt;검증 SW 개발&lt;/li&gt;
&lt;li&gt;주로 C / C++ / C#을 주로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Middleware level 개발자&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Middleware란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application과 운영체제의 중간 다리 역할을 한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제의 신호를 App이 가져할 수 있는 API&lt;/li&gt;
&lt;li&gt;App level에서 운영체제에 신호를 전달하는 API&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;middleware 개발이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;application level 개발자를 위한 library / API 개발&lt;/li&gt;
&lt;li&gt;해당 문서 작성&lt;/li&gt;
&lt;li&gt;성능 최적화&lt;/li&gt;
&lt;li&gt;시스템 통합 및 테스트&lt;/li&gt;
&lt;li&gt;주로 사용되는 언어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Android
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JAVA / C / C++&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RTOS
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Low level 개발자&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Low level 개발이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Firmware 개발
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;H/W를 제어하는, 작은 운영체제 직접 개발&lt;/li&gt;
&lt;li&gt;주언어: C, Assembly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Device Driver 개발
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 내부에서 동작되는 프로그램으로 hw를 제어하는 프로그램 개발&lt;/li&gt;
&lt;li&gt;주언어: C&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/임베디드</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/83</guid>
      <comments>https://thinkandscratch.tistory.com/83#entry83comment</comments>
      <pubDate>Fri, 13 Dec 2024 10:43:35 +0900</pubDate>
    </item>
    <item>
      <title>고정길이 정수 - stdint.h</title>
      <link>https://thinkandscratch.tistory.com/82</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;고정길이 정수를 사용하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int는 표준으로 4byte라고 명시되어있지 않다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; int는 4byte가 아닐 수도 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템마다 다른 사이즈를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 시스템에서도 똑같은 크기를 갖게할 수 있도록 고정길이 정수를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여담으로 int는 원래 cpu가 가장 효율적으로 처리할 수 있는 크기를 의미하도록 설계되었다. 32bit 운영체제에서 가장 효율적으로 처리할 수 있는 크기는 4 byte 여서, 32 bit 운영체제에서는 int는 4 byte로 설계되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 컴퓨터는 대부분 64 bit 운영체제를 사용하지만 대부분 int 크기가 8 byte가 아닌&amp;nbsp; 4 byte로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;호환성: 이전의 C/C++ 코드의 대부분이 32 bit 환경에서 작성되었고, int 는 4 byte로 대부분 익숙하기 때문&lt;/li&gt;
&lt;li&gt;성능: 과거에는 CPU 아키텍처가 데이터 모델과 더 밀접하게 연결되어 있어서 int가 CPU 레지스터 크기와 거의 동일했지만, 현대에는 컴퓨터 아키텍처와 데이터 모델이 분리되어 반드시 동일할 필요가 없어짐&lt;/li&gt;
&lt;li&gt;메모리 사용량: 메모리 사용량이 증가하면 캐시성능에 영향을 미칠 수 있으므로 불필요한 크기 증가를 피할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;stdin.h&lt;/h2&gt;
&lt;pre id=&quot;code_1734045339687&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdint.h&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ibm.com/docs/ko/i/7.5?topic=files-stdinth&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;IBM 문서&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734045435933&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;&amp;lt;stdint.h&amp;gt;&quot; data-og-description=&quot;&amp;lt;stdint.h&amp;gt; 포함 파일은 너비를 지정하고 해당 매크로 세트를 정의하는 정수 유형 세트를 선언합니다. 또한 다른 표준 포함 파일에 정의된 유형에 대응하는 정수 유형의 한계를 지정하는 매크로도 &quot; data-og-host=&quot;www.ibm.com&quot; data-og-source-url=&quot;https://www.ibm.com/docs/ko/i/7.5?topic=files-stdinth&quot; data-og-url=&quot;https://www.ibm.com/docs/ko/i/7.5?topic=files-stdinth&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.ibm.com/docs/ko/i/7.5?topic=files-stdinth&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ibm.com/docs/ko/i/7.5?topic=files-stdinth&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;stdint.h&amp;gt;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;stdint.h&amp;gt; 포함 파일은 너비를 지정하고 해당 매크로 세트를 정의하는 정수 유형 세트를 선언합니다. 또한 다른 표준 포함 파일에 정의된 유형에 대응하는 정수 유형의 한계를 지정하는 매크로도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ibm.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;고정길이 정수타입&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;int8_t : char&lt;/li&gt;
&lt;li&gt;int16_t : short&lt;/li&gt;
&lt;li&gt;int32_t : int&lt;/li&gt;
&lt;li&gt;int64_t : long long&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;uint8_t : unsigned char&lt;/li&gt;
&lt;li&gt;uint16_t : unsigned short&lt;/li&gt;
&lt;li&gt;uint32_t : unsigned int&lt;/li&gt;
&lt;li&gt;uint65_t : unsigned long long&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unsigned는 부호없는 정수타입을 나타내는 키워드이다. - 부호를 포함하는 데이터타입에 비해서 약 2배의 양의 범위를 표현할 수 있게 해준다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그 외&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최소 너비 정수 유형
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;int_least8_t ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;가장 빠른 최소너비 정수 유형 = 해당 크기 이상의 값을 저장할 수 있으면서 해당 플랫폼에서 가장 빠르게 동작
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;int_fast8_t ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;가장 큰 너비 정수 유형
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;intmax_t, uintmax_t&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C language</category>
      <author>HYndrome</author>
      <guid isPermaLink="true">https://thinkandscratch.tistory.com/82</guid>
      <comments>https://thinkandscratch.tistory.com/82#entry82comment</comments>
      <pubDate>Fri, 13 Dec 2024 08:26:05 +0900</pubDate>
    </item>
  </channel>
</rss>