<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Programming @Undo</title>
    <link>https://untofu.tistory.com/</link>
    <description>빌게이츠 음모론</description>
    <language>ko</language>
    <pubDate>Thu, 2 Jul 2026 06:29:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>언두</managingEditor>
    <image>
      <title>Programming @Undo</title>
      <url>https://tistory1.daumcdn.net/tistory/2750456/attach/2bf22dd1c9744e2494eabfc5ccbbf7e5</url>
      <link>https://untofu.tistory.com</link>
    </image>
    <item>
      <title>[Core GuideLine] 인터페이스</title>
      <link>https://untofu.tistory.com/48</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.인터페이스는 명시적으로 만들어야 한다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스에 명시되지 않은 가정은 쉽게 간과되며 테스트가 어렵다.&lt;/p&gt;
&lt;pre id=&quot;code_1730972752383&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int round(double d)
{
    return (round_up) ? ceil(d) : d;    // 나쁜 코드 : &quot;보이지 않는&quot; 의존성
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 round(7.2)를 두 번 호출했을 때, 서로 다른 결과를 반환할 수도 있다는 점이 호출자에게 명확하게 보이지 않는다.&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;경우에 따라 환경 변수를 통해 일련의 작업 세부 사항을 제어하기도 합니다. 예를 들어, 일반 출력과 자세한 출력, debug와 optimized 모드 등,&amp;nbsp; 비록 비-로컬 제어가 잠재적으로 혼란을 줄 수 있지만, 이는 고정된 의미를 갖는 세부 구현에만 영향을 미칩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730973060720&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 나쁜 코드 : fprintf의 반환 값을 테스트하지 않음
fprintf(connection, &quot;logging: %d %d %d\n&quot;, x, y, s);&lt;/code&gt;&lt;/pre&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;해결법 : 예외를 던져야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.인터페이스를 통해 &lt;span style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;non-local이나 암시적 상태를 전달하지 않도록 해야 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot;&gt;: 비 정적(const)멤버 함수는 객체의 상태를 통해 다른 멤버 함수에 정보를 전달 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot;&gt;2. 인터페이스는 함수이거나 함수 집합이어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot;&gt;함수는 함수 템플릿이 될 수 있으며, 함수 집합은 클래스 또는 템플릿이 될 수 있다.&lt;/span&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;&lt;span style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot;&gt;규칙&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot;&gt;1. 함수는 네임스페이스 스코프에 선언된 변수의 값에 따라 제어 흐름을 결정하지 않아야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #515151; text-align: start;&quot;&gt;2. 함수는 네임스페이스 스코프에 선언된 변수에 값을 쓰지 않아야 한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/C++</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/48</guid>
      <comments>https://untofu.tistory.com/48#entry48comment</comments>
      <pubDate>Thu, 7 Nov 2024 18:54:20 +0900</pubDate>
    </item>
    <item>
      <title>[cpp][c++11] 타입 추론 (type inference)</title>
      <link>https://untofu.tistory.com/47</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;타입 추론 (type inference) ?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표현식의 타입을 컴파일러가 스스로 알아내는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련된 키워드로 auto와 decltype 이 있다.&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;auto 키워드&lt;/h2&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;구조적 바인딩에 사용&lt;/li&gt;
&lt;li&gt;표현식의 타입을 추론&lt;/li&gt;
&lt;li&gt;non type, 즉 타입이 아닌 템플릿 매개변수의 타입 추론&lt;/li&gt;
&lt;li&gt;함수에 대한 또다른 문법으로 사용&lt;/li&gt;
&lt;li&gt;제네릭 람다 표현식에서 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컴파일 시간에 자동으로 추론해서 결정됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;auto로 표현식의 타입을 추론하면&lt;b&gt; 함수에 지정된 레퍼런스나 const 한정자가 제거됨&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;복제 방식으로 전달되지 안헥 하려면 auto&amp;amp;나 const auto&amp;amp; 타입으로 지정해야 함 &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1671174712883&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const std::string message = &quot;TEST&quot;;

const std::string&amp;amp; foo()
{
	return message;
}

void main()
{
	//const 한정자 사라짐
	//str1타입은 string
	//즉 값이 복제되어버림
	auto str1 = foo();

	
	//이렇게 쓰면 값이 복사되지 않지~
	const auto&amp;amp; str2 = foo();
}&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;decltype 키워드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;declared type(선언된 형식)의 줄임말&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;아래와 같이 작성하면, y는 x의 type인 int로 추론할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1671174831245&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int x = 123;
decltype(x) y = 456;&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;auto와 달리&lt;/b&gt; 레퍼런스나 const지정자를 삭제 하지 않는다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에서 쓴 예문을 decltype을 통해 작성한다면 const string&amp;amp;타입이 되어 값 복제가 일어나지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1671174957960&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;decltype(foo()) str3 = foo();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/C++</category>
      <category>Auto</category>
      <category>cpp</category>
      <category>decltype</category>
      <category>타입추론</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/47</guid>
      <comments>https://untofu.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 16 Dec 2022 15:59:25 +0900</pubDate>
    </item>
    <item>
      <title>[cpp][c++11] noexcept 키워드</title>
      <link>https://untofu.tistory.com/46</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;noexcept가 지정된 함수는 익셉션을 던지지 않는다.&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_1671173515792&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int testfunc() noexcept;&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;&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;noexcpet키워드가 지정된 함수에 익셉션을 던지는 코드가 있다면 c++런타임은 terminate()를 호출하여 프로그램 종료&lt;/li&gt;
&lt;li&gt;파생클래스에서 virtual함수를 오버라이드할때 베이스클래스에 정의된 메서드에 noexcept가 지정되어 있지않더라도, 오버라이드 하는 함수에서 noexcept를 지정할 수 있다. 하지만 반대는 불가능하다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Programming/C++</category>
      <category>c++</category>
      <category>cpp</category>
      <category>noexcept</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/46</guid>
      <comments>https://untofu.tistory.com/46#entry46comment</comments>
      <pubDate>Fri, 16 Dec 2022 15:54:02 +0900</pubDate>
    </item>
    <item>
      <title>[cpp][c++ 17] std::string_view</title>
      <link>https://untofu.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;먼저 알아야 할 개념 : 문자열 리터럴&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;overview&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;std::string_view&lt;/b&gt; 클래스는&amp;nbsp; &quot;문자열에 대한 비소유 참조&quot;&amp;nbsp; 이다&lt;br /&gt;문자열에 대한 &quot;상수 참조&quot; 또는 &quot;읽기 전용 참조&quot; 라고 할 수도 있지만,&amp;nbsp;&lt;br /&gt;&lt;b&gt;const std::string&amp;amp;&lt;/b&gt; 로 오해할 수 있기 때문에 이렇게 정의한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #415462;&quot;&gt;실질적인 기능을 제공하는 것은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;std::basic_string_view&lt;span style=&quot;background-color: #ffffff; color: #415462;&quot;&gt;라는 템플릿이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #415462;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;std::string_view&lt;span style=&quot;background-color: #ffffff; color: #415462;&quot;&gt;는 미리 정의된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;std::basic_string_view&amp;lt;char&amp;gt;&lt;span style=&quot;background-color: #ffffff; color: #415462;&quot;&gt;의 별칭일 뿐..(std::basic_string 을 std::string으로 쓰는것과 유사)&lt;/span&gt;&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;1311&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YgABN/btrS6fQlQi1/AJeU1P1iCnHhCQrdylyjk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YgABN/btrS6fQlQi1/AJeU1P1iCnHhCQrdylyjk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YgABN/btrS6fQlQi1/AJeU1P1iCnHhCQrdylyjk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYgABN%2FbtrS6fQlQi1%2FAJeU1P1iCnHhCQrdylyjk1%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;1311&quot; height=&quot;577&quot; data-origin-width=&quot;1311&quot; data-origin-height=&quot;577&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;std::string&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C Style 문자열 표현
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열의 마지막에 널문자(\0)를 붙여서 끝남을 표시함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;std::string
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;string&amp;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;연산자 오버로딩&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;== , != , &amp;lt; 와 같은 연산자를 사용할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;compare 메소드 사용가능&lt;/li&gt;
&lt;li&gt;cpp 20부터는 3-way 비교연산자로 수행 가능&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메모리 관리&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;string클래스에서 알아서 해줌 -&amp;gt; 메모리 오버런 걱정 없음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자세히 보자면...&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;string을 할당하거나, 크기 변경 코드가 여기저기 있더라도 메모리 누수가 발생하지 x
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;string객체는 모두 스택변수이기 때문에 생성된 스코프를 벗어나면 알아서 소멸자에서 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;연산자를 원하는 방식으로 동작할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;c_str()&lt;/b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메소드를 사용하면 C언어에서 호환되는 const char 포인터를 얻을 수 있음&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555;&quot;&gt;but 리턴된 const포인터는 string에 대한 메모리를 재할당하거나 해당 객체를 제거하면 유효치 않음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;현재 string에 담긴 내용을 정확히 사용하려면 이 메소드를 호출한 직후에 리턴된 포인터를 바로 활용&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;함수 안에서 생성된 스택 기반의 string 객체에 대해서 c_str()을 호출한 결과를 절대로 리턴값으로 전달하면 안된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&amp;nbsp;std::string_view&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;만약 읽기 전용 문자열을 매개변수로 받는 함수를 작성한다면, 해당 문자열에 대한 타입은 어떻게 정하겠는가?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;const char* 로 지정한다면, std::string을 사용하는 클라이언트에서 c_str()나 data()를 사용하여 string을 const char*로 변환해서 호출해야 하는 단점이 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;const std::string&amp;amp; 으로 지정한다면, 항상 std::string만 사용해야한다. &lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;예를 들어 문자열 리터럴을 전달하면 컴파일러는 그 문자열 리터럴의 복사본이 담긴 string 객체를 생성하여 함수로 전달하기 때문에 오버헤드가 발생된다&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;즉, 이 클래스의 주된 용도는 const string&amp;amp;을 대신하는 것 이다!&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;만약 아래와 같은 함수가 있다고 치자.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670399642343&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void A(const string&amp;amp; str)
{
	cout&amp;lt;&amp;lt;str;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1670399841898&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void B(const char* str)
{
	cout&amp;lt;&amp;lt;str;
}&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;위 A() B() 모두 단순히 문자열을 입력받아 출력하는 함수이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1670399892690&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;std::string str = &quot;hello&quot;;

A(&quot;hi&quot;);
B(str.c_str());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;하지만 이렇게 호출한다면, 둘 다 위에서 말한 문제가 발생한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A(&quot;hi&quot;)의 경우에는 결국 const char*로 간주되며, string(const char*) 생성자가 실행되어 메모리 할당과 문자열 자료 복사가 발생한다.&lt;/li&gt;
&lt;li&gt;B(str.c_str())의 경우에는 string을 사용하기 때문에 변환해서 매개변수에 넣어주어야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1670400130567&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void C(const string_view&amp;amp; str)
{
	cout&amp;lt;&amp;lt;str;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;이렇게 선언한다면 두가지 다 필요 없지롱!&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 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;c_str()함수가 없다&lt;/li&gt;
&lt;li&gt;data()가 돌려주는 것이 종료 문자열이 아니다&lt;/li&gt;
&lt;li&gt;string_view만의 인터페이스가 추가 되었다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #edf0f3; color: #415462;&quot;&gt;remove_prefix&amp;nbsp; 및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #edf0f3; color: #415462;&quot;&gt;remove_suffix&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;cpp 17에서 string_view를 위한 문자열 리터럴을 추가했다!
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;hi&quot;sv 처럼 끝에 접미사 sv가 붙은 문자열 리터럴은 상수 string_view객체가 된다&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고 사항&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.cppreference.com/w/cpp/string/basic_string_view&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.cppreference.com/w/cpp/string/basic_string_view&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670396716431&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;std::basic_string_view - cppreference.com&quot; data-og-description=&quot;template&amp;lt; &amp;nbsp; &amp;nbsp; class CharT, &amp;nbsp; &amp;nbsp; class Traits = std::char_traits &amp;gt; class basic_string_view; (since C++17) The class template basic_string_view describes an object that can refer to a constant contiguous sequence of char-like objects with the first elemen&quot; data-og-host=&quot;en.cppreference.com&quot; data-og-source-url=&quot;https://en.cppreference.com/w/cpp/string/basic_string_view&quot; data-og-url=&quot;https://en.cppreference.com/w/cpp/string/basic_string_view&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://en.cppreference.com/w/cpp/string/basic_string_view&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.cppreference.com/w/cpp/string/basic_string_view&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;std::basic_string_view - cppreference.com&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;template&amp;lt; &amp;nbsp; &amp;nbsp; class CharT, &amp;nbsp; &amp;nbsp; class Traits = std::char_traits &amp;gt; class basic_string_view; (since C++17) The class template basic_string_view describes an object that can refer to a constant contiguous sequence of char-like objects with the first elemen&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;en.cppreference.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3921.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3921.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670396733866&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;string_view: a non-owning reference to a string, revision 7&quot; data-og-description=&quot;Acknowledgements I'd like to thank Marshall Clow, Olaf van der Spek, the Boost and std-proposals mailing lists, Chandler Carruth, Beman Dawes, Alisdair Meredith, and especially Daniel Kr&amp;uuml;gler for help, advice, and wording in this paper.&quot; data-og-host=&quot;www.open-std.org&quot; data-og-source-url=&quot;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3921.html&quot; data-og-url=&quot;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3921.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3921.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3921.html&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;string_view: a non-owning reference to a string, revision 7&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Acknowledgements I'd like to thank Marshall Clow, Olaf van der Spek, the Boost and std-proposals mailing lists, Chandler Carruth, Beman Dawes, Alisdair Meredith, and especially Daniel Kr&amp;uuml;gler for help, advice, and wording in this paper.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.open-std.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://junstar92.tistory.com/305&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://junstar92.tistory.com/305&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670397228359&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[C++] string과 string_view&quot; data-og-description=&quot;References Professional C++ https://en.cppreference.com/w/ Contents C-Style Strings String Literals Raw String Literals C++ std::string 클래스 std::string_view 클래스 Nonstandard Strings C 언어에서는 단순히 널(NULL)로 끝나는 문자 배&quot; data-og-host=&quot;junstar92.tistory.com&quot; data-og-source-url=&quot;https://junstar92.tistory.com/305&quot; data-og-url=&quot;https://junstar92.tistory.com/305&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIXMqF/hyQPdfsx7f/4TMjfRnxnRSTjEKkpkb3MK/img.png?width=364&amp;amp;height=62&amp;amp;face=0_0_364_62,https://scrap.kakaocdn.net/dn/e8Thf/hyQNPUQvVN/qQCKkIL4ARoWTCxKtcglP1/img.png?width=364&amp;amp;height=62&amp;amp;face=0_0_364_62,https://scrap.kakaocdn.net/dn/dVeiAe/hyQNMDNrU3/UxVYjDjrHkWkXrzHlUxEv1/img.png?width=790&amp;amp;height=551&amp;amp;face=0_0_790_551&quot;&gt;&lt;a href=&quot;https://junstar92.tistory.com/305&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://junstar92.tistory.com/305&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIXMqF/hyQPdfsx7f/4TMjfRnxnRSTjEKkpkb3MK/img.png?width=364&amp;amp;height=62&amp;amp;face=0_0_364_62,https://scrap.kakaocdn.net/dn/e8Thf/hyQNPUQvVN/qQCKkIL4ARoWTCxKtcglP1/img.png?width=364&amp;amp;height=62&amp;amp;face=0_0_364_62,https://scrap.kakaocdn.net/dn/dVeiAe/hyQNMDNrU3/UxVYjDjrHkWkXrzHlUxEv1/img.png?width=790&amp;amp;height=551&amp;amp;face=0_0_790_551');&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;[C++] string과 string_view&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;References Professional C++ https://en.cppreference.com/w/ Contents C-Style Strings String Literals Raw String Literals C++ std::string 클래스 std::string_view 클래스 Nonstandard Strings C 언어에서는 단순히 널(NULL)로 끝나는 문자 배&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;junstar92.tistory.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;</description>
      <category>Programming/C++</category>
      <category>C++ 17</category>
      <category>std::string_view</category>
      <category>string_view</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/45</guid>
      <comments>https://untofu.tistory.com/45#entry45comment</comments>
      <pubDate>Wed, 7 Dec 2022 17:07:50 +0900</pubDate>
    </item>
    <item>
      <title>[cpp] 전방 선언에 대하여</title>
      <link>https://untofu.tistory.com/44</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;전방 선언(forward declarations) 과 정의(definitions)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;실제로 식별자를 정의하기 전에 식별자의 존재를 컴파일러에게 미리 알리는 것이다&lt;/span&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;함수의 경우 전방선언을 하려면 함수 원형으로 사용해야 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;전방선언을 할 경우 클래스의 존재만 인지시키는 것이기 때문에 포인터로밖에 선언하지 못한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전방 선언을 사용하는 이유?&lt;/h4&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;역참조가 되는 구조를 막기도 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Closet.h 에 아래와 같이 선언되어있다고 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1669972924411&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Button;
class Jumper {
    Button *pB;
    
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전방 선언을 사용하지 않는다면 Closet.cpp는 이렇게 사용해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1669972993985&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;Closet.h&quot;
class Jumper {
    Button *pB;
    
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 전방선언을 쓴다면 요렇게 쓸수 있지롱&lt;/p&gt;
&lt;pre id=&quot;code_1669973045293&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;Closet.h&quot;
void Jumper::createButton() {
    this.pB = new Button;
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드의 동작결과는 1+2=3이 아니다!&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1669973403198&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main()
{
	std::cout&amp;lt;&amp;lt; &quot; 1+2 = :&quot; &amp;lt;&amp;lt;add(1,2)&amp;lt;&amp;lt;std::endl;
}

int add(int x, int y)
{
	return x+y;
}&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;멍청이 컴파일러는 소스코드를 순서대로 읽기때문에, add함수가 무엇을 뜻하는지 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴때에는 main문 앞에 전방선언으로 한줄만 추가해주면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1669973536200&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int add(int x, int y);

void main()
{ ... }

int add(int x , int y)
{ ... }&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;또는 매개변수의 이름을 지정하지 않고 int add(int,int)꼴로도 선언할 수 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보는사람이 이해하기 힘드니까 그냥 동일하게 쓰는게 좋다 이말씀~&lt;/p&gt;</description>
      <category>Programming/C++</category>
      <category>cpp</category>
      <category>전방선언</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/44</guid>
      <comments>https://untofu.tistory.com/44#entry44comment</comments>
      <pubDate>Fri, 2 Dec 2022 18:33:59 +0900</pubDate>
    </item>
    <item>
      <title>[cpp][effective_c++_19] 클래스 설계는 타입 설계와 똑같이</title>
      <link>https://untofu.tistory.com/43</link>
      <description>&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;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;b&gt;객체 초기화는 객체 대입과 어떻게 달라야 하는가?&lt;/b&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;b&gt;새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가?&lt;/b&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;b&gt;새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 가질 것인가?&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기존의 클래스 상속에 맞출 것인가?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미 갖고 있는 클래스로부터 상속을 시킨다면, 당연히 이번에 설계한 클래스는 이녀석들에 의해 제약을 받게 된다. 특히 멤버함수가 가상인가 비가상인가 여부가 가장 크다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이번에 설계하는 클래스를 다른클래스들이 상속할수 있게 만들고 싶다면, 멤버함수의 가상함수 여부도 고려할 수 있겠지...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;어떤 종류의 타입 변환을 허용할 것인가?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;암시적인 변환(Implicit)이 가능하게 만들고 싶다면, 타입 변환 함수를 하나 넣어두던가, 인자 한개로 호출될 수 있는 비명시호출(non-explicit) 생성자를 넣어주어야 한다.&lt;/li&gt;
&lt;li&gt;명시적(explicit)타입 변환만 허용하고 싶다면, 해당 변환을 맡는 별도 이름의 함수를 만들되 타입변환 연산자 혹은 비명시호출생성자는 만들지 말아야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;어떤 연산자와 함수를 두어야 의미가 있을까?&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;표준 함수들 중 어떤것을 허용하지 말 것인가?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;private로 선언해야하는 함수들 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새로운 타입의 멤버에 대한 접근권한을 어느 쪽에 줄 것인가?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 클래스 멤버를 public/protected/private영역에 둘 것인가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;'선언되지 않은 인터페이스'로 무엇을 둘 것인가?&lt;/b&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;b&gt;새로 만드는 타입이 얼마나 일반적인가?&amp;nbsp;&lt;/b&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;그렇다면 새로운 클래스가아닌 새로운 클래스 템플릿을 정의해야 할 것..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정말로 꼭 필요한 타입인가?&lt;/b&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;/ul&gt;</description>
      <category>Programming/C++</category>
      <category>cpp</category>
      <category>Effective c++</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/43</guid>
      <comments>https://untofu.tistory.com/43#entry43comment</comments>
      <pubDate>Thu, 1 Dec 2022 19:09:18 +0900</pubDate>
    </item>
    <item>
      <title>[cpp][effective_c++_18] 인터페이스 설계는 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게</title>
      <link>https://untofu.tistory.com/42</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;함수도 인터페이스,클래스도 인터페이스,템플릿 또한 인터페이스요....&lt;br /&gt;사용자가 의도한 대로 동작하지 않는다면 그 코드는 컴파일 되어야 하지 않는 것이 맞다.&lt;br /&gt;또한, 어떤 코드가 컴파일된다면... 사용자가 원하는 대로 동작해야한다.&lt;br /&gt;&lt;br /&gt;'제대로 쓰기는 쉬우나 엉터리로 쓰기엔 어려운'&amp;nbsp; 인터페이스를 개발하려면 우선 사용자가 저지를 만한 실수를 머리에 넣어 두고 있어야 한다.&lt;br /&gt;&lt;br /&gt;예를 들면, 날짜를 저장하는 클래스의 생성자를 설계해보자&lt;/p&gt;
&lt;pre class=&quot;c++ arduino&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;c++&quot;&gt;&lt;code&gt;class Date{
public:
 Date(int month, int day, int year);
 ...
 };&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기엔 사용자가 저지를 만한 실수가 있다!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;매개변수의 전달 순서를 잘못쓰거나,유효 범위를 넘어서는 숫자가 들어갈 수 있다.&lt;br /&gt;1. Date date(30,3,1999)&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt;month랑 day를 바꿔서 넣은 경우&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. Data date(3,40,1999)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt;day에 유효범위 숫자를 넘어선 녀석을 넣을 경우&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;li&gt;객체의 값에 대해 제약걸기&lt;/li&gt;
&lt;li&gt;자원 관리 작업을 사용자 책임으로놓지 않기&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;새로운 타입 만들기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669886249778&quot; class=&quot;reasonml&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Struct Day
{
	explicit Day(int d):val(d){}
	int val;
};

Struct Month
{
	explicit Month(int m):val(m){}
	int val;
};

Struct Year
{
	explicit Year(int y):val(y){}
	int val;
};

class Date{
public:
	Date(const Month&amp;amp; m , const Day&amp;amp; d , const Year&amp;amp; y);
    ...
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;각 타입에 제약값을 설정하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;enum을 쓰는방법도 있지만, 타입안정성은 별로기때문에,,,,, 유효한 Month(or Day or Year...)의 집합을 정의하는게 나을지도~&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;타입에 대한 연산을 제한하기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아주~ 흔히 쓰이는 예로는 const를 붙인다. operator*의 반환 타입을 const로 한정함으로써 사용자가 사용자 정의 타입에 대해 실수를 저지르지 않을 수 있었지&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자원 관리 작업을 사용자 책임으로놓지 않기&amp;nbsp;&lt;/b&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;tr1::shared_ptr는 사용자 정의 삭제자를 지원한다. 이 특징때문에 교차 DLL문제를 막아주며, 뮤텍스등을 자동으로 잠금해제하는데 쓸 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터페이스의 올바른 사용을 이끄는 방법&lt;/b&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;기본 제공 타입과의 동작 호환성 유지하기&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Programming/C++</category>
      <category>cpp</category>
      <category>Effective c++</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/42</guid>
      <comments>https://untofu.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 23 Nov 2022 01:06:17 +0900</pubDate>
    </item>
    <item>
      <title>[Cpp] Lambda 표현식에 대하여 알아보자</title>
      <link>https://untofu.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;함수형 프로그래밍을 안다면 람다표현식이 쉬울것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 C++ 11이전 버전만 사용하던 나에게... 개념이해가 어렵다..^_^...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다수의 구글링과 유튜브(&lt;a href=&quot;https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Java Script의 Closure개념에 대해 알아두면 좋을 듯 하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.Closure의 정의&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로저는 자바스크립트 고유의 개념이 아니다. 클로저에 대해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures&quot;&gt;MDN&lt;/a&gt;은 아래와 같이 정의하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;ldquo;A closure is the combination of a function and the lexical environment within which that function was declared.&amp;rdquo;&lt;br /&gt;클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)과의 조합이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lexical환경 이란 아래와 같이 정의할 수 있다. = 내부 숨김 연관 객체(Internal Hidden Associated Object)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렉시컬&amp;nbsp; =&amp;nbsp; &quot;사전의&quot; &quot;어휘의&quot;&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;코드 블록 {...}&lt;/li&gt;
&lt;li&gt;스크립트 전체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 클로저는 함수와 그 함수가 선언된 환경과의 관계이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;ldquo;함수&amp;rdquo;란 반환된 내부함수를 의미하고 &amp;ldquo;그 함수가 선언될 때의 렉시컬 환경(Lexical environment)&amp;rdquo;란 내부 함수가 선언됐을 때의 스코프를 의미한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;를 말한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클로저는 자신이 생성될 때의 환경(Lexical environment)을 기억하는 함수 &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;정의는 이쯤하고, 관련내용은 구글링을 하도록 한다..&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;h4 data-ke-size=&quot;size20&quot;&gt;2. 그래서 C++에서 Closure개념을 어떻게 사용하는데?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 코드를 보며 느낌을 이해해보자..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;plus3 객체(Function Object) 는 localVar에 3 을 할당한 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;plus5 객체는 localVar에 5를 할당한 상태 이다!&lt;/p&gt;
&lt;pre id=&quot;code_1662564542221&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;
using namespace std;

//closer 랑 유사한 개념으로 접근해야한다

class Plus
{
public:
	//explicit 키워드 : 자신이 원하지 않은 형변환이 일어나지 않도록 제한하는 키워드
	explicit Plus(int a) :localVar{ a } {}
	//class로부터 만들어진 오브젝트를 호출이 가능한 오브젝트로 만들려면 function call operator를 오버로딩하면된다
	int operator() (int x) const
	{
		return localVar + x;
	}

private:
	int localVar;
};

int main()
{
	Plus plus3{ 3 };
	Plus plus5{ 5 };

	cout &amp;lt;&amp;lt; plus3(10) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; plus5(10) &amp;lt;&amp;lt; endl;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Lambda Expression&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드 중 Plus3은 정확히 아래와 같은 코드이다. (asm, memory map 동일)&lt;/p&gt;
&lt;pre id=&quot;code_1662564956988&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	//캡쳐 모드
	auto lambdaplus3 = [localVar = 3](int x)
	{
		return localVar + x;
	};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/C++</category>
      <category>C++ 람다</category>
      <category>모던c++</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/41</guid>
      <comments>https://untofu.tistory.com/41#entry41comment</comments>
      <pubDate>Thu, 8 Sep 2022 13:20:30 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] Symmetric Tree</title>
      <link>https://untofu.tistory.com/40</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;a href=&quot;https://leetcode.com/problems/symmetric-tree/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/symmetric-tree/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1651732090281&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;Symmetric Tree - LeetCode&quot; data-og-description=&quot;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/symmetric-tree/&quot; data-og-url=&quot;https://leetcode.com/problems/symmetric-tree/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dXjr4W/hyOhwhuwFC/0plWhvaBXmY5XtQKrtxbsK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/b8QeDg/hyOhr1xnpy/8X6kNZ9zNRHFUfvGiBqvkK/img.jpg?width=354&amp;amp;height=291&amp;amp;face=0_0_354_291,https://scrap.kakaocdn.net/dn/ci36mu/hyOhEs2W0A/5NkvlC5B1mKsBxSnxeQjQK/img.jpg?width=308&amp;amp;height=258&amp;amp;face=0_0_308_258&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/symmetric-tree/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/symmetric-tree/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dXjr4W/hyOhwhuwFC/0plWhvaBXmY5XtQKrtxbsK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/b8QeDg/hyOhr1xnpy/8X6kNZ9zNRHFUfvGiBqvkK/img.jpg?width=354&amp;amp;height=291&amp;amp;face=0_0_354_291,https://scrap.kakaocdn.net/dn/ci36mu/hyOhEs2W0A/5NkvlC5B1mKsBxSnxeQjQK/img.jpg?width=308&amp;amp;height=258&amp;amp;face=0_0_308_258');&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;Symmetric Tree - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BCGAU/btrBhlaX9My/KTP1GWPZeTsLqFiQEDu0Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BCGAU/btrBhlaX9My/KTP1GWPZeTsLqFiQEDu0Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BCGAU/btrBhlaX9My/KTP1GWPZeTsLqFiQEDu0Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBCGAU%2FbtrBhlaX9My%2FKTP1GWPZeTsLqFiQEDu0Y0%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;568&quot; height=&quot;558&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pRWOa/btrBhSfMhHG/GrcRtH4KdZ7HPwbBphLCA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pRWOa/btrBhSfMhHG/GrcRtH4KdZ7HPwbBphLCA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pRWOa/btrBhSfMhHG/GrcRtH4KdZ7HPwbBphLCA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRWOa%2FbtrBhSfMhHG%2FGrcRtH4KdZ7HPwbBphLCA0%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;542&quot; height=&quot;565&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해설&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tree가 Symmetric 즉 대칭적인지 판단하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 두가지 방법으로 풀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. recursive한 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;background-color: #ffffff; color: #263238;&quot;&gt;iterative 한 방법&lt;/span&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;&lt;span style=&quot;background-color: #ffffff; color: #263238;&quot;&gt;1. recursive한 방법&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263238;&quot;&gt;트리가 대칭적이려면 다음과 같은 조건이 필요하다&lt;/span&gt;&lt;/p&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;633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxO5Su/btrBiY6DmRO/RbUtHU1321jBEwLobUFb00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxO5Su/btrBiY6DmRO/RbUtHU1321jBEwLobUFb00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxO5Su/btrBiY6DmRO/RbUtHU1321jBEwLobUFb00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxO5Su%2FbtrBiY6DmRO%2FRbUtHU1321jBEwLobUFb00%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;500&quot; height=&quot;386&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;633&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2번 혹은 3번 하나만 존재시 대칭이 아니다.&lt;/li&gt;
&lt;li&gt;2번 &amp;amp;&amp;amp; 3번이 둘다 없을 경우 대칭이다.&lt;/li&gt;
&lt;li&gt;2번&amp;amp;&amp;amp; 3번이 둘다 존재한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2번과 3번 노드의 값이 같을 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4번과 7번노드 &amp;amp;&amp;amp; 5번과 6번노드가 같아야 대칭이다.&lt;/li&gt;
&lt;li&gt;아니면 대칭이 아니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2번과 3번 노드의 값이 다를 경우 대칭이 아니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 재귀적으로 구현하면 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1651733301189&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == NULL)
            return true;
        else
           return isSubSymmetric(root-&amp;gt;left,root-&amp;gt;right);
    }
    bool isSubSymmetric(TreeNode* leftSide, TreeNode* rightSide)
    {
        if(leftSide == NULL &amp;amp;&amp;amp; rightSide == NULL) // 자식노드 둘다 없는 경우
            return true;
        else if(leftSide == NULL || rightSide == NULL) // 하나만 있을 경우 대칭이 아님
            return false;
        else
        {
            if(leftSide-&amp;gt;val == rightSide-&amp;gt;val) //둘다 있을 경우 값을 비교하여 같을 경우
                return isSubSymmetric(leftSide-&amp;gt;left,rightSide-&amp;gt;right) and isSubSymmetric(leftSide-&amp;gt;right, rightSide-&amp;gt;left);
            else
                return false;// 둘다 있는데 값이 다를 경우 대칭이 아니다.
        }   
                
    }
};&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/알고리즘</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/40</guid>
      <comments>https://untofu.tistory.com/40#entry40comment</comments>
      <pubDate>Thu, 5 May 2022 15:48:26 +0900</pubDate>
    </item>
    <item>
      <title>[CPP] 1. CPP의 법 따르기</title>
      <link>https://untofu.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. CPP를 언어들의 연합체로 바라보는 안목이 필요하다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPP의 구성요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.C&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.객체 지향 개념의 C++&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.템플릿 C++&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.STL&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;b&gt;2. #define을 쓰려거든 const, enum, inline을 떠올리자&lt;/b&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;#define BREAD_NUMBER 4&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 정의햇을 경우 컴파일러는 BREAD_NUMBER라는 기호를 모른다( 컴파일러에게 넘어가기전에 선행처리자가 밀어버리고 상수로 바꾸기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고로 에러메시지에 BREAD_NUMBER보다는, 4로 나오는 상황이다(0이나 1이라면 에러났을때 곤란해,, )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 숫자를 찾아들어가기 힘들기 때문에 이렇게 #define으로 선언하는것보다 상수를 쓰는것이 바람직하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const int BreadNumber=4;&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;단, 이렇게 #define을 상수로 교체할 때에는 조심해야할 점이 두가지 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 상수 포인터를 정의하는경우&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상수정의는 대개 헤더파일에 넣는게 국룰..! 포인터는 꼭 const로 선언해주어야하고, 아울러 포인터가 가리키는 대상까지 const로 선언해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 테면 어떤 헤더파일안에 char*기반의 상수를 정의한다면 const를 두 번 써줘야한다;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const char* const name=&quot;Mike&quot;;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이 경우 string을 쓰는게 깔끔하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const std:string name(&quot;Mike&quot;);&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;2. 클래스 멤버로 상수를 정의하는 경우, 즉 클래스 상수를 정의하는경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 상수의 유효범위를 클래스로 한정하고자 할 때는 상수를 멤버로 만들어야하는데, 그 상수의 사본개수가 한 개를 넘기지 못하게 하고싶다면 static멤버로 만들어야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1643033406066&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Class GamePlayer{
private:
static const int NumTurns=3; //상수 선언
int scores[NumTurns]; //상수 사용하는 부분
}&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size16&quot;&gt;const int GamePlayer::NumTurns;&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;&lt;u&gt;Tip ) 나열자 둔갑술(enum hack)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 클래스에서 static const int NumTurns=3 ; 대신 아래와 같이 쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enum{ NumTurns = 3};&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나열자 둔갑술은 동작방식이 #definde에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;선언한 정수 상수를 가지고 다른사람이 주소를 얻는다던지, 참조자를 쓴다던지 하는것이 싫다면 자물쇠가 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enum은 #define처럼 어떤 형태의 쓸데없는 메모리 할당도 저지르지 않는다&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;</description>
      <category>Programming/C++</category>
      <author>언두</author>
      <guid isPermaLink="true">https://untofu.tistory.com/38</guid>
      <comments>https://untofu.tistory.com/38#entry38comment</comments>
      <pubDate>Mon, 24 Jan 2022 23:22:19 +0900</pubDate>
    </item>
  </channel>
</rss>