<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>[로데시] 개발</title>
    <link>https://rodesi.tistory.com/</link>
    <description>개발 및 자격증 관련해서 기록하는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 14:32:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>로데시</managingEditor>
    <image>
      <title>[로데시] 개발</title>
      <url>https://tistory1.daumcdn.net/tistory/7006298/attach/8b2c4f5861f7498f9460d7e117876c24</url>
      <link>https://rodesi.tistory.com</link>
    </image>
    <item>
      <title>[정처기 실기] JAVA - P p = new C(); 상속 예제 문제</title>
      <link>https://rodesi.tistory.com/45</link>
      <description>&lt;div id=&quot;code_1774717336347&quot; data-ke-type=&quot;html&quot; data-source=&quot;(5) P p = new C(); 형태의 상속 예제 문제&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;a href=&amp;quot;https://youtu.be/GS9Cr--ymVE&amp;quot;&amp;gt;
  &amp;lt;div style=&amp;quot;display: inline-block; align-items: center; border: 1px solid #ddd; padding: 10px; border-radius: 8px; margin-bottom: 10px;&amp;quot;&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;h4 style=&amp;quot;margin: 0; font-size: 16px;&amp;quot;&amp;gt;https://youtu.be/GS9Cr--ymVE&amp;lt;/h4&amp;gt;
      &amp;lt;p style=&amp;quot;margin: 4px 0 0; font-size: 14px; color: #555;&amp;quot;&amp;gt;흥달쌤 유튜브&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
  생성자&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-java&amp;quot;&amp;gt;class P &amp;amp;#123; // 부모 클래스 (#line 1)
  P() System.out.print(&amp;quot;A&amp;quot;); // 인자 없는 생성자

  P(int a) System.out.print(&amp;quot;B&amp;quot;);
&amp;amp;#125;

class C extends P &amp;amp;#123; // 자식 클래스 (#line 7)
  C() System.out.print(&amp;quot;C&amp;quot;); // 인자 없는 생성자

  C(int a) System.out.print(&amp;quot;D&amp;quot;);

  C(int a, int b) &amp;amp;#123; // 인자 2개인 생성자
    System.out.print(&amp;quot;E&amp;quot;);
  &amp;amp;#125;
&amp;amp;#125;

P p1 = new C(); //AC
// [1] 일단 인자 없는 자식 생성자(#line 8)로 가서 부모 클래스를 명시적으로 호출한 게 있나 확인
// [2] super가 없으면 묵시적으로 부모의 인자 없는 생성자가 자동 호출(#line 2), 명령문 수행
// &amp;gt;&amp;gt; &amp;quot;A&amp;quot; 출력
// [3] 그리고 다시 인자 없는 자식 생성자로 와서 (#line 8) 명령문 수행
// &amp;gt;&amp;gt; &amp;quot;C&amp;quot; 출력

P p2 = new C(1); //AD
// [1] 일단 인자 1개인 자식 생성자(#line 10)로 가서 부모 클래스를 명시적(super)으로 호출한 게 있나 확인
// [2] super가 없으면 묵시적으로 부모의 인자 없는 생성자가 자동 호출(#line 2), 명령문 수행
// &amp;gt;&amp;gt; &amp;quot;A&amp;quot; 출력
// [3] 그리고 다시 인자 1개인 자식 생성자로 와서 (#line 10) 명령문 수행
// &amp;gt;&amp;gt; &amp;quot;D&amp;quot; 출력

P p3 = new C(1, 2); //BE
// [1] 일단 인자 2개인 자식 생성자(#line 11)로 가서 부모 클래스를 명시적(super)으로 호출한 게 있나 확인
// [2] super가 있으면 해당하는 생성자를 호출(#line 4), 명령문 수행
// &amp;gt;&amp;gt; &amp;quot;B&amp;quot; 출력
// [3] 그리고 다시 인자 2개인 자식 생성자로 와서 (#line 11) 명령문 수행
// &amp;gt;&amp;gt; &amp;quot;E&amp;quot; 출력&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍP p = new C(); 뿐만 아니라 C c = new C(); 형태도 똑같이 작용
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  오버라이딩(메서드)&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-java&amp;quot;&amp;gt;class P &amp;amp;#123; // 부모 클래스 (#line 1)
  public void func1() &amp;amp;#123;
    System.out.print(&amp;quot;A&amp;quot;);
  &amp;amp;#125;

  public void func2() &amp;amp;#123;
    System.out.print(&amp;quot;B&amp;quot;);
  &amp;amp;#125;
&amp;amp;#125;

class C extends P &amp;amp;#123; // 자식 클래스 (#line 11)
  public void func1() &amp;amp;#123;
    System.out.print(&amp;quot;C&amp;quot;);
  &amp;amp;#125;

  public void func3() &amp;amp;#123;
    System.out.print(&amp;quot;D&amp;quot;);
  &amp;amp;#125;
&amp;amp;#125;

P p = new C();

p.func1();
// 부모와 자식한테 모두 func1() 있음
// -&amp;gt; 자식 메서드를 출력 (#line 12)
// &amp;gt;&amp;gt; &amp;quot;C&amp;quot; 출력

p.func2();
// 부모한테만 func2() 있음
// -&amp;gt; 부모 메서드를 출력 (#line 6)
// &amp;gt;&amp;gt; &amp;quot;B&amp;quot; 출력

p.func3();
// 자식한테만 func3() 있음
// &amp;gt;&amp;gt; 오류 출력
// &amp;amp;#8757; new C()를 했지만 형태는 부모 형태 P p = &amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍ부모 자식한테 메서드가 모두 있으면 자식 메서드를 출력
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  하이딩&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-java&amp;quot;&amp;gt;class P &amp;amp;#123; // 부모 클래스 (#line 1)
  public static void func1() &amp;amp;#123;
    System.out.print(&amp;quot;A&amp;quot;);
  &amp;amp;#125;
&amp;amp;#125;

class C extends P &amp;amp;#123; // 자식 클래스 (#line 7)
  public static void func1() &amp;amp;#123;
    System.out.print(&amp;quot;C&amp;quot;);
  &amp;amp;#125;
&amp;amp;#125;

P p = new C();
p.func1();
// static 일 때는 hiding이 되어서 부모 형태일 때는 자식 메서드가 아닌
// -&amp;gt; 부모 메서드를 출력 (line 2)
// &amp;gt;&amp;gt; &amp;quot;A&amp;quot; 출력

C c = new C();
p.func1();
// 자식 형태일 때는 
// -&amp;gt; 자식 메서드를 출력 (line 8)
// &amp;gt;&amp;gt; &amp;quot;C&amp;quot; 출력 &amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;static&amp;lt;/span&amp;gt; 키워드 &amp;lt;br&amp;gt;
ㆍ오버라이딩과는 다름
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  멤버변수&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-java&amp;quot;&amp;gt;class P &amp;amp;#123; // 부모 클래스 (#line 1)

  int a = 10;

  public void func1() &amp;amp;#123;
    System.out.print(a);
  &amp;amp;#125;

  public void func2() &amp;amp;#123;
    System.out.print(a);
  &amp;amp;#125;
&amp;amp;#125;

class C extends P &amp;amp;#123; // 자식 클래스 (#line 14)

  int a = 10;

  public void func1() &amp;amp;#123;
    System.out.print(a);
  &amp;amp;#125;
&amp;amp;#125;


P p = new C();

p.a = 20;
// [1] p 인스턴스는 P의 a도 C의 a도 갖고 있음
// [2] '나'랑 가까이 있는 것
// [3] -&amp;gt; 부모와 가까움
// &amp;amp;#8756; 부모의 a에 20이 들어감

p.func1();
// 오버라이딩이므로
// -&amp;gt; 자식 메서드 출력 (line 18)
// &amp;gt;&amp;gt; &amp;quot;10&amp;quot; 출력

p.func2();
// 부모만 해당 메서드가 있으므로 
// -&amp;gt; 부모 메서드를 출력 (line 5)
// &amp;gt;&amp;gt; &amp;quot;20&amp;quot; 출력 &amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍ'나'와 가까운 것
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  생성자 &amp;amp; 변수&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-java&amp;quot;&amp;gt;class P &amp;amp;#123; // 부모 클래스 (#line 1)

  int a = 10;

  public P() System.out.print(&amp;quot;가&amp;quot;);

  public P(int x) System.out.print(&amp;quot;나&amp;quot;);
&amp;amp;#125;

class C extends P &amp;amp;#123; // 자식 클래스 (#line 10)

  int a = 20;

  public C() System.out.print(&amp;quot;다&amp;quot;);

  public C(int x) System.out.print(&amp;quot;라&amp;quot;);
&amp;amp;#125;

C c = new C()
// [1] 자식 생성자(line 14)에서 super 있나 check
// [2] super가 없으니 부모 인자 없는 생성자(line 5) 호출
// &amp;gt;&amp;gt; '가' 출력
// [3] 다시 자식 생성자(line 14)로 ㄱㄱ
// &amp;gt;&amp;gt; '다' 출력

P p = new C(1);
// [1] 자식 생성자(line 16)에서 super 있나 check
// [2] super가 없으니 부모 인자 없는 생성자(line 5) 호출
// &amp;gt;&amp;gt; '가' 출력
// [3] 다시 자식 생성자(line 16)로 ㄱㄱ
// &amp;gt;&amp;gt; '라' 출력

c.a + p.a
// [1] c 인스턴스는 P의 a도 C의 a도 갖고 있음
// [2] c는 자식의 a와 가까움
// &amp;gt;&amp;gt; 20
// [3] p 인스턴스는 P의 a도 C의 a도 갖고 있음
// [4] p는 부모의 a와 가까움
// &amp;gt;&amp;gt; 10
// &amp;amp;#8756; 20 + 10 = 30 &amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍ'나'와 가까운 것
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  메서드 &amp;amp; 변수&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-java&amp;quot;&amp;gt;class P &amp;amp;#123; // 부모 클래스 (#line 1)

  int a = 3;

  public void addValue(int i) &amp;amp;#123;
    a = a + i;
    System.out.print(&amp;quot;P: &amp;quot; + a);
  &amp;amp;#125;

  public void addFive() &amp;amp;#123;
    a = a + 5;
    System.out.print(&amp;quot;P: &amp;quot; + a);
  &amp;amp;#125;
&amp;amp;#125;

class C extends P &amp;amp;#123; // 자식 클래스 (#line 16)

  int a = 8;

  public void addValue(double i) &amp;amp;#123;
    a = a + (int)i;
    System.out.print(&amp;quot;C: &amp;quot; + a);
  &amp;amp;#125;

  public void addFive() &amp;amp;#123;
    a = a + 5;
    System.out.print(&amp;quot;C: &amp;quot; + a);
  &amp;amp;#125;
&amp;amp;#125;

P p = new C()

p.addValue(1);
// [1] 인자가 정수이므로 부모 메서드 호출 (line 5)
// [2] a는 부모의 a와 더 가까움 (line 3)
// &amp;gt;&amp;gt; 'P: 4' 출력

p.addFive();
// [1] 오버라이딩이므로 자식 메서드 호출 (line 25)
// [2] a는 자식의 a와 더 가까움 (line 18)
// &amp;gt;&amp;gt; 'C: 13' 출력&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  생성자 변수의 유효범위 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-java&amp;quot;&amp;gt;class P &amp;amp;#123; // 부모 클래스 (#line 1)

  int a;

  public P (int a) this.a = a;

  public int get() return a;
&amp;amp;#125;

class C extends P &amp;amp;#123; // 자식 클래스 (#line 10)

  int a;

  public C (int a) &amp;amp;#123;
    super(2*a);
    this.a = a;
  &amp;amp;#125;

  public int get() return a;
&amp;amp;#125;

P p = new C(7);
// [1] super 키워드 확인을 위해 자식 생성자로 ㄱㄱ (line 14)
// [2] super가 있으므로 super(14)에 해당하는 생성자로 ㄱㄱ (line 5)
// 부모의 a 값은 14
// [3] 다시 자식 생성자로 와서 이후 코드 실행 (line 16)
// 자식의 a 값은 7

p.a;
// [1] p 인스턴스는 부모의 a도 자식의 a도 갖고 있음
// [2] a는 부모의 a와 더 가까움 (line 3)
// &amp;gt;&amp;gt; '14' 출력

p.get();
// [1] 오버라이딩이므로 자식 메서드 호출 (line 25)
// [2] a는 자식의 a와 더 가까움 (line 12)
// &amp;gt;&amp;gt; '7' 출력 &amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&quot;&gt;(5) P p = new C(); 형태의 상속 예제 문제&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;a href=&quot;https://youtu.be/GS9Cr--ymVE&quot;&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border: 1px solid #ddd; padding: 10px; border-radius: 8px; margin-bottom: 10px;&quot;&gt;
&lt;div&gt;
&lt;h4 style=&quot;margin: 0; font-size: 16px;&quot; data-ke-size=&quot;size20&quot;&gt;https://youtu.be/GS9Cr--ymVE&lt;/h4&gt;
&lt;p style=&quot;margin: 4px 0 0; font-size: 14px; color: #555;&quot; data-ke-size=&quot;size16&quot;&gt;흥달쌤 유튜브&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;br /&gt;  생성자&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;class P { // 부모 클래스 (#line 1)
  P() System.out.print(&quot;A&quot;); // 인자 없는 생성자

  P(int a) System.out.print(&quot;B&quot;);
}

class C extends P { // 자식 클래스 (#line 7)
  C() System.out.print(&quot;C&quot;); // 인자 없는 생성자

  C(int a) System.out.print(&quot;D&quot;);

  C(int a, int b) { // 인자 2개인 생성자
    System.out.print(&quot;E&quot;);
  }
}

P p1 = new C(); //AC
// [1] 일단 인자 없는 자식 생성자(#line 8)로 가서 부모 클래스를 명시적으로 호출한 게 있나 확인
// [2] super가 없으면 묵시적으로 부모의 인자 없는 생성자가 자동 호출(#line 2), 명령문 수행
// &amp;gt;&amp;gt; &quot;A&quot; 출력
// [3] 그리고 다시 인자 없는 자식 생성자로 와서 (#line 8) 명령문 수행
// &amp;gt;&amp;gt; &quot;C&quot; 출력

P p2 = new C(1); //AD
// [1] 일단 인자 1개인 자식 생성자(#line 10)로 가서 부모 클래스를 명시적(super)으로 호출한 게 있나 확인
// [2] super가 없으면 묵시적으로 부모의 인자 없는 생성자가 자동 호출(#line 2), 명령문 수행
// &amp;gt;&amp;gt; &quot;A&quot; 출력
// [3] 그리고 다시 인자 1개인 자식 생성자로 와서 (#line 10) 명령문 수행
// &amp;gt;&amp;gt; &quot;D&quot; 출력

P p3 = new C(1, 2); //BE
// [1] 일단 인자 2개인 자식 생성자(#line 11)로 가서 부모 클래스를 명시적(super)으로 호출한 게 있나 확인
// [2] super가 있으면 해당하는 생성자를 호출(#line 4), 명령문 수행
// &amp;gt;&amp;gt; &quot;B&quot; 출력
// [3] 그리고 다시 인자 2개인 자식 생성자로 와서 (#line 11) 명령문 수행
// &amp;gt;&amp;gt; &quot;E&quot; 출력&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍP p = new C(); 뿐만 아니라 C c = new C(); 형태도 똑같이 작용&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  오버라이딩(메서드)&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;class P { // 부모 클래스 (#line 1)
  public void func1() {
    System.out.print(&quot;A&quot;);
  }

  public void func2() {
    System.out.print(&quot;B&quot;);
  }
}

class C extends P { // 자식 클래스 (#line 11)
  public void func1() {
    System.out.print(&quot;C&quot;);
  }

  public void func3() {
    System.out.print(&quot;D&quot;);
  }
}

P p = new C();

p.func1();
// 부모와 자식한테 모두 func1() 있음
// -&amp;gt; 자식 메서드를 출력 (#line 12)
// &amp;gt;&amp;gt; &quot;C&quot; 출력

p.func2();
// 부모한테만 func2() 있음
// -&amp;gt; 부모 메서드를 출력 (#line 6)
// &amp;gt;&amp;gt; &quot;B&quot; 출력

p.func3();
// 자식한테만 func3() 있음
// &amp;gt;&amp;gt; 오류 출력
// ∵ new C()를 했지만 형태는 부모 형태 P p = &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ부모 자식한테 메서드가 모두 있으면 자식 메서드를 출력&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  하이딩&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;class P { // 부모 클래스 (#line 1)
  public static void func1() {
    System.out.print(&quot;A&quot;);
  }
}

class C extends P { // 자식 클래스 (#line 7)
  public static void func1() {
    System.out.print(&quot;C&quot;);
  }
}

P p = new C();
p.func1();
// static 일 때는 hiding이 되어서 부모 형태일 때는 자식 메서드가 아닌
// -&amp;gt; 부모 메서드를 출력 (line 2)
// &amp;gt;&amp;gt; &quot;A&quot; 출력

C c = new C();
p.func1();
// 자식 형태일 때는 
// -&amp;gt; 자식 메서드를 출력 (line 8)
// &amp;gt;&amp;gt; &quot;C&quot; 출력 &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ&lt;span style=&quot;color: red;&quot;&gt;static&lt;/span&gt; 키워드 &lt;br /&gt;ㆍ오버라이딩과는 다름&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  멤버변수&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;class P { // 부모 클래스 (#line 1)

  int a = 10;

  public void func1() {
    System.out.print(a);
  }

  public void func2() {
    System.out.print(a);
  }
}

class C extends P { // 자식 클래스 (#line 14)

  int a = 10;

  public void func1() {
    System.out.print(a);
  }
}


P p = new C();

p.a = 20;
// [1] p 인스턴스는 P의 a도 C의 a도 갖고 있음
// [2] '나'랑 가까이 있는 것
// [3] -&amp;gt; 부모와 가까움
// &amp;there4; 부모의 a에 20이 들어감

p.func1();
// 오버라이딩이므로
// -&amp;gt; 자식 메서드 출력 (line 18)
// &amp;gt;&amp;gt; &quot;10&quot; 출력

p.func2();
// 부모만 해당 메서드가 있으므로 
// -&amp;gt; 부모 메서드를 출력 (line 5)
// &amp;gt;&amp;gt; &quot;20&quot; 출력 &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ'나'와 가까운 것&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  생성자 &amp;amp; 변수&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;class P { // 부모 클래스 (#line 1)

  int a = 10;

  public P() System.out.print(&quot;가&quot;);

  public P(int x) System.out.print(&quot;나&quot;);
}

class C extends P { // 자식 클래스 (#line 10)

  int a = 20;

  public C() System.out.print(&quot;다&quot;);

  public C(int x) System.out.print(&quot;라&quot;);
}

C c = new C()
// [1] 자식 생성자(line 14)에서 super 있나 check
// [2] super가 없으니 부모 인자 없는 생성자(line 5) 호출
// &amp;gt;&amp;gt; '가' 출력
// [3] 다시 자식 생성자(line 14)로 ㄱㄱ
// &amp;gt;&amp;gt; '다' 출력

P p = new C(1);
// [1] 자식 생성자(line 16)에서 super 있나 check
// [2] super가 없으니 부모 인자 없는 생성자(line 5) 호출
// &amp;gt;&amp;gt; '가' 출력
// [3] 다시 자식 생성자(line 16)로 ㄱㄱ
// &amp;gt;&amp;gt; '라' 출력

c.a + p.a
// [1] c 인스턴스는 P의 a도 C의 a도 갖고 있음
// [2] c는 자식의 a와 가까움
// &amp;gt;&amp;gt; 20
// [3] p 인스턴스는 P의 a도 C의 a도 갖고 있음
// [4] p는 부모의 a와 가까움
// &amp;gt;&amp;gt; 10
// &amp;there4; 20 + 10 = 30 &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ'나'와 가까운 것&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  메서드 &amp;amp; 변수&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;class P { // 부모 클래스 (#line 1)

  int a = 3;

  public void addValue(int i) {
    a = a + i;
    System.out.print(&quot;P: &quot; + a);
  }

  public void addFive() {
    a = a + 5;
    System.out.print(&quot;P: &quot; + a);
  }
}

class C extends P { // 자식 클래스 (#line 16)

  int a = 8;

  public void addValue(double i) {
    a = a + (int)i;
    System.out.print(&quot;C: &quot; + a);
  }

  public void addFive() {
    a = a + 5;
    System.out.print(&quot;C: &quot; + a);
  }
}

P p = new C()

p.addValue(1);
// [1] 인자가 정수이므로 부모 메서드 호출 (line 5)
// [2] a는 부모의 a와 더 가까움 (line 3)
// &amp;gt;&amp;gt; 'P: 4' 출력

p.addFive();
// [1] 오버라이딩이므로 자식 메서드 호출 (line 25)
// [2] a는 자식의 a와 더 가까움 (line 18)
// &amp;gt;&amp;gt; 'C: 13' 출력&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  생성자 변수의 유효범위 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;class P { // 부모 클래스 (#line 1)

  int a;

  public P (int a) this.a = a;

  public int get() return a;
}

class C extends P { // 자식 클래스 (#line 10)

  int a;

  public C (int a) {
    super(2*a);
    this.a = a;
  }

  public int get() return a;
}

P p = new C(7);
// [1] super 키워드 확인을 위해 자식 생성자로 ㄱㄱ (line 14)
// [2] super가 있으므로 super(14)에 해당하는 생성자로 ㄱㄱ (line 5)
// 부모의 a 값은 14
// [3] 다시 자식 생성자로 와서 이후 코드 실행 (line 16)
// 자식의 a 값은 7

p.a;
// [1] p 인스턴스는 부모의 a도 자식의 a도 갖고 있음
// [2] a는 부모의 a와 더 가까움 (line 3)
// &amp;gt;&amp;gt; '14' 출력

p.get();
// [1] 오버라이딩이므로 자식 메서드 호출 (line 25)
// [2] a는 자식의 a와 더 가까움 (line 12)
// &amp;gt;&amp;gt; '7' 출력 &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06_상속예제.png&quot; data-origin-width=&quot;2638&quot; data-origin-height=&quot;2598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LUQcg/dJMcagLJBl5/mWVtnDKquuRLVY8lfWMrJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LUQcg/dJMcagLJBl5/mWVtnDKquuRLVY8lfWMrJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LUQcg/dJMcagLJBl5/mWVtnDKquuRLVY8lfWMrJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLUQcg%2FdJMcagLJBl5%2FmWVtnDKquuRLVY8lfWMrJK%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;492&quot; data-filename=&quot;06_상속예제.png&quot; data-origin-width=&quot;2638&quot; data-origin-height=&quot;2598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>자격증/정보처리기사 - 실기</category>
      <category>Java</category>
      <category>메서드</category>
      <category>변수</category>
      <category>상속</category>
      <category>생성자</category>
      <category>자바</category>
      <category>자바상속</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/45</guid>
      <comments>https://rodesi.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 29 Mar 2026 12:04:29 +0900</pubDate>
    </item>
    <item>
      <title>[정처기 실기] 6. 프로그래밍 언어 활용 요약 - JAVA1</title>
      <link>https://rodesi.tistory.com/44</link>
      <description>&lt;div id=&quot;code_1774447741471&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!-- 목록 --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight:bold; font-size: 18px;&amp;quot;&amp;gt;
☰ &amp;amp;nbsp; 정보처리기사 실기 &amp;amp;nbsp; &amp;lt;/span&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

&amp;lt;div style=&amp;quot;display: inline-block; align-items: center; 
border-radius: 8px; padding: 10px; background-color: #ccc;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;

  &amp;lt;ul style=&amp;quot;margin: 0; padding: 0; list-style-position: inside; gap: 16px;&amp;quot;&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/13&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅰ. 요구사항 확인 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/41&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅵ. 프로그래밍 언어 활용 - 프로그래밍을 위한 기본 사항, C언어1 (~ 반복문)
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/43&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅵ. 프로그래밍 언어 활용 - C언어2 (배열 ~)
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;


    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/44&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅵ. 프로그래밍 언어 활용 - JAVA (~ 메서드)
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

  &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;font-size: 24px; font-weight: bold;&amp;quot;&amp;gt;
  Ⅵ. 프로그래밍 언어 활용
&amp;lt;/div&amp;gt;

&amp;lt;!-- chapter03 --&amp;gt;
&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;border-left:4px solid; padding-left:12px; margin:16px 0; font-size: 24px; font-weight: bold;&amp;quot;&amp;gt;
  03. JAVA
&amp;lt;/div&amp;gt;


&amp;lt;!-- 1 --&amp;gt;
&amp;lt;h3&amp;gt; 0️⃣ 자바 기본 구조&amp;lt;/h3&amp;gt;
ㆍ클래스 단위 &amp;lt;br&amp;gt;
ㆍ프로그램은 public static void main부터 시작
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 2 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 1️⃣ 자료형(Data Type)&amp;lt;/h3&amp;gt;

(1) 자료형 유형 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ문자형 - char &amp;lt;br&amp;gt;
ㆍ문자열형 - String &amp;lt;br&amp;gt;
ㆍ정수형 - byte, short, int, lond (순서대로 1, 2, 4, 8 byte 크기) &amp;lt;br&amp;gt;
ㆍ부동 소수점형 - float, double &amp;lt;br&amp;gt;
ㆍ논리형 - boolean
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 3 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 2️⃣ 변수(Variable)&amp;lt;/h3&amp;gt;
(1) 변수 개념 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ어떠한 값을 주기억 장치에 기억하기 위한 공간 &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) 변수 유효범위 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  전역 변수(Global Variable) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ클래스 블록에 선언 &amp;lt;br&amp;gt;
ㆍ생성 - 클래스 시작 &amp;lt;br&amp;gt;
ㆍ종료 - 클래스 종료 &amp;lt;br&amp;gt;
ㆍ초기화 안 할 시 -&amp;gt; 정수 = 0, 실수 = 0.0, 문자 = NULL 로 자동 초기화
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  지역 변수(Local Variable) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ블록 내에서 선언 &amp;lt;br&amp;gt;  
ㆍ선언 - 블록이 시작하는 부분 &amp;lt;br&amp;gt;
ㆍ종료 - 중괄호가 닫히는 시점 &amp;lt;br&amp;gt;
ㆍ해당 블록 내에서만 사용 가능
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  static 변수(Static Variable) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍstatic 키워드와 선언 &amp;lt;br&amp;gt;  
ㆍ생성 - 프로그램 시작 &amp;lt;br&amp;gt;
ㆍ종료 - 프로그램 종료 &amp;lt;br&amp;gt;
ㆍstatic int count = 0; // 초기화 한 번만 실행 &amp;lt;br&amp;gt;
ㆍ객체 생성 없이도 메서드 사용 가능
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 4 --&amp;gt;
&amp;lt;h3&amp;gt; 3️⃣ 배열(Array)&amp;lt;/h3&amp;gt;
(1) 배열 개념 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ같은 타입 변수들의 집합
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) 배열 선언 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  1차원 배열 선언&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ초기값 X - 정수 0, 실수 0.0, 문자열 NULL로 저장
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;자료형 []배열명 = new 자료형[요소개수];
자료형 배열명[] = new 자료형[요소개수];&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

ㆍ초기값 O
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;자료형 []배열명 = new 자료형[요소개수];
자료형 배열명[] = &amp;amp;#123; 초기값1, 초기값2, ... &amp;amp;#125;;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  2차원 배열&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ초기값 X - 정수 0, 실수 0.0, 문자열 NULL로 저장
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;자료형 [][]배열명 = new 자료형[행][열];
자료형 배열명[][] = new 자료형[행][열];&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

ㆍ초기값 O
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;자료형 []배열명 = new 자료형[요소개수];
자료형 [][]배열명 = &amp;amp;#123; &amp;amp;#123;초기값1, 초기값2, ...&amp;amp;#125;, &amp;amp;#123;초기값a, 초기값b, ...&amp;amp;#125;, &amp;amp;#123;초기값ㄱ, 초기값ㄴ, ...&amp;amp;#125; &amp;amp;#125;;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 5 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt;4️⃣ 표준 입출력 함수&amp;lt;/h3&amp;gt;
(1) 표준 출력 함수 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;table style=&amp;quot;border-collapse:collapse;&amp;quot;&amp;gt;
&amp;lt;tr&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding:1px;&amp;quot;&amp;gt;System.out&amp;lt;/td&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding:1px;&amp;quot;&amp;gt;.print();&amp;lt;/td&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding-left:10px;&amp;quot;&amp;gt;// 개행(enter, next line)을 하지 않음&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding:1px;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding:1px;&amp;quot;&amp;gt;.println();&amp;lt;/td&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding-left:10px;&amp;quot;&amp;gt;// 개행을 함&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding:1px;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding:1px;&amp;quot;&amp;gt;.printf();&amp;lt;/td&amp;gt;
  &amp;lt;td style=&amp;quot;border:none; padding-left:10px;&amp;quot;&amp;gt;// 변수 출력 가능 (like C언어)&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) 표준 입력 함수 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
System.in.readLine(); &amp;amp;ensp;// BufferReader와 함께 사용
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 6 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 5️⃣ 연산자(Operator)&amp;lt;/h3&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ문자열 + 문자열/정수/실수 = 문자열 &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;&amp;quot;5 + 2 = &amp;quot; + 3 + 4  // 3, 4가 모두 문자열이 되어서 5 + 2 = 34가 출력
5 + 2 + &amp;quot;= 3 + 4&amp;quot;  // 5, 2는 연산을 하고 문자열이 출력되어 7 = 3 + 4가 출력
&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(1) 연산자 종류 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ증감 연산자 &amp;amp;ensp; ++&amp;amp;ensp;-- &amp;lt;br&amp;gt;
ㆍ산술 &amp;amp;ensp; +&amp;amp;ensp;-&amp;amp;ensp;*&amp;amp;ensp;/&amp;amp;ensp;% &amp;lt;br&amp;gt;
ㆍ시프트 &amp;amp;ensp; &amp;lt;&amp;lt;&amp;amp;ensp;&amp;gt;&amp;gt; &amp;lt;br&amp;gt;
ㆍ관계 &amp;amp;ensp; &amp;gt;&amp;amp;ensp;&amp;lt;&amp;amp;ensp;&amp;gt;=&amp;amp;ensp;&amp;lt;=&amp;amp;ensp;==&amp;amp;ensp;!=&amp;lt;br&amp;gt;
ㆍ비트 &amp;amp;ensp; &amp;amp;&amp;amp;ensp;|&amp;amp;ensp;^(XOR)&amp;amp;ensp;~ &amp;lt;br&amp;gt;
ㆍ논리 &amp;amp;ensp; &amp;amp;&amp;amp;&amp;amp;ensp;||&amp;amp;ensp;! &amp;lt;br&amp;gt;
ㆍ삼항 &amp;amp;ensp; (조건식) ? (참) : (거짓)&amp;lt;br&amp;gt;
ㆍ대입 &amp;amp;ensp;=&amp;amp;ensp;+=&amp;amp;ensp;-=&amp;amp;ensp;*=&amp;amp;ensp;/=&amp;amp;ensp;%= &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) 연산자 우선순위 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold; background-color: #eee; font-size: 20px; padding: 5px;&amp;quot;&amp;gt;증감 산술 시프트 관계 비트 논리 삼항 대입&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;
1.&amp;amp;ensp;x++&amp;amp;ensp;x-- &amp;lt;br&amp;gt;
2.&amp;amp;ensp;++x&amp;amp;ensp;--x  &amp;lt;br&amp;gt;
&amp;amp;emsp;! &amp;lt;br&amp;gt;
&amp;amp;emsp;~ &amp;lt;br&amp;gt;
3.&amp;amp;ensp;*&amp;amp;ensp;/&amp;amp;ensp;%&amp;lt;br&amp;gt;
4.&amp;amp;ensp;+&amp;amp;ensp;-&amp;lt;br&amp;gt;
5.&amp;amp;ensp;&amp;lt;&amp;lt;&amp;amp;ensp;&amp;gt;&amp;gt;&amp;lt;br&amp;gt;

6.&amp;amp;ensp;&amp;lt;&amp;amp;ensp;&amp;lt;=&amp;amp;ensp;&amp;gt;&amp;amp;ensp;&amp;gt;=&amp;lt;br&amp;gt;
7.&amp;amp;ensp;==&amp;amp;ensp;!=&amp;lt;br&amp;gt;
8.&amp;amp;ensp;&amp;amp;&amp;lt;br&amp;gt;
9.&amp;amp;ensp;^&amp;lt;br&amp;gt;
10.&amp;amp;ensp;|&amp;lt;br&amp;gt;

11.&amp;amp;ensp;&amp;amp;&amp;amp;&amp;lt;br&amp;gt;
12.&amp;amp;ensp;||&amp;lt;br&amp;gt;
13.&amp;amp;ensp;(조건식) ? (참) : (거짓)&amp;lt;br&amp;gt;
14.&amp;amp;ensp;=&amp;amp;ensp;+=&amp;amp;ensp;-=&amp;amp;ensp;*=&amp;amp;ensp;/=&amp;amp;ensp;%= &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(3) 연산자 상세 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  증감 연산자 (Incremenmt &amp;amp; Decrement Operator) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;x++&amp;amp;ensp;&amp;lt;/span&amp;gt; vs. &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;&amp;amp;ensp;++x&amp;lt;/span&amp;gt; 차이점 &amp;lt;br&amp;gt;
ㆍx++&amp;amp;ensp;/&amp;amp;ensp;x-- : 변수 값 사용 -&amp;gt; 값을 1 증가/감소 &amp;lt;br&amp;gt;
ㆍ++x&amp;amp;ensp;/&amp;amp;ensp;--x : 값을 1 증가/감소 -&amp;gt; 변수 값 사용
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  산술 연산자&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;/ (나누기 연산)&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;
ㆍ정수 / 정수 = 정수&amp;lt;br&amp;gt;
ㆍ정수 / 실수 = 실수&amp;lt;br&amp;gt;
ㆍ실수 / 정수 = 실수&amp;lt;br&amp;gt;
ㆍ실수 / 실수 = 실수&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;% (나머지 연산)&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;
ㆍ정수끼리만 사용
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  시프트 연산자 (Shift Operator) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍa&amp;amp;ensp;&amp;lt;&amp;lt;&amp;amp;ensp;b:&amp;amp;ensp;a * 2&amp;lt;sup&amp;gt;b&amp;lt;/sup&amp;gt; &amp;lt;br&amp;gt;
ㆍa&amp;amp;ensp;&amp;gt;&amp;gt;&amp;amp;ensp;b:&amp;amp;ensp;a / 2&amp;lt;sup&amp;gt;b&amp;lt;/sup&amp;gt; &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  비트 연산자 (Bit Operator) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ&amp;amp; : AND 연산자. 모두 1이면 1, 하나라도 0이면 0&amp;lt;br&amp;gt;
ㆍ| : OR 연산자. 하나라도 1이면 1, 모두 0이면 0&amp;lt;br&amp;gt;
ㆍ^ : XOR 연산자. 서로 다르면 1, 같으면 0&amp;lt;br&amp;gt;
ㆍ~ : NOT 연산자. 0 &amp;harr; 1. 0이면 1, 1이면 0&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  논리 연산자 (Logic Operator) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ&amp;amp;&amp;amp; : AND 연산자. 모두 True면 True, 하나라도 Fasle면 False&amp;lt;br&amp;gt;
ㆍ|| : OR 연산자. 하나라도 True면 True, 모두 Fasle면 Fasle&amp;lt;br&amp;gt;
ㆍ! : NOT 연산자. False &amp;harr; True. False면 True, True면 False&amp;lt;br&amp;gt;
ㆍcf : 참이면 1, 거짓이면 0을 반환
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 7 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 6️⃣ 조건문&amp;lt;/h3&amp;gt;
(1) if 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ조건의 참 거짓 여부에 따라 경로 선택&amp;lt;br&amp;gt;
ㆍ코드 한 줄일 경우, 중괄호 생략 가능&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) switch 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ여러 개의 경로 중 하나의 경로 선택&amp;lt;br&amp;gt;
ㆍ경우와 일치하는 case 문 실행&amp;lt;br&amp;gt;
ㆍ경우와 일치하는 case 없으면 default 실행&amp;lt;br&amp;gt;
ㆍbreak 만날 때 까지 계속 실행 (break 없으면 모든 case, default 까지 실행됨)&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 8 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 7️⃣ 반복문&amp;lt;/h3&amp;gt;
(1) while 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;while(조건문)&amp;amp;#123;
  명령문;
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍ조건문이 참일 동안 명령문 반복 수행
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) do while 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;do&amp;amp;#123;
  명령문;
&amp;amp;#125; while(조건문)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍ조건문의 참 거짓 여부에 관련 없이 무조건 반복문 한 번 수행 &amp;lt;br&amp;gt;
ㆍ이후 조건문이 참일 동안 명령문 반복 수행
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(3) for 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;for(초기식; 조건식; 증감식)&amp;amp;#123;
  명령문;
&amp;amp;#125;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br&amp;gt;
ㆍ조건식이 참일 경우 명령문 수행 &amp;lt;br&amp;gt;
ㆍ증감식으로 값 변경, 조건식 참일 경우 명령문 수행 과정을 반복
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(4) for each 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;for( 제어변수 : 배열 ) &amp;amp;#123;
  명령문;
&amp;amp;#125;

String[] grade = &amp;amp;#123; A, B, C &amp;amp;#125;;
for( String g : grade ) &amp;amp;#123;
  System.out.print(g); // 결과: ABC
&amp;amp;#125;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br&amp;gt;
ㆍ배열, 리스트 크기만큼 반복 &amp;lt;br&amp;gt;
ㆍ배열, 리스트 항목을 순차적으로 변수에 대입 &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 9 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 8️⃣ 메서드&amp;lt;/h3&amp;gt;
(1) 사용자 정의 함수(메서드) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ사용자가 직접 새로운 함수 정의 &amp;lt;br&amp;gt;
ㆍ매개변수, 생성된 변수 -&amp;gt; 사용자 정의 함수 종료되면 없어짐
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) static 메서드 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ클래스가 메모리에 올라갈 때 -&amp;gt; 자동으로 생성됨 &amp;lt;br&amp;gt;
ㆍ인스턴스 생성 X -&amp;gt; 메서드 호출 가능
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&quot;&gt;&lt;!-- 목록 --&gt; &lt;span style=&quot;font-weight: bold; font-size: 18px;&quot;&gt; ☰ &amp;nbsp; 정보처리기사 실기 &amp;nbsp; &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border-radius: 8px; padding: 10px; background-color: #ccc;&quot;&gt;
&lt;div style=&quot;display: inline-block;&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/13&quot;&gt; Ⅰ. 요구사항 확인 &lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/41&quot;&gt; Ⅵ. 프로그래밍 언어 활용 - 프로그래밍을 위한 기본 사항, C언어1 (~ 반복문) &lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/43&quot;&gt; Ⅵ. 프로그래밍 언어 활용 - C언어2 (배열 ~) &lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/44&quot;&gt; Ⅵ. 프로그래밍 언어 활용 - JAVA (~ 메서드) &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;font-size: 24px; font-weight: bold;&quot;&gt;Ⅵ. 프로그래밍 언어 활용&lt;/div&gt;
&lt;!-- chapter03 --&gt; &lt;br /&gt;
&lt;div style=&quot;border-left: 4px solid; padding-left: 12px; margin: 16px 0; font-size: 24px; font-weight: bold;&quot;&gt;03. JAVA&lt;/div&gt;
&lt;!-- 1 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0️⃣ 자바 기본 구조&lt;/h3&gt;
ㆍ클래스 단위 &lt;br /&gt;ㆍ프로그램은 public static void main부터 시작 &lt;br /&gt;&lt;br /&gt;&lt;!-- 2 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 자료형(Data Type)&lt;/h3&gt;
(1) 자료형 유형 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ문자형 - char &lt;br /&gt;ㆍ문자열형 - String &lt;br /&gt;ㆍ정수형 - byte, short, int, lond (순서대로 1, 2, 4, 8 byte 크기) &lt;br /&gt;ㆍ부동 소수점형 - float, double &lt;br /&gt;ㆍ논리형 - boolean&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 3 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 변수(Variable)&lt;/h3&gt;
(1) 변수 개념 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ어떠한 값을 주기억 장치에 기억하기 위한 공간 &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 변수 유효범위 &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  전역 변수(Global Variable) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ클래스 블록에 선언 &lt;br /&gt;ㆍ생성 - 클래스 시작 &lt;br /&gt;ㆍ종료 - 클래스 종료 &lt;br /&gt;ㆍ초기화 안 할 시 -&amp;gt; 정수 = 0, 실수 = 0.0, 문자 = NULL 로 자동 초기화&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  지역 변수(Local Variable) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ블록 내에서 선언 &lt;br /&gt;ㆍ선언 - 블록이 시작하는 부분 &lt;br /&gt;ㆍ종료 - 중괄호가 닫히는 시점 &lt;br /&gt;ㆍ해당 블록 내에서만 사용 가능&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  static 변수(Static Variable) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍstatic 키워드와 선언 &lt;br /&gt;ㆍ생성 - 프로그램 시작 &lt;br /&gt;ㆍ종료 - 프로그램 종료 &lt;br /&gt;ㆍstatic int count = 0; // 초기화 한 번만 실행 &lt;br /&gt;ㆍ객체 생성 없이도 메서드 사용 가능&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 4 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 배열(Array)&lt;/h3&gt;
(1) 배열 개념 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ같은 타입 변수들의 집합&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 배열 선언 &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  1차원 배열 선언&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ초기값 X - 정수 0, 실수 0.0, 문자열 NULL로 저장
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;자료형 []배열명 = new 자료형[요소개수];
자료형 배열명[] = new 자료형[요소개수];&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ초기값 O
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;자료형 []배열명 = new 자료형[요소개수];
자료형 배열명[] = { 초기값1, 초기값2, ... };&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  2차원 배열&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ초기값 X - 정수 0, 실수 0.0, 문자열 NULL로 저장
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;자료형 [][]배열명 = new 자료형[행][열];
자료형 배열명[][] = new 자료형[행][열];&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ초기값 O
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;자료형 []배열명 = new 자료형[요소개수];
자료형 [][]배열명 = { {초기값1, 초기값2, ...}, {초기값a, 초기값b, ...}, {초기값ㄱ, 초기값ㄴ, ...} };&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 5 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ 표준 입출력 함수&lt;/h3&gt;
(1) 표준 출력 함수 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 1px;&quot;&gt;System.out&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 1px;&quot;&gt;.print();&lt;/td&gt;
&lt;td style=&quot;border: none; padding-left: 10px;&quot;&gt;// 개행(enter, next line)을 하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 1px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 1px;&quot;&gt;.println();&lt;/td&gt;
&lt;td style=&quot;border: none; padding-left: 10px;&quot;&gt;// 개행을 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 1px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 1px;&quot;&gt;.printf();&lt;/td&gt;
&lt;td style=&quot;border: none; padding-left: 10px;&quot;&gt;// 변수 출력 가능 (like C언어)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 표준 입력 함수 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;System.in.readLine(); &amp;ensp;// BufferReader와 함께 사용&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 6 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5️⃣ 연산자(Operator)&lt;/h3&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ문자열 + 문자열/정수/실수 = 문자열 &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&quot;5 + 2 = &quot; + 3 + 4  // 3, 4가 모두 문자열이 되어서 5 + 2 = 34가 출력
5 + 2 + &quot;= 3 + 4&quot;  // 5, 2는 연산을 하고 문자열이 출력되어 7 = 3 + 4가 출력
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(1) 연산자 종류 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ증감 연산자 &amp;ensp; ++&amp;ensp;-- &lt;br /&gt;ㆍ산술 &amp;ensp; +&amp;ensp;-&amp;ensp;*&amp;ensp;/&amp;ensp;% &lt;br /&gt;ㆍ시프트 &amp;ensp; &amp;lt;&amp;lt;&amp;ensp;&amp;gt;&amp;gt; &lt;br /&gt;ㆍ관계 &amp;ensp; &amp;gt;&amp;ensp;&amp;lt;&amp;ensp;&amp;gt;=&amp;ensp;&amp;lt;=&amp;ensp;==&amp;ensp;!=&lt;br /&gt;ㆍ비트 &amp;ensp; &amp;amp;&amp;ensp;|&amp;ensp;^(XOR)&amp;ensp;~ &lt;br /&gt;ㆍ논리 &amp;ensp; &amp;amp;&amp;amp;&amp;ensp;||&amp;ensp;! &lt;br /&gt;ㆍ삼항 &amp;ensp; (조건식) ? (참) : (거짓)&lt;br /&gt;ㆍ대입 &amp;ensp;=&amp;ensp;+=&amp;ensp;-=&amp;ensp;*=&amp;ensp;/=&amp;ensp;%= &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 연산자 우선순위 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-weight: bold; background-color: #eee; font-size: 20px; padding: 5px;&quot;&gt;증감 산술 시프트 관계 비트 논리 삼항 대입&lt;/span&gt; &lt;br /&gt;1.&amp;ensp;x++&amp;ensp;x-- &lt;br /&gt;2.&amp;ensp;++x&amp;ensp;--x &lt;br /&gt;&amp;emsp;! &lt;br /&gt;&amp;emsp;~ &lt;br /&gt;3.&amp;ensp;*&amp;ensp;/&amp;ensp;%&lt;br /&gt;4.&amp;ensp;+&amp;ensp;-&lt;br /&gt;5.&amp;ensp;&amp;lt;&amp;lt;&amp;ensp;&amp;gt;&amp;gt;&lt;br /&gt;6.&amp;ensp;&amp;lt;&amp;ensp;&amp;lt;=&amp;ensp;&amp;gt;&amp;ensp;&amp;gt;=&lt;br /&gt;7.&amp;ensp;==&amp;ensp;!=&lt;br /&gt;8.&amp;ensp;&amp;amp;&lt;br /&gt;9.&amp;ensp;^&lt;br /&gt;10.&amp;ensp;|&lt;br /&gt;11.&amp;ensp;&amp;amp;&amp;amp;&lt;br /&gt;12.&amp;ensp;||&lt;br /&gt;13.&amp;ensp;(조건식) ? (참) : (거짓)&lt;br /&gt;14.&amp;ensp;=&amp;ensp;+=&amp;ensp;-=&amp;ensp;*=&amp;ensp;/=&amp;ensp;%= &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(3) 연산자 상세 &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  증감 연산자 (Incremenmt &amp;amp; Decrement Operator) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;x++&amp;ensp;&lt;/span&gt; vs. &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;ensp;++x&lt;/span&gt; 차이점 &lt;br /&gt;ㆍx++&amp;ensp;/&amp;ensp;x-- : 변수 값 사용 -&amp;gt; 값을 1 증가/감소 &lt;br /&gt;ㆍ++x&amp;ensp;/&amp;ensp;--x : 값을 1 증가/감소 -&amp;gt; 변수 값 사용&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  산술 연산자&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;/ (나누기 연산)&lt;/span&gt; &lt;br /&gt;ㆍ정수 / 정수 = 정수&lt;br /&gt;ㆍ정수 / 실수 = 실수&lt;br /&gt;ㆍ실수 / 정수 = 실수&lt;br /&gt;ㆍ실수 / 실수 = 실수&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;% (나머지 연산)&lt;/span&gt; &lt;br /&gt;ㆍ정수끼리만 사용&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  시프트 연산자 (Shift Operator) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍa&amp;ensp;&amp;lt;&amp;lt;&amp;ensp;b:&amp;ensp;a * 2&lt;sup&gt;b&lt;/sup&gt; &lt;br /&gt;ㆍa&amp;ensp;&amp;gt;&amp;gt;&amp;ensp;b:&amp;ensp;a / 2&lt;sup&gt;b&lt;/sup&gt; &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  비트 연산자 (Bit Operator) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ&amp;amp; : AND 연산자. 모두 1이면 1, 하나라도 0이면 0&lt;br /&gt;ㆍ| : OR 연산자. 하나라도 1이면 1, 모두 0이면 0&lt;br /&gt;ㆍ^ : XOR 연산자. 서로 다르면 1, 같으면 0&lt;br /&gt;ㆍ~ : NOT 연산자. 0 &amp;harr; 1. 0이면 1, 1이면 0&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  논리 연산자 (Logic Operator) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ&amp;amp;&amp;amp; : AND 연산자. 모두 True면 True, 하나라도 Fasle면 False&lt;br /&gt;ㆍ|| : OR 연산자. 하나라도 True면 True, 모두 Fasle면 Fasle&lt;br /&gt;ㆍ! : NOT 연산자. False &amp;harr; True. False면 True, True면 False&lt;br /&gt;ㆍcf : 참이면 1, 거짓이면 0을 반환&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 7 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6️⃣ 조건문&lt;/h3&gt;
(1) if 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ조건의 참 거짓 여부에 따라 경로 선택&lt;br /&gt;ㆍ코드 한 줄일 경우, 중괄호 생략 가능&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) switch 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ여러 개의 경로 중 하나의 경로 선택&lt;br /&gt;ㆍ경우와 일치하는 case 문 실행&lt;br /&gt;ㆍ경우와 일치하는 case 없으면 default 실행&lt;br /&gt;ㆍbreak 만날 때 까지 계속 실행 (break 없으면 모든 case, default 까지 실행됨)&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 8 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7️⃣ 반복문&lt;/h3&gt;
(1) while 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;while(조건문){
  명령문;
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ조건문이 참일 동안 명령문 반복 수행&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) do while 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;do{
  명령문;
} while(조건문)&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ조건문의 참 거짓 여부에 관련 없이 무조건 반복문 한 번 수행 &lt;br /&gt;ㆍ이후 조건문이 참일 동안 명령문 반복 수행&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(3) for 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;for(초기식; 조건식; 증감식){
  명령문;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ조건식이 참일 경우 명령문 수행 &lt;br /&gt;ㆍ증감식으로 값 변경, 조건식 참일 경우 명령문 수행 과정을 반복&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(4) for each 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;for( 제어변수 : 배열 ) {
  명령문;
}

String[] grade = { A, B, C };
for( String g : grade ) {
  System.out.print(g); // 결과: ABC
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ배열, 리스트 크기만큼 반복 &lt;br /&gt;ㆍ배열, 리스트 항목을 순차적으로 변수에 대입 &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 9 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8️⃣ 메서드&lt;/h3&gt;
(1) 사용자 정의 함수(메서드) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ사용자가 직접 새로운 함수 정의 &lt;br /&gt;ㆍ매개변수, 생성된 변수 -&amp;gt; 사용자 정의 함수 종료되면 없어짐&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) static 메서드 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ클래스가 메모리에 올라갈 때 -&amp;gt; 자동으로 생성됨 &lt;br /&gt;ㆍ인스턴스 생성 X -&amp;gt; 메서드 호출 가능&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06_JAVA.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mpCF7/dJMcadahLVu/fmMrIbR3xt14Bow2dCVqwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mpCF7/dJMcadahLVu/fmMrIbR3xt14Bow2dCVqwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mpCF7/dJMcadahLVu/fmMrIbR3xt14Bow2dCVqwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmpCF7%2FdJMcadahLVu%2FfmMrIbR3xt14Bow2dCVqwK%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;506&quot; data-filename=&quot;06_JAVA.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>자격증/정보처리기사 - 실기</category>
      <category>메서드</category>
      <category>반복문</category>
      <category>배열</category>
      <category>연산자</category>
      <category>정보처리기사</category>
      <category>정보처리기사실기</category>
      <category>정처기</category>
      <category>정처기실기</category>
      <category>조건문</category>
      <category>표준입출력함수</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/44</guid>
      <comments>https://rodesi.tistory.com/44#entry44comment</comments>
      <pubDate>Fri, 27 Mar 2026 15:10:35 +0900</pubDate>
    </item>
    <item>
      <title>[정처기 실기] 6. 프로그래밍 언어 활용 요약 - C언어2</title>
      <link>https://rodesi.tistory.com/43</link>
      <description>&lt;div id=&quot;code_1774274516879&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!-- 목록 --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight:bold; font-size: 18px;&amp;quot;&amp;gt;
☰ &amp;amp;nbsp; 정보처리기사 실기 &amp;amp;nbsp; &amp;lt;/span&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

&amp;lt;div style=&amp;quot;display: inline-block; align-items: center; 
border-radius: 8px; padding: 10px; background-color: #ccc;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;

  &amp;lt;ul style=&amp;quot;margin: 0; padding: 0; list-style-position: inside; gap: 16px;&amp;quot;&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/13&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅰ. 요구사항 확인 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/41&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅵ. 프로그래밍 언어 활용 - 프로그래밍을 위한 기본 사항, C언어1 (~ 반복문)
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/43&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅵ. 프로그래밍 언어 활용 - C언어2 (배열 ~)
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

  &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;font-size: 24px; font-weight: bold;&amp;quot;&amp;gt;
  Ⅵ. 프로그래밍 언어 활용
&amp;lt;/div&amp;gt;

&amp;lt;!-- chapter02 --&amp;gt;
&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;border-left:4px solid; padding-left:12px; margin:16px 0; font-size: 24px; font-weight: bold;&amp;quot;&amp;gt;
  02. C언어
&amp;lt;/div&amp;gt;


&amp;lt;!-- 9 --&amp;gt;
&amp;lt;h3&amp;gt; 1️⃣ 배열&amp;lt;/h3&amp;gt;
(1) 배열 종류 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  1차원 배열&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;int a[3] = &amp;amp;#123;1,2&amp;amp;#125; // a[2]는 0으로 초기화
float b[3] = &amp;amp;#123;1.1, 1.2&amp;amp;#125; // b[2]은 0.0으로 초기화
char c[8] = &amp;quot;Hello&amp;quot;; // 나머지는 NULL 로 초기화&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  2차원 배열&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;int a[2][3] = &amp;amp;#123;1,2,3,4&amp;amp;#125; // a[2]는 0으로 초기화&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;table style=&amp;quot;width:50%; border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;3&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;4&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;char b[2][8] = &amp;amp;#123;&amp;quot;Hello&amp;quot;, &amp;quot;computer&amp;quot;&amp;amp;#125;; // 나머지는 NULL 로 초기화&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;table style=&amp;quot;width:50%; border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;H&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;e&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;l&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;l&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;o&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;NULL&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;NULL&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;NULL&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;c&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;o&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;m&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;p&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;u&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;t&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;e&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;r&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


&amp;lt;!-- 10 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 2️⃣ 문자열&amp;lt;/h3&amp;gt;
(1) 1차원 배열과 문자열 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍchar 형 배열로 표현 &amp;lt;br&amp;gt;
ㆍ초기화 할 때 마지막에 NULL 문자 삽입&amp;lt;br&amp;gt;
ㆍprintf(&amp;quot;%s&amp;quot;)시 NULL 직전까지 읽어서 출력&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

cf) 문자열과 주소 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;int a[5]&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;
ㆍ&amp;amp;a[0] &amp;lt;=&amp;gt; a &amp;lt;=&amp;gt; a의 0번째 주소 &amp;lt;br&amp;gt;
ㆍ&amp;amp;a[3] &amp;lt;=&amp;gt; a + 3 &amp;lt;=&amp;gt; a의 3번째 주소 &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

(2) 2차원 배열과 문자열 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍchar 형 2차원 배열을 사용 &amp;lt;br&amp;gt;
ㆍ&amp;amp;a[0][0] &amp;lt;=&amp;gt; a[0] &amp;lt;=&amp;gt; a의 0번째 행, 0번째 열의 주소 &amp;lt;br&amp;gt;
ㆍ&amp;amp;a[1][2] &amp;lt;=&amp;gt; a[1] + 2 &amp;lt;=&amp;gt; a의 1번째 행, 2번째 열의 주소 &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 11 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 3️⃣ 구조체(Structure Type)&amp;lt;/h3&amp;gt;
(1) 구조체 개념 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ기본 자료형으로 새롭게 정의할 수 있는 사용자 정의 자료형 &amp;lt;br&amp;gt;
ㆍ초기화 할 때 마지막에 NULL 문자 삽입&amp;lt;br&amp;gt;
ㆍprintf(&amp;quot;%s&amp;quot;)시 NULL 직전까지 읽어서 출력&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

(2) 구조체 선언 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ구조체 정의
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;struct 구조체명&amp;amp;#123;
  자료형 변수명;
  char gender;
  int age;
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

ㆍ구조체 변수 선언 및 초기화
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;struct 구조체명 변수명 = &amp;amp;#123;'F', 21&amp;amp;#125;;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

ㆍ구조체 멤버 접근
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;ㆍp.gender = 'M', p.age = 25; // 일반 변수
ㆍp-&amp;gt;gender = 'M', p-&amp;gt;age = 25; // 포인터 변수&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 12 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 4️⃣ 함수&amp;lt;/h3&amp;gt;
(1) main 함수 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ모든 프로그램의 시작&amp;lt;br&amp;gt;
ㆍvoid main() 일 경우, return; or &amp;lt;s&amp;gt;return&amp;lt;/s&amp;gt; 자체를 사용 안 함&amp;lt;br&amp;gt;
ㆍint main() 일 경우, return 반환값; 명시&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

(2) 사용자 정의 함수(User-Defined Function) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ매개변수, 생성된 변수 -&amp;gt; 사용자 정의 함수 종료되면 없어짐 &amp;lt;br&amp;gt;
ㆍmain 함수에서 fn() 호출 시 -&amp;gt; &amp;lt;br&amp;gt;
&amp;amp;emsp;1) main 함수 위에 fn() 작성 &amp;lt;br&amp;gt;
&amp;amp;emsp;2) fn()이 함수라고 명시
&amp;lt;/div&amp;gt;

&amp;lt;div style=&amp;quot;margin-left: 20px;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
① 매개변수 전달 방법(Parameter Passing Mechanism)&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  구성요소 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ매개변수(parameter) - 호출하는 쪽에서 &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;전달받는&amp;lt;/span&amp;gt; 변수의 값/주솟값 &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;int fn(int x, int y)&amp;amp;#123; // 매개변수
  ...
&amp;amp;#125;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;&amp;lt;br&amp;gt;

ㆍ전달인자(argument) - 호출하는 쪽에서 &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;전달하는&amp;lt;/span&amp;gt; 변수의 값/주솟값 &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;void main()&amp;amp;#123;
  int i, j;
  ...
  fn(i, j); // 전달인자
&amp;amp;#125;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  종류 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍCall by Value &amp;lt;br&amp;gt;
&amp;amp;emsp;- 새로운 공간에 할당 &amp;lt;br&amp;gt;
&amp;amp;emsp;- 실 매개변수에 영향 X &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;int fn(int x, int y)&amp;amp;#123;
  ...
&amp;amp;#125;

void main()&amp;amp;#123;
  int i, j;
  ...
  fn(i, j);
&amp;amp;#125;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;&amp;lt;br&amp;gt;

ㆍCall by Reference &amp;lt;br&amp;gt;
&amp;amp;emsp;- 메모리 공간의 주소 전달 &amp;lt;br&amp;gt;
&amp;amp;emsp;- 실 매개변수의 주소를 형식 매개변수로 보냄 &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;int fn(int* x, int* y)&amp;amp;#123; // * 는 간접 연산자
  ...
&amp;amp;#125;

void main()&amp;amp;#123;
  int i, j;
  ...
  fn(&amp;amp;i, &amp;amp;j); // &amp;amp; 는 주소 연산자
&amp;amp;#125;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;br&amp;gt;

② 재귀함수(Recursive Function)&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ함수 자신이 자신을 부르는 함수 &amp;lt;br&amp;gt;
ㆍ계산이 끝나면 main으로 return &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(3) 표준 함수&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  문자열 함수 ㅡ &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; string.h&amp;lt;/span&amp;gt; 헤더 추가 &amp;lt;br&amp;gt; 
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;ㆍstrcat&amp;lt;/span&amp;gt; (Concatenate - 문자열끼리 연결) &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;strcat(&amp;quot;Hello&amp;quot;, &amp;quot;Clan&amp;quot;); // HelloClan
strncat(&amp;quot;Hello&amp;quot;, &amp;quot;Clan&amp;quot;, 2); // HelloCl&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;ㆍstrcpy&amp;lt;/span&amp;gt; (Copy - 문자열 복사) &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;strcpy(&amp;quot;Hello&amp;quot;, &amp;quot;Clan&amp;quot;); // Clan
strncpy(&amp;quot;Hello&amp;quot;, &amp;quot;Clan&amp;quot;, 2); // Clllo - Hello 중 앞 2글자(Cl)만 복사됨 &amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;ㆍstrcmp&amp;lt;/span&amp;gt; (Compare - 문자열 비교) &amp;lt;br&amp;gt;
strcmp(s1,s2); 일 때, s1 &amp;gt; s2면 1, s1 = s2면 0, s1 &amp;lt; s2면 -1을 반환 (아스키 코드를 비교) &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;strcmp(&amp;quot;Hello&amp;quot;, &amp;quot;Clan&amp;quot;); // -1
strncmp(&amp;quot;Hello&amp;quot;, &amp;quot;Help&amp;quot;, 2); // 0 &amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;ㆍstrlen&amp;lt;/span&amp;gt; (Length - 문자열 길이) &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;strlen(&amp;quot;Hello&amp;quot;); // 5&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;ㆍstrrev&amp;lt;/span&amp;gt; (Reverse - 문자열 뒤집음) &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;strrev(&amp;quot;Hello&amp;quot;); // olleH&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;

&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;ㆍstrchr&amp;lt;/span&amp;gt; (Char - 일치하는 문자 있는지 검사) &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;strchr(&amp;quot;Hello&amp;quot;, &amp;quot;H&amp;quot;); // Hello - 일치하는 문자부터 NULL 전까지 출력
strchr(&amp;quot;Hello&amp;quot;, &amp;quot;l&amp;quot;); // llo &amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  수학 함수 ㅡ &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; math.h&amp;lt;/span&amp;gt; 헤더 추가 &amp;lt;br&amp;gt; 
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍsqrt(n) - 양의 제곱근 계산, 소수 확인할 때 사용 &amp;lt;br&amp;gt;
ㆍceil(n) - 소수점 올림 &amp;lt;br&amp;gt;
ㆍfloor(n) - 소수점 내림
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  유틸리티 함수 ㅡ &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; stdlib.h, time.h&amp;lt;/span&amp;gt; 헤더 추가 &amp;lt;br&amp;gt; 
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍrand() - 임의의 값 생성 (0~32767(=2&amp;lt;sup&amp;gt;15&amp;lt;/sup&amp;gt;-1)) &amp;lt;br&amp;gt;
ㆍsrand(seed) - seed 값에 따른 임의의 값 생성 &amp;lt;br&amp;gt;
ㆍtime() - 현재 시간 가져옴 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

ㆍatoi(str) - 문자열(str) -&amp;gt; 정수형(int) 변환 &amp;lt;br&amp;gt;
ㆍatof(str) - 문자열(str) -&amp;gt; 실수형(float, double) 변환 &amp;lt;br&amp;gt;
ㆍitoa(value, str, radix) - value 를 변환하여 str에 radix 진수로 저장
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


&amp;lt;!-- 13 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 5️⃣ 포인터&amp;lt;/h3&amp;gt;
포인터 - 변수의 주솟값 저장 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
(1) 포인터 선언 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-size: 20px; font-weight: bold;&amp;quot;&amp;gt;자료형&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;* &amp;lt;/span&amp;gt; 포인터변수명 = &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;&amp;amp; &amp;lt;/span&amp;gt;변수명 &amp;lt;br&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;* &amp;lt;/span&amp;gt;: 자료형과 쓰임 - 주솟값을 저장하는 변수 선언 &amp;lt;br&amp;gt;
&amp;amp;emsp;&amp;amp;nbsp;포인터 변수명/주솟값을 의미하는 변수와 함께 쓰임 - 그 주소&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;의 값&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;

&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;&amp;amp; &amp;lt;/span&amp;gt;: 변수명 앞에 붙음 - 해당 변수명의 주솟값 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

ex) &amp;lt;br&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;int a = 10;
int *b = &amp;amp;a; // b는 a의 주솟값을 갖는다
printf(&amp;quot;%d %d %d&amp;quot;, a, *b, *(&amp;amp;a)); // a는 10, b가 가리키는 곳의 값 = 10, a의 주소가 가리키는 곳의 값 = 10

char *p = &amp;quot;KOREA&amp;quot;;
printf(&amp;quot;%c&amp;quot;, *p+2); // *p 계산 후 + 2 를 연산. *p의 값은 K, K+2를 문자로 출력하면 M (&amp;amp;#8757;아스키코드)
printf(&amp;quot;%c&amp;quot;, *(p+2)); // p+2 계산 후 * 를 연산. p+2의 값은 R의 주솟값. *(R의 주솟값)을 연산하면 R&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) 배열과 포인터 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ포인터와 배열 -&amp;gt; 둘 다 주소 갖고 있다. &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;br&amp;gt;
  1차원 배열과 포인터 &amp;lt;br&amp;gt; 
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;int a[3] = &amp;amp;#123;1, 2, 3&amp;amp;#125;
int *p = a;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;br&amp;gt;
ㆍa[]의 주솟값을 각각 100, 101, 102 로 가정 &amp;lt;br&amp;gt;
ㆍp는 a의 주솟값인 100을 갖고 있음 &amp;lt;br&amp;gt;
ㆍ이를 표로 나타내면 다음과 같다 &amp;lt;br&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;a&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;a[0]&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;a[1]&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;a[2]&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px; background-color: #f5f5f5;&amp;quot;&amp;gt;주솟값&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;101&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;102&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px; background-color: #f5f5f5;&amp;quot;&amp;gt;값&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;3&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;

&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse:collapse;&amp;quot;&amp;gt;
  p
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;br&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;그림을 꼭 &amp;lt;/span&amp;gt;그려서 포인터에 익숙해지길 바랍니다 &amp;lt;br&amp;gt;
ㆍp*는 '그 곳&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;의 값&amp;lt;/span&amp;gt;'임을 명심 &amp;lt;br&amp;gt;
&amp;lt;br&amp;gt;
예제)

&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;printf(&amp;quot;%d&amp;quot;, *p); // 100번지의 값 = 1 

printf(&amp;quot;%d&amp;quot;, *(p+1));
// p+1 먼저 계산; 100+1=101
// 그 다음 *(101) 계산; 101번지의 값 = 2

*p++ = 10;
// 연산이 2가지. *p = 10 &amp;amp; p++
// *p = 10 먼저 계산; p가 가리키는 곳의 값을 10으로 만들어라 -&amp;gt; a[0]의 값이 1에서 10으로 대입됨
// 그 다음 p++ 연산; p가 가리키는 곳인 100에서 ++ 해줘라. -&amp;gt; p가 가리키는 값이 100에서 101이 됨

*++p = 20;
// 연산이 2가지. *p = 20 &amp;amp; p++
// p++ 먼저 연산; p가 가리키는 곳인 101에서 ++ 해줘라. -&amp;gt; p가 가리키는 값이 101에서 102가 됨
// 그 다음 *p = 10 계산; p가 가리키는 곳의 값을 20으로 만들어라. -&amp;gt; a[3]의 값이 3에서 20으로 대입됨&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  2차원 배열과 포인터&amp;lt;br&amp;gt; 
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;int a[3][2] = &amp;amp;#123; &amp;amp;#123;1, 2&amp;amp;#125;, &amp;amp;#123;3, 4&amp;amp;#125;, &amp;amp;#123;5, 6&amp;amp;#125; &amp;amp;#125;;
int *p = a[1];&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;

&amp;lt;br&amp;gt;
ㆍa[][]의 주솟값을 각각 100, 101, 102, 103, 104, 105 로 가정 &amp;lt;br&amp;gt;
ㆍp*는 '그 곳&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;의 값&amp;lt;/span&amp;gt;'임을 명심 &amp;lt;br&amp;gt;
ㆍa는 100번지임을 명심 &amp;lt;br&amp;gt;
ㆍ*a도 100번지임을 명심. 왜냐하면 a가 가리키는 곳의 값은 대표행 a[0]의 주소를 의미 &amp;lt;br&amp;gt;
ㆍ**a는 '그 곳&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;의 값의 값&amp;lt;/span&amp;gt;'임을 명심. 즉, 100번지의 값이므로 1 &amp;lt;br&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse:collapse;&amp;quot;&amp;gt;
  a
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;대표행주소&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;대표행&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt; 값&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;&amp;amp;emsp; &amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;a[0]&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;102&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;a[1]&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;3&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;4&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;104&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;a[2]&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;5&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;6&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;

&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse:collapse;&amp;quot;&amp;gt;
  p
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;102&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;

&amp;lt;br&amp;gt;
예제)

&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;printf(&amp;quot;%d&amp;quot;, *p); // p는 102, *(102)는 102번지의 값을 의미. &amp;amp;#8756; *p = 3

printf(&amp;quot;%d&amp;quot;, *(p+2)); // p는 102, p+2는 104, *(104)는 104번지의 값을 의미. &amp;amp;#8756; *(p+2) = 5

printf(&amp;quot;%d&amp;quot;, *(*a+1)); // *a는 100, *a+1은 100+1, *(101)은 101번지의 값을 의미. &amp;amp;#8756; *(*a+1) = 2

printf(&amp;quot;%d&amp;quot;, *a[1]); // a[1]는 102, *(102)는 102번지의 값을 의미. &amp;amp;#8756; *a[1] = 3&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  2차원 배열과 포인터 배열 &amp;lt;br&amp;gt; 
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ포인터 배열: 포인터 변수의 배열화, 배열 요소에 주솟값이 있다 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;char *student[3] = &amp;amp;#123; &amp;quot;kim&amp;quot;, &amp;quot;lee&amp;quot;, &amp;quot;han&amp;quot; &amp;amp;#125;;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;br&amp;gt;
ㆍstudent[]에는 주솟값이 들어감 &amp;lt;br&amp;gt;
ㆍstudent[]의 주솟값을 100번지 로 가정 &amp;lt;br&amp;gt;
ㆍkim, lee, han가 들어간 주솟값을 각각 20번지, 30번지, 40번지 로 가정 &amp;lt;br&amp;gt;
ㆍkim에서 k 20번지, i 21번지, m 22번지로 연속해서 주솟값이 들어간다. lee, han도 동일&amp;lt;br&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;student&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;20번지&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;30번지&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;40번지&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;

  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;101&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;102&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse: separate; border-spacing: 0 10px;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;20번지&amp;amp;nbsp;&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;k&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;i&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;m&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;30번지&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;l&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;e&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;e&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;40번지&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;h&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;a&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;n&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;

&amp;lt;br&amp;gt;
예제)
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;printf(&amp;quot;%s&amp;quot;, *(student+1));
  // student + 1 계산 후 -&amp;gt; * 를 연산
  //ㆍstudent 은 100, student + 1은 101
  //ㆍ*(101)은 101의 값을 의미, 101의 값은 30번지, %s을 만났으니 30번지부터 NULL 만날 때까지 계속 출력.
  // &amp;amp;#8756; lee
&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;char *array[2] = &amp;amp;#123; &amp;quot;Good morning&amp;quot;, &amp;quot;C language&amp;quot; &amp;amp;#125;;&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;br&amp;gt;
ㆍarray[]에는 주솟값이 들어감 &amp;lt;br&amp;gt;
ㆍarray[]의 주솟값을 100번지 로 가정 &amp;lt;br&amp;gt;
ㆍGood morning, C language의 주솟값을 각각 20번지, 50번지 로 가정 &amp;lt;br&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;array&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;20번지&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;50번지&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;

  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;100&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;101&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;table style=&amp;quot;border-collapse: separate; border-spacing: 0 10px;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;20번지&amp;amp;nbsp;&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;G&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;o&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;o&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;d&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;m&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;o&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;r&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;n&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;i&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;n&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;g&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:none; padding:5px;&amp;quot;&amp;gt;50번지&amp;amp;nbsp;&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;C&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;l&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;a&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;n&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;g&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;u&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;a&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;g&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;e&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;

&amp;lt;br&amp;gt;
예제)

&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;
&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;printf(&amp;quot;%s&amp;quot;, array[0]+5);
  // array[0]의 값은 20, array[0]+5는 25, 25번지부터 NULL 만날 때까지 문자열 출력.
  // &amp;amp;#8756; morning

printf(&amp;quot;%c&amp;quot;, *(array[1]+6));
  // array[1]의 값은 50, array[1]+6은 56, *(56)은 56번지의 값.
  // &amp;amp;#8756;u
&amp;lt;/code&amp;gt;
&amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&quot;&gt;&lt;!-- 목록 --&gt; &lt;span style=&quot;font-weight: bold; font-size: 18px;&quot;&gt; ☰ &amp;nbsp; 정보처리기사 실기 &amp;nbsp; &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border-radius: 8px; padding: 10px; background-color: #ccc;&quot;&gt;
&lt;div style=&quot;display: inline-block;&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/13&quot;&gt; Ⅰ. 요구사항 확인 &lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/41&quot;&gt; Ⅵ. 프로그래밍 언어 활용 - 프로그래밍을 위한 기본 사항, C언어1 (~ 반복문) &lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/43&quot;&gt; Ⅵ. 프로그래밍 언어 활용 - C언어2 (배열 ~) &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;font-size: 24px; font-weight: bold;&quot;&gt;Ⅵ. 프로그래밍 언어 활용&lt;/div&gt;
&lt;!-- chapter02 --&gt; &lt;br /&gt;
&lt;div style=&quot;border-left: 4px solid; padding-left: 12px; margin: 16px 0; font-size: 24px; font-weight: bold;&quot;&gt;02. C언어&lt;/div&gt;
&lt;!-- 9 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 배열&lt;/h3&gt;
(1) 배열 종류 &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  1차원 배열&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;int a[3] = {1,2} // a[2]는 0으로 초기화
float b[3] = {1.1, 1.2} // b[2]은 0.0으로 초기화
char c[8] = &quot;Hello&quot;; // 나머지는 NULL 로 초기화&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  2차원 배열&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;int a[2][3] = {1,2,3,4} // a[2]는 0으로 초기화&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;width: 50%; border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;char b[2][8] = {&quot;Hello&quot;, &quot;computer&quot;}; // 나머지는 NULL 로 초기화&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;width: 50%; border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;H&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;e&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;l&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;l&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;o&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;NULL&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;NULL&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;c&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;o&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;m&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;p&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;u&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;t&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;e&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;r&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 10 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 문자열&lt;/h3&gt;
(1) 1차원 배열과 문자열 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍchar 형 배열로 표현 &lt;br /&gt;ㆍ초기화 할 때 마지막에 NULL 문자 삽입&lt;br /&gt;ㆍprintf(&quot;%s&quot;)시 NULL 직전까지 읽어서 출력&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;cf) 문자열과 주소 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;int a[5]&lt;/span&gt; &lt;br /&gt;ㆍ&amp;amp;a[0] &amp;lt;=&amp;gt; a &amp;lt;=&amp;gt; a의 0번째 주소 &lt;br /&gt;ㆍ&amp;amp;a[3] &amp;lt;=&amp;gt; a + 3 &amp;lt;=&amp;gt; a의 3번째 주소 &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 2차원 배열과 문자열 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍchar 형 2차원 배열을 사용 &lt;br /&gt;ㆍ&amp;amp;a[0][0] &amp;lt;=&amp;gt; a[0] &amp;lt;=&amp;gt; a의 0번째 행, 0번째 열의 주소 &lt;br /&gt;ㆍ&amp;amp;a[1][2] &amp;lt;=&amp;gt; a[1] + 2 &amp;lt;=&amp;gt; a의 1번째 행, 2번째 열의 주소 &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 11 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 구조체(Structure Type)&lt;/h3&gt;
(1) 구조체 개념 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ기본 자료형으로 새롭게 정의할 수 있는 사용자 정의 자료형 &lt;br /&gt;ㆍ초기화 할 때 마지막에 NULL 문자 삽입&lt;br /&gt;ㆍprintf(&quot;%s&quot;)시 NULL 직전까지 읽어서 출력&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 구조체 선언 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ구조체 정의
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;struct 구조체명{
  자료형 변수명;
  char gender;
  int age;
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ구조체 변수 선언 및 초기화
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;struct 구조체명 변수명 = {'F', 21};&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ구조체 멤버 접근
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;ㆍp.gender = 'M', p.age = 25; // 일반 변수
ㆍp-&amp;gt;gender = 'M', p-&amp;gt;age = 25; // 포인터 변수&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 12 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ 함수&lt;/h3&gt;
(1) main 함수 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ모든 프로그램의 시작&lt;br /&gt;ㆍvoid main() 일 경우, return; or &lt;s&gt;return&lt;/s&gt; 자체를 사용 안 함&lt;br /&gt;ㆍint main() 일 경우, return 반환값; 명시&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 사용자 정의 함수(User-Defined Function) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ매개변수, 생성된 변수 -&amp;gt; 사용자 정의 함수 종료되면 없어짐 &lt;br /&gt;ㆍmain 함수에서 fn() 호출 시 -&amp;gt; &lt;br /&gt;&amp;emsp;1) main 함수 위에 fn() 작성 &lt;br /&gt;&amp;emsp;2) fn()이 함수라고 명시&lt;/div&gt;
&lt;div style=&quot;margin-left: 20px;&quot;&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
① 매개변수 전달 방법(Parameter Passing Mechanism)&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  구성요소 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ매개변수(parameter) - 호출하는 쪽에서 &lt;span style=&quot;font-weight: bold;&quot;&gt;전달받는&lt;/span&gt; 변수의 값/주솟값 &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;int fn(int x, int y){ // 매개변수
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ전달인자(argument) - 호출하는 쪽에서 &lt;span style=&quot;font-weight: bold;&quot;&gt;전달하는&lt;/span&gt; 변수의 값/주솟값 &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;void main(){
  int i, j;
  ...
  fn(i, j); // 전달인자
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  종류 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍCall by Value &lt;br /&gt;&amp;emsp;- 새로운 공간에 할당 &lt;br /&gt;&amp;emsp;- 실 매개변수에 영향 X &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;int fn(int x, int y){
  ...
}

void main(){
  int i, j;
  ...
  fn(i, j);
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍCall by Reference &lt;br /&gt;&amp;emsp;- 메모리 공간의 주소 전달 &lt;br /&gt;&amp;emsp;- 실 매개변수의 주소를 형식 매개변수로 보냄 &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;int fn(int* x, int* y){ // * 는 간접 연산자
  ...
}

void main(){
  int i, j;
  ...
  fn(&amp;amp;i, &amp;amp;j); // &amp;amp; 는 주소 연산자
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;② 재귀함수(Recursive Function)&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ함수 자신이 자신을 부르는 함수 &lt;br /&gt;ㆍ계산이 끝나면 main으로 return &lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(3) 표준 함수&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  문자열 함수 ㅡ &lt;span style=&quot;font-weight: bold;&quot;&gt; string.h&lt;/span&gt; 헤더 추가 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ㆍstrcat&lt;/span&gt; (Concatenate - 문자열끼리 연결) &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;strcat(&quot;Hello&quot;, &quot;Clan&quot;); // HelloClan
strncat(&quot;Hello&quot;, &quot;Clan&quot;, 2); // HelloCl&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ㆍstrcpy&lt;/span&gt; (Copy - 문자열 복사) &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;strcpy(&quot;Hello&quot;, &quot;Clan&quot;); // Clan
strncpy(&quot;Hello&quot;, &quot;Clan&quot;, 2); // Clllo - Hello 중 앞 2글자(Cl)만 복사됨 &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ㆍstrcmp&lt;/span&gt; (Compare - 문자열 비교) &lt;br /&gt;strcmp(s1,s2); 일 때, s1 &amp;gt; s2면 1, s1 = s2면 0, s1 &amp;lt; s2면 -1을 반환 (아스키 코드를 비교) &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;strcmp(&quot;Hello&quot;, &quot;Clan&quot;); // -1
strncmp(&quot;Hello&quot;, &quot;Help&quot;, 2); // 0 &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ㆍstrlen&lt;/span&gt; (Length - 문자열 길이) &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;strlen(&quot;Hello&quot;); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ㆍstrrev&lt;/span&gt; (Reverse - 문자열 뒤집음) &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;strrev(&quot;Hello&quot;); // olleH&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ㆍstrchr&lt;/span&gt; (Char - 일치하는 문자 있는지 검사) &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;strchr(&quot;Hello&quot;, &quot;H&quot;); // Hello - 일치하는 문자부터 NULL 전까지 출력
strchr(&quot;Hello&quot;, &quot;l&quot;); // llo &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  수학 함수 ㅡ &lt;span style=&quot;font-weight: bold;&quot;&gt; math.h&lt;/span&gt; 헤더 추가 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍsqrt(n) - 양의 제곱근 계산, 소수 확인할 때 사용 &lt;br /&gt;ㆍceil(n) - 소수점 올림 &lt;br /&gt;ㆍfloor(n) - 소수점 내림&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  유틸리티 함수 ㅡ &lt;span style=&quot;font-weight: bold;&quot;&gt; stdlib.h, time.h&lt;/span&gt; 헤더 추가 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍrand() - 임의의 값 생성 (0~32767(=2&lt;sup&gt;15&lt;/sup&gt;-1)) &lt;br /&gt;ㆍsrand(seed) - seed 값에 따른 임의의 값 생성 &lt;br /&gt;ㆍtime() - 현재 시간 가져옴 &lt;br /&gt;&lt;br /&gt;ㆍatoi(str) - 문자열(str) -&amp;gt; 정수형(int) 변환 &lt;br /&gt;ㆍatof(str) - 문자열(str) -&amp;gt; 실수형(float, double) 변환 &lt;br /&gt;ㆍitoa(value, str, radix) - value 를 변환하여 str에 radix 진수로 저장&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 13 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5️⃣ 포인터&lt;/h3&gt;
포인터 - 변수의 주솟값 저장 &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
(1) 포인터 선언 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-size: 20px; font-weight: bold;&quot;&gt;자료형&lt;span style=&quot;color: red;&quot;&gt;* &lt;/span&gt; 포인터변수명 = &lt;span style=&quot;color: red;&quot;&gt;&amp;amp; &lt;/span&gt;변수명 &lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;* &lt;/span&gt;: 자료형과 쓰임 - 주솟값을 저장하는 변수 선언 &lt;br /&gt;&amp;emsp;&amp;nbsp;포인터 변수명/주솟값을 의미하는 변수와 함께 쓰임 - 그 주소&lt;span style=&quot;font-weight: bold;&quot;&gt;의 값&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;amp; &lt;/span&gt;: 변수명 앞에 붙음 - 해당 변수명의 주솟값 &lt;br /&gt;&lt;br /&gt;ex) &lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;int a = 10;
int *b = &amp;amp;a; // b는 a의 주솟값을 갖는다
printf(&quot;%d %d %d&quot;, a, *b, *(&amp;amp;a)); // a는 10, b가 가리키는 곳의 값 = 10, a의 주소가 가리키는 곳의 값 = 10

char *p = &quot;KOREA&quot;;
printf(&quot;%c&quot;, *p+2); // *p 계산 후 + 2 를 연산. *p의 값은 K, K+2를 문자로 출력하면 M (∵아스키코드)
printf(&quot;%c&quot;, *(p+2)); // p+2 계산 후 * 를 연산. p+2의 값은 R의 주솟값. *(R의 주솟값)을 연산하면 R&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 배열과 포인터 &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ포인터와 배열 -&amp;gt; 둘 다 주소 갖고 있다. &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;  1차원 배열과 포인터 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;int a[3] = {1, 2, 3}
int *p = a;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍa[]의 주솟값을 각각 100, 101, 102 로 가정 &lt;br /&gt;ㆍp는 a의 주솟값인 100을 갖고 있음 &lt;br /&gt;ㆍ이를 표로 나타내면 다음과 같다 &lt;br /&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;a&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;a[0]&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;a[1]&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;a[2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px; background-color: #f5f5f5;&quot;&gt;주솟값&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;101&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;102&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px; background-color: #f5f5f5;&quot;&gt;값&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;p
&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;ㆍ&lt;span style=&quot;color: red;&quot;&gt;그림을 꼭 &lt;/span&gt;그려서 포인터에 익숙해지길 바랍니다 &lt;br /&gt;ㆍp*는 '그 곳&lt;span style=&quot;color: red;&quot;&gt;의 값&lt;/span&gt;'임을 명심 &lt;br /&gt;&lt;br /&gt;예제)
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;printf(&quot;%d&quot;, *p); // 100번지의 값 = 1 

printf(&quot;%d&quot;, *(p+1));
// p+1 먼저 계산; 100+1=101
// 그 다음 *(101) 계산; 101번지의 값 = 2

*p++ = 10;
// 연산이 2가지. *p = 10 &amp;amp; p++
// *p = 10 먼저 계산; p가 가리키는 곳의 값을 10으로 만들어라 -&amp;gt; a[0]의 값이 1에서 10으로 대입됨
// 그 다음 p++ 연산; p가 가리키는 곳인 100에서 ++ 해줘라. -&amp;gt; p가 가리키는 값이 100에서 101이 됨

*++p = 20;
// 연산이 2가지. *p = 20 &amp;amp; p++
// p++ 먼저 연산; p가 가리키는 곳인 101에서 ++ 해줘라. -&amp;gt; p가 가리키는 값이 101에서 102가 됨
// 그 다음 *p = 10 계산; p가 가리키는 곳의 값을 20으로 만들어라. -&amp;gt; a[3]의 값이 3에서 20으로 대입됨&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  2차원 배열과 포인터&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;int a[3][2] = { {1, 2}, {3, 4}, {5, 6} };
int *p = a[1];&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍa[][]의 주솟값을 각각 100, 101, 102, 103, 104, 105 로 가정 &lt;br /&gt;ㆍp*는 '그 곳&lt;span style=&quot;color: red;&quot;&gt;의 값&lt;/span&gt;'임을 명심 &lt;br /&gt;ㆍa는 100번지임을 명심 &lt;br /&gt;ㆍ*a도 100번지임을 명심. 왜냐하면 a가 가리키는 곳의 값은 대표행 a[0]의 주소를 의미 &lt;br /&gt;ㆍ**a는 '그 곳&lt;span style=&quot;color: red;&quot;&gt;의 값의 값&lt;/span&gt;'임을 명심. 즉, 100번지의 값이므로 1 &lt;br /&gt;&lt;br /&gt;a
&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;대표행주소&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;대표행&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;값&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;&amp;emsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;a[0]&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;102&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;a[1]&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;104&lt;/td&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;a[2]&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;p
&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;102&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;예제)
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;printf(&quot;%d&quot;, *p); // p는 102, *(102)는 102번지의 값을 의미. &amp;there4; *p = 3

printf(&quot;%d&quot;, *(p+2)); // p는 102, p+2는 104, *(104)는 104번지의 값을 의미. &amp;there4; *(p+2) = 5

printf(&quot;%d&quot;, *(*a+1)); // *a는 100, *a+1은 100+1, *(101)은 101번지의 값을 의미. &amp;there4; *(*a+1) = 2

printf(&quot;%d&quot;, *a[1]); // a[1]는 102, *(102)는 102번지의 값을 의미. &amp;there4; *a[1] = 3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  2차원 배열과 포인터 배열 &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ포인터 배열: 포인터 변수의 배열화, 배열 요소에 주솟값이 있다 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;char *student[3] = { &quot;kim&quot;, &quot;lee&quot;, &quot;han&quot; };&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍstudent[]에는 주솟값이 들어감 &lt;br /&gt;ㆍstudent[]의 주솟값을 100번지 로 가정 &lt;br /&gt;ㆍkim, lee, han가 들어간 주솟값을 각각 20번지, 30번지, 40번지 로 가정 &lt;br /&gt;ㆍkim에서 k 20번지, i 21번지, m 22번지로 연속해서 주솟값이 들어간다. lee, han도 동일&lt;br /&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;student&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;20번지&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;30번지&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;40번지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;101&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;102&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;table style=&quot;border-collapse: separate; border-spacing: 0 10px;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;20번지&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;k&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;30번지&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;l&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;e&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;e&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;40번지&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;h&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;a&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;n&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;예제)
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;printf(&quot;%s&quot;, *(student+1));
  // student + 1 계산 후 -&amp;gt; * 를 연산
  //ㆍstudent 은 100, student + 1은 101
  //ㆍ*(101)은 101의 값을 의미, 101의 값은 30번지, %s을 만났으니 30번지부터 NULL 만날 때까지 계속 출력.
  // &amp;there4; lee
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;char *array[2] = { &quot;Good morning&quot;, &quot;C language&quot; };&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍarray[]에는 주솟값이 들어감 &lt;br /&gt;ㆍarray[]의 주솟값을 100번지 로 가정 &lt;br /&gt;ㆍGood morning, C language의 주솟값을 각각 20번지, 50번지 로 가정 &lt;br /&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;array&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;20번지&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;50번지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;101&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;table style=&quot;border-collapse: separate; border-spacing: 0 10px;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;20번지&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;G&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;o&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;o&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;d&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;m&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;o&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;r&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none; padding: 5px;&quot;&gt;50번지&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;C&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;l&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;a&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;g&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;u&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;a&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;g&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;e&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;예제)
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;printf(&quot;%s&quot;, array[0]+5);
  // array[0]의 값은 20, array[0]+5는 25, 25번지부터 NULL 만날 때까지 문자열 출력.
  // &amp;there4; morning

printf(&quot;%c&quot;, *(array[1]+6));
  // array[1]의 값은 50, array[1]+6은 56, *(56)은 56번지의 값.
  // &amp;there4;u
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/div&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06_C언어.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7dWNF/dJMcai3Hj5T/sNbm5tTKjjwhMqMgUYnkk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7dWNF/dJMcai3Hj5T/sNbm5tTKjjwhMqMgUYnkk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7dWNF/dJMcai3Hj5T/sNbm5tTKjjwhMqMgUYnkk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7dWNF%2FdJMcai3Hj5T%2FsNbm5tTKjjwhMqMgUYnkk1%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;300&quot; height=&quot;295&quot; data-filename=&quot;06_C언어.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;502&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;</description>
      <category>자격증/정보처리기사 - 실기</category>
      <category>구조체</category>
      <category>구조체개념</category>
      <category>구조체정리</category>
      <category>정보처리기사</category>
      <category>정보처리기사실기</category>
      <category>정처기</category>
      <category>정처기실기</category>
      <category>포인터</category>
      <category>포인터개념</category>
      <category>포인터정리</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/43</guid>
      <comments>https://rodesi.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 25 Mar 2026 11:08:33 +0900</pubDate>
    </item>
    <item>
      <title>001 C 언어 - 기본 구조, 자료형, 식별자, 변수, 표준 입출력 함수</title>
      <link>https://rodesi.tistory.com/42</link>
      <description>&lt;div id=&quot;code_1774193415990&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!-- 목록 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;span style=&amp;quot;font-weight:bold; font-size: 18px;&amp;quot;&amp;gt;
  ☰ &amp;amp;nbsp; C언어 개념 정리 &amp;amp;nbsp; &amp;lt;/span&amp;gt;
  &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;div style=&amp;quot;display: inline-block; align-items: center; 
border-radius: 8px; padding: 10px; background-color: #ddd;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;

  &amp;lt;ul style=&amp;quot;margin: 0; padding: 0; list-style-position: inside; gap: 16px;&amp;quot;&amp;gt;
    
  &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
    &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/42&amp;quot;
    style=&amp;quot;text-decoration: none; color: #999;&amp;quot;
    onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
    onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
    001. C언어 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 기본구조, 자료형, 식별자, 변수, 표준 입출력 함수 &amp;lt;/span&amp;gt; 
    &amp;lt;/a&amp;gt;
  &amp;lt;/li&amp;gt;
  

  &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

&amp;lt;!-- 본론 --&amp;gt;

&amp;lt;h3&amp;gt; 1️⃣ C언어 기본&amp;lt;/h3&amp;gt;

(1) C언어 기본 구조 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ전처리 부분 + 본문 &amp;lt;br&amp;gt;
ㆍ헤더 - xxxx.h
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) 전처리기(Preprocessor) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
 개념 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
전처리기 지시문(#)을 처리 &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  종류 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ#include (헤더 파일),&amp;lt;br&amp;gt;
ㆍ#define (매크로 정의, 예약어 - 상숫값 지정)
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


&amp;lt;!-- 2 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 2️⃣ 자료형(Data Type)&amp;lt;/h3&amp;gt;

(1) 자료형 유형 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ문자 - char &amp;lt;br&amp;gt;
ㆍ정수 - int &amp;lt;br&amp;gt;
ㆍ부동 소수점 - float, double &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


&amp;lt;!-- 3 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 3️⃣ 식별자(Identifier)&amp;lt;/h3&amp;gt;

(1) 식별자 명명 규칙 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ사용 가능 - 대/소문자, 숫자, 언더바(_) &amp;lt;br&amp;gt;
ㆍ규칙 - 처음에 숫자 사용 X &amp;lt;s&amp;gt;(1num)&amp;lt;/s&amp;gt;  / 중간에 공백 X  / 예약어 변수로 X &amp;lt;s&amp;gt;(if)&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

(2) 식별자 표기법 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ카멜(Camel) - &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;i&amp;lt;/span&amp;gt;nput&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;F&amp;lt;/span&amp;gt;unction; 첫 단어 첫 글자 소문자, 나머지 단어 첫 글자 대문자 &amp;lt;br&amp;gt;
ㆍ파스칼(Pascal) - &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;nput&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;F&amp;lt;/span&amp;gt;unction; 모든 단어 첫 글자 대문자 &amp;lt;br&amp;gt;
ㆍ스네이크(Snake) - &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;i&amp;lt;/span&amp;gt;nput&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;_f&amp;lt;/span&amp;gt;unction; 모든 단어 사이에 언더바 &amp;lt;br&amp;gt;
ㆍ헝가리안(Hungarian) - &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;Score; 자료형 + 식별자 &amp;lt;br&amp;gt;
&amp;amp;emsp;int(n), char(c), 문자열(sz)
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


&amp;lt;!-- 4 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 4️⃣ 변수(Variable)&amp;lt;/h3&amp;gt;
(1) 변수 개념 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ어떠한 값을 주기억 장치에 기억하기 위한 공간 &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

(2) 변수 선언 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ변수나 함수가 있음을 알려주는 행위
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;ㆍ 자료형 변수명; // 초기화 X
ㆍ 자료형 변수명 = 초깃값; // 초기화 O&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(3) 변수 유효범위 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  전역 변수(Global Variable) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ아무 곳에서 사용 가능 &amp;lt;br&amp;gt;
ㆍ생성 - 프로그램 시작 &amp;lt;br&amp;gt;
ㆍ종료 - 프로그램 종료 &amp;lt;br&amp;gt;
ㆍ초기화 X - 정수 = 0, 실수 = 0.0, 문자 = NULL 로 자동 초기화
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  지역 변수(Local Variable) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ해당 블록 내에서만 사용 가능 &amp;lt;br&amp;gt;  
ㆍ선언 - 블록이 시작하는 부분 &amp;lt;br&amp;gt;
ㆍ종료 - 중괄호가 닫히는 시점
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


&amp;lt;!-- 5 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;div&amp;gt;
  &amp;lt;h3 style=&amp;quot;display:inline;&amp;quot;&amp;gt;5️⃣ 표준 입출력 함수&amp;lt;/h3&amp;gt;
  &amp;lt;h4 style=&amp;quot;display:inline;&amp;quot;&amp;gt;; &amp;amp;lt;stdio.h&amp;amp;gt; 선언&amp;lt;/h4&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&amp;quot;margin-top:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
(1) 표준 출력 함수(printf) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  단순 출력 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;printf(&amp;quot;문자열&amp;quot;);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  이스케이프 문자 이용&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;printf(&amp;quot;\t문자열\n&amp;quot;); // \n(개행 문자), \t(tab 수평이동)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  포맷스트링 이용&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;ㆍ문자 printf(&amp;quot;%c&amp;quot;, char);
ㆍ문자열 printf(&amp;quot;%s&amp;quot;, string);
ㆍ정수 printf(&amp;quot;%u, %d, %o, %x, %X&amp;quot;, 
unsigned_decimal, decimal, octal, hexa_decimal);
// 부호 없는 10진수 정수, 10진수 정수, 8진수 정수, 16진수 정수(영어 소문자, 대문자)
ㆍ부동소수점 printf(&amp;quot;%e, %E, %f, %lf&amp;quot;, 
exponent, floating_point, long_floating_point);
// 지수 표기, 부동 소수점, 부동 소수점(long)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  포맷스트링 - 부동 소수점 상세&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;font-weight: bold; margin-bottom: 10px;&amp;quot; &amp;gt;%[-][0][전체자리수].[소수점자리수]스트링&amp;lt;/div&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; - &amp;lt;/span&amp;gt; : - 를 붙이면 왼쪽 정렬, - 붙이지 않고 [전체자리수] 정해져 있으면 오른쪽 정렬 &amp;lt;br&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 0 &amp;lt;/span&amp;gt; : 빈 공간을 0으로 채움 &amp;lt;br&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 전체자리수 &amp;lt;/span&amp;gt; : 소수점(.) 포함 &amp;lt;br&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 소수점자리수 &amp;lt;/span&amp;gt; : [소수점자리수]만큼 소수점 출력 (반올림) &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;br&amp;gt;

&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
  1.234에 대해 각 포맷 스트링을 적용했을 때
&amp;lt;table style=&amp;quot;width:100%; border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #bbb; padding:5px; background-color: #ccc;&amp;quot;&amp;gt;%-05.lf&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;.&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #bbb; padding:5px; background-color: #ccc;&amp;quot;&amp;gt;%05.lf&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;.&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #bbb; padding:5px; background-color: #ccc;&amp;quot;&amp;gt;%5.lf&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;.&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #bbb; padding:5px; background-color: #ccc;&amp;quot;&amp;gt;%.2f&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;.&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;3&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



(2) 표준 입력 함수(scanf) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ포맷 스트링으로 데이터 읽음 &amp;lt;br&amp;gt;
ㆍ포맷 스트링은 printf와 동일
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;scanf(&amp;quot;%d %c&amp;quot;, &amp;amp;age, &amp;amp;gender); // &amp;amp;변수 = 변수의 주솟값&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&quot;&gt;&lt;!-- 목록 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span style=&quot;font-weight: bold; font-size: 18px;&quot;&gt; ☰ &amp;nbsp; C언어 개념 정리 &amp;nbsp; &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border-radius: 8px; padding: 10px; background-color: #ddd;&quot;&gt;
&lt;div style=&quot;display: inline-block;&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #999;&quot; href=&quot;https://rodesi.tistory.com/42&quot;&gt; 001. C언어 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 기본구조, 자료형, 식별자, 변수, 표준 입출력 함수 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- 본론 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ C언어 기본&lt;/h3&gt;
(1) C언어 기본 구조 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ전처리 부분 + 본문 &lt;br /&gt;ㆍ헤더 - xxxx.h&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 전처리기(Preprocessor) &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
 개념 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;전처리기 지시문(#)을 처리 &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  종류 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ#include (헤더 파일),&lt;br /&gt;ㆍ#define (매크로 정의, 예약어 - 상숫값 지정)&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 2 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 자료형(Data Type)&lt;/h3&gt;
(1) 자료형 유형 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ문자 - char &lt;br /&gt;ㆍ정수 - int &lt;br /&gt;ㆍ부동 소수점 - float, double &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 3 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 식별자(Identifier)&lt;/h3&gt;
(1) 식별자 명명 규칙 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ사용 가능 - 대/소문자, 숫자, 언더바(_) &lt;br /&gt;ㆍ규칙 - 처음에 숫자 사용 X &lt;s&gt;(1num)&lt;/s&gt; / 중간에 공백 X / 예약어 변수로 X &lt;s&gt;(if)&lt;/s&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 식별자 표기법 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ카멜(Camel) - &lt;span style=&quot;color: red;&quot;&gt;i&lt;/span&gt;nput&lt;span style=&quot;color: red;&quot;&gt;F&lt;/span&gt;unction; 첫 단어 첫 글자 소문자, 나머지 단어 첫 글자 대문자 &lt;br /&gt;ㆍ파스칼(Pascal) - &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nput&lt;span style=&quot;color: red;&quot;&gt;F&lt;/span&gt;unction; 모든 단어 첫 글자 대문자 &lt;br /&gt;ㆍ스네이크(Snake) - &lt;span style=&quot;color: red;&quot;&gt;i&lt;/span&gt;nput&lt;span style=&quot;color: red;&quot;&gt;_f&lt;/span&gt;unction; 모든 단어 사이에 언더바 &lt;br /&gt;ㆍ헝가리안(Hungarian) - &lt;span style=&quot;color: red;&quot;&gt;n&lt;/span&gt;Score; 자료형 + 식별자 &lt;br /&gt;&amp;emsp;int(n), char(c), 문자열(sz)&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 4 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ 변수(Variable)&lt;/h3&gt;
(1) 변수 개념 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ어떠한 값을 주기억 장치에 기억하기 위한 공간 &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 변수 선언 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ변수나 함수가 있음을 알려주는 행위
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;ㆍ 자료형 변수명; // 초기화 X
ㆍ 자료형 변수명 = 초깃값; // 초기화 O&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(3) 변수 유효범위 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  전역 변수(Global Variable) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ아무 곳에서 사용 가능 &lt;br /&gt;ㆍ생성 - 프로그램 시작 &lt;br /&gt;ㆍ종료 - 프로그램 종료 &lt;br /&gt;ㆍ초기화 X - 정수 = 0, 실수 = 0.0, 문자 = NULL 로 자동 초기화&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  지역 변수(Local Variable) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ해당 블록 내에서만 사용 가능 &lt;br /&gt;ㆍ선언 - 블록이 시작하는 부분 &lt;br /&gt;ㆍ종료 - 중괄호가 닫히는 시점&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 5 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;div&gt;
&lt;h3 style=&quot;display: inline;&quot; data-ke-size=&quot;size23&quot;&gt;5️⃣ 표준 입출력 함수&lt;/h3&gt;
&lt;h4 style=&quot;display: inline;&quot; data-ke-size=&quot;size20&quot;&gt;; &amp;lt;stdio.h&amp;gt; 선언&lt;/h4&gt;
&lt;/div&gt;
&lt;div style=&quot;margin-top: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
(1) 표준 출력 함수(printf) &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  단순 출력 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;printf(&quot;문자열&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  이스케이프 문자 이용&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;printf(&quot;\t문자열\n&quot;); // \n(개행 문자), \t(tab 수평이동)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  포맷스트링 이용&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;ㆍ문자 printf(&quot;%c&quot;, char);
ㆍ문자열 printf(&quot;%s&quot;, string);
ㆍ정수 printf(&quot;%u, %d, %o, %x, %X&quot;, 
unsigned_decimal, decimal, octal, hexa_decimal);
// 부호 없는 10진수 정수, 10진수 정수, 8진수 정수, 16진수 정수(영어 소문자, 대문자)
ㆍ부동소수점 printf(&quot;%e, %E, %f, %lf&quot;, 
exponent, floating_point, long_floating_point);
// 지수 표기, 부동 소수점, 부동 소수점(long)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  포맷스트링 - 부동 소수점 상세&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;div style=&quot;font-weight: bold; margin-bottom: 10px;&quot;&gt;%[-][0][전체자리수].[소수점자리수]스트링&lt;/div&gt;
ㆍ&lt;span style=&quot;font-weight: bold;&quot;&gt; - &lt;/span&gt; : - 를 붙이면 왼쪽 정렬, - 붙이지 않고 [전체자리수] 정해져 있으면 오른쪽 정렬 &lt;br /&gt;ㆍ&lt;span style=&quot;font-weight: bold;&quot;&gt; 0 &lt;/span&gt; : 빈 공간을 0으로 채움 &lt;br /&gt;ㆍ&lt;span style=&quot;font-weight: bold;&quot;&gt; 전체자리수 &lt;/span&gt; : 소수점(.) 포함 &lt;br /&gt;ㆍ&lt;span style=&quot;font-weight: bold;&quot;&gt; 소수점자리수 &lt;/span&gt; : [소수점자리수]만큼 소수점 출력 (반올림) &lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;1.234에 대해 각 포맷 스트링을 적용했을 때
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #bbb; padding: 5px; background-color: #ccc;&quot;&gt;%-05.lf&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #bbb; padding: 5px; background-color: #ccc;&quot;&gt;%05.lf&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #bbb; padding: 5px; background-color: #ccc;&quot;&gt;%5.lf&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #bbb; padding: 5px; background-color: #ccc;&quot;&gt;%.2f&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 표준 입력 함수(scanf) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ포맷 스트링으로 데이터 읽음 &lt;br /&gt;ㆍ포맷 스트링은 printf와 동일
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;scanf(&quot;%d %c&quot;, &amp;amp;age, &amp;amp;gender); // &amp;amp;변수 = 변수의 주솟값&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;001.png&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LpAg7/dJMb99Z34U7/cze21crvjgI6JxHEA1Tez0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LpAg7/dJMb99Z34U7/cze21crvjgI6JxHEA1Tez0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LpAg7/dJMb99Z34U7/cze21crvjgI6JxHEA1Tez0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLpAg7%2FdJMb99Z34U7%2Fcze21crvjgI6JxHEA1Tez0%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;423&quot; height=&quot;426&quot; data-filename=&quot;001.png&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개념 정리/C 언어</category>
      <category>C언어</category>
      <category>C언어개념</category>
      <category>printf</category>
      <category>scanf</category>
      <category>변수</category>
      <category>식별자</category>
      <category>자료형</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/42</guid>
      <comments>https://rodesi.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 23 Mar 2026 10:00:41 +0900</pubDate>
    </item>
    <item>
      <title>[정처기 실기] 6. 프로그래밍 언어 활용 요약 - C언어1</title>
      <link>https://rodesi.tistory.com/41</link>
      <description>&lt;div id=&quot;code_1774002154734&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!-- 목록 --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight:bold; font-size: 18px;&amp;quot;&amp;gt;
☰ &amp;amp;nbsp; 정보처리기사 실기 &amp;amp;nbsp; &amp;lt;/span&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

&amp;lt;div style=&amp;quot;display: inline-block; align-items: center; 
border-radius: 8px; padding: 10px; background-color: #ccc;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;

  &amp;lt;ul style=&amp;quot;margin: 0; padding: 0; list-style-position: inside; gap: 16px;&amp;quot;&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/13&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅰ. 요구사항 확인 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/41&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅵ. 프로그래밍 언어 활용 - 프로그래밍을 위한 기본 사항, C언어1 (~ 반복문)
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/43&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#666';&amp;quot;&amp;gt;
      Ⅵ. 프로그래밍 언어 활용 - C언어2 (배열 ~)
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

  &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;font-size: 24px; font-weight: bold;&amp;quot;&amp;gt;
  Ⅵ. 프로그래밍 언어 활용
&amp;lt;/div&amp;gt;

&amp;lt;!-- chapter01 --&amp;gt;
&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;border-left:4px solid; padding-left:12px; margin:16px 0; font-size: 24px; font-weight: bold;&amp;quot;&amp;gt;
  01. 프로그래밍을 위한 기본 사항
&amp;lt;/div&amp;gt;

&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 1 --&amp;gt;
&amp;lt;h3&amp;gt; 1️⃣ 진수&amp;lt;/h3&amp;gt;

(1) 진수 변환 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ2 &amp;lt;-&amp;gt; 10 진수 변환
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

(2) 아스키 코드 (ASCII Code) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;table style=&amp;quot;width:100%; border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;th style=&amp;quot;border:1px solid #ccc; padding:5px; background:#f5f5f5;&amp;quot;&amp;gt;10진수&amp;lt;/th&amp;gt;
    &amp;lt;th style=&amp;quot;border:1px solid #ccc; padding:5px; background:#f5f5f5;&amp;quot;&amp;gt;부호&amp;lt;/th&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;NULL&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;32&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;' '(space)&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
  &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;48&amp;lt;/td&amp;gt;
  &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;65&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;A&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
  &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;97&amp;lt;/td&amp;gt;
  &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;a&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- chapter02 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;border-left:4px solid; padding-left:12px; margin:16px 0; font-size: 24px; font-weight: bold;&amp;quot;&amp;gt;
  02. C언어
&amp;lt;/div&amp;gt;

&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 1 --&amp;gt;
&amp;lt;h3&amp;gt; 1️⃣ C언어 기본&amp;lt;/h3&amp;gt;

(1) C언어 기본 구조 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ전처리 부분 + 본문 &amp;lt;br&amp;gt;
ㆍ헤더 - xxxx.h
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) 전처리기(Preprocessor) &amp;lt;br&amp;gt;
 개념 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
전처리기 지시문(#)을 처리 &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  종류 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ#include (헤더 파일),&amp;lt;br&amp;gt;
ㆍ#define (매크로 정의, 예약어 - 상숫값 지정)
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 2 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 2️⃣ 자료형(Data Type)&amp;lt;/h3&amp;gt;

(1) 자료형 유형 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ문자 - char &amp;lt;br&amp;gt;
ㆍ정수 - int &amp;lt;br&amp;gt;
ㆍ부동 소수점 - float, double &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 3 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 3️⃣ 식별자(Identifier)&amp;lt;/h3&amp;gt;

(1) 식별자 명명 규칙 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ사용 가능 - 대/소문자, 숫자, 언더바(_) &amp;lt;br&amp;gt;
ㆍ규칙 - 처음에 숫자 사용 X &amp;lt;s&amp;gt;(1num)&amp;lt;/s&amp;gt;  / 중간에 공백 X  / 예약어 변수로 X &amp;lt;s&amp;gt;(if)&amp;lt;/s&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

(2) 식별자 표기법 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ카멜(Camel) - &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;i&amp;lt;/span&amp;gt;nput&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;F&amp;lt;/span&amp;gt;unction; 첫 단어 첫 글자 소문자, 나머지 단어 첫 글자 대문자 &amp;lt;br&amp;gt;
ㆍ파스칼(Pascal) - &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;nput&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;F&amp;lt;/span&amp;gt;unction; 모든 단어 첫 글자 대문자 &amp;lt;br&amp;gt;
ㆍ스네이크(Snake) - &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;i&amp;lt;/span&amp;gt;nput&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;_f&amp;lt;/span&amp;gt;unction; 모든 단어 사이에 언더바 &amp;lt;br&amp;gt;
ㆍ헝가리안(Hungarian) - &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;Score; 자료형 + 식별자 &amp;lt;br&amp;gt;
&amp;amp;emsp;int(n), char(c), 문자열(sz)
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 4 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 4️⃣ 변수(Variable)&amp;lt;/h3&amp;gt;
(1) 변수 개념 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ어떠한 값을 주기억 장치에 기억하기 위한 공간 &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

(2) 변수 선언 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ변수나 함수가 있음을 알려주는 행위
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;ㆍ 자료형 변수명; // 초기화 X
ㆍ 자료형 변수명 = 초깃값; // 초기화 O&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(3) 변수 유효범위 &amp;lt;br&amp;gt;
  전역 변수(Global Variable) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ아무 곳에서 사용 가능 &amp;lt;br&amp;gt;
ㆍ생성 - 프로그램 시작 &amp;lt;br&amp;gt;
ㆍ종료 - 프로그램 종료 &amp;lt;br&amp;gt;
ㆍ초기화 X - 정수 = 0, 실수 = 0.0, 문자 = NULL 로 자동 초기화
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  지역 변수(Local Variable) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ해당 블록 내에서만 사용 가능 &amp;lt;br&amp;gt;  
ㆍ선언 - 블록이 시작하는 부분 &amp;lt;br&amp;gt;
ㆍ종료 - 중괄호가 닫히는 시점
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 5 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;div&amp;gt;
  &amp;lt;h3 style=&amp;quot;display:inline;&amp;quot;&amp;gt;5️⃣ 표준 입출력 함수&amp;lt;/h3&amp;gt;
  &amp;lt;h4 style=&amp;quot;display:inline;&amp;quot;&amp;gt;; &amp;amp;lt;stdio.h&amp;amp;gt; 선언&amp;lt;/h4&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&amp;quot;margin-top:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
(1) 표준 출력 함수(printf) &amp;lt;br&amp;gt;
  단순 출력 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;printf(&amp;quot;문자열&amp;quot;);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  이스케이프 문자 이용&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;printf(&amp;quot;\t문자열\n&amp;quot;); // \n(개행 문자), \t(tab 수평이동)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  포맷스트링 이용&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;ㆍ문자 printf(&amp;quot;%c&amp;quot;, char);
ㆍ문자열 printf(&amp;quot;%s&amp;quot;, string);
ㆍ정수 printf(&amp;quot;%u, %d, %o, %x, %X&amp;quot;, 
unsigned_decimal, decimal, octal, hexa_decimal);
// 부호 없는 10진수 정수, 10진수 정수, 8진수 정수, 16진수 정수(영어 소문자, 대문자)
ㆍ부동소수점 printf(&amp;quot;%e, %E, %f, %lf&amp;quot;, 
exponent, floating_point, long_floating_point);
// 지수 표기, 부동 소수점, 부동 소수점(long)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



  포맷스트링 - 부동 소수점 상세&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;font-weight: bold; margin-bottom: 10px;&amp;quot; &amp;gt;%[-][0][전체자리수].[소수점자리수]스트링&amp;lt;/div&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; - &amp;lt;/span&amp;gt; : - 를 붙이면 왼쪽 정렬, - 붙이지 않고 [전체자리수] 정해져 있으면 오른쪽 정렬 &amp;lt;br&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 0 &amp;lt;/span&amp;gt; : 빈 공간을 0으로 채움 &amp;lt;br&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 전체자리수 &amp;lt;/span&amp;gt; : 소수점(.) 포함 &amp;lt;br&amp;gt;
ㆍ&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 소수점자리수 &amp;lt;/span&amp;gt; : [소수점자리수]만큼 소수점 출력 (반올림) &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;br&amp;gt;

&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
  1.234에 대해 각 포맷 스트링을 적용했을 때
&amp;lt;table style=&amp;quot;width:100%; border-collapse:collapse;&amp;quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #bbb; padding:5px; background-color: #ccc;&amp;quot;&amp;gt;%-05.lf&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;.&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #bbb; padding:5px; background-color: #ccc;&amp;quot;&amp;gt;%05.lf&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;.&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #bbb; padding:5px; background-color: #ccc;&amp;quot;&amp;gt;%5.lf&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;.&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #bbb; padding:5px; background-color: #ccc;&amp;quot;&amp;gt;%.2f&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;.&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;2&amp;lt;/td&amp;gt;
    &amp;lt;td style=&amp;quot;border:1px solid #ccc; padding:5px;&amp;quot;&amp;gt;3&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



(2) 표준 입력 함수(scanf) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&amp;quot;&amp;gt;
ㆍ포맷 스트링으로 데이터 읽음 &amp;lt;br&amp;gt;
ㆍ포맷 스트링은 printf와 동일
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;scanf(&amp;quot;%d %c&amp;quot;, &amp;amp;age, &amp;amp;gender); // &amp;amp;변수 = 변수의 주솟값&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;




&amp;lt;!-- 6 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 6️⃣ 연산자(Operator)&amp;lt;/h3&amp;gt;
(1) 연산자 종류 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ증감 연산자 &amp;amp;ensp; ++&amp;amp;ensp;-- &amp;lt;br&amp;gt;
ㆍ산술 &amp;amp;ensp; +&amp;amp;ensp;-&amp;amp;ensp;*&amp;amp;ensp;/&amp;amp;ensp;% &amp;lt;br&amp;gt;
ㆍ시프트 &amp;amp;ensp; &amp;lt;&amp;lt;&amp;amp;ensp;&amp;gt;&amp;gt; &amp;lt;br&amp;gt;
ㆍ관계 &amp;amp;ensp; &amp;gt;&amp;amp;ensp;&amp;lt;&amp;amp;ensp;&amp;gt;=&amp;amp;ensp;&amp;lt;=&amp;amp;ensp;==&amp;amp;ensp;!=&amp;lt;br&amp;gt;
ㆍ비트 &amp;amp;ensp; &amp;amp;&amp;amp;ensp;|&amp;amp;ensp;^(XOR)&amp;amp;ensp;~ &amp;lt;br&amp;gt;
ㆍ논리 &amp;amp;ensp; &amp;amp;&amp;amp;&amp;amp;ensp;||&amp;amp;ensp;! &amp;lt;br&amp;gt;
ㆍ삼항 &amp;amp;ensp; (조건식) ? (참) : (거짓)&amp;lt;br&amp;gt;
ㆍ대입 &amp;amp;ensp;=&amp;amp;ensp;+=&amp;amp;ensp;-=&amp;amp;ensp;*=&amp;amp;ensp;/=&amp;amp;ensp;%= &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



(2) 연산자 우선순위 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold; background-color: #eee; font-size: 20px; padding: 5px;&amp;quot;&amp;gt;증감 산술 시프트 관계 비트 논리 삼항 대입&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;
1.&amp;amp;ensp;x++&amp;amp;ensp;x-- &amp;lt;br&amp;gt;
2.&amp;amp;ensp;++x&amp;amp;ensp;--x  &amp;lt;br&amp;gt;
&amp;amp;emsp;! &amp;lt;br&amp;gt;
&amp;amp;emsp;~ &amp;lt;br&amp;gt;
3.&amp;amp;ensp;*&amp;amp;ensp;/&amp;amp;ensp;%&amp;lt;br&amp;gt;
4.&amp;amp;ensp;+&amp;amp;ensp;-&amp;lt;br&amp;gt;
5.&amp;amp;ensp;&amp;lt;&amp;lt;&amp;amp;ensp;&amp;gt;&amp;gt;&amp;lt;br&amp;gt;

6.&amp;amp;ensp;&amp;lt;&amp;amp;ensp;&amp;lt;=&amp;amp;ensp;&amp;gt;&amp;amp;ensp;&amp;gt;=&amp;lt;br&amp;gt;
7.&amp;amp;ensp;==&amp;amp;ensp;!=&amp;lt;br&amp;gt;
8.&amp;amp;ensp;&amp;amp;&amp;lt;br&amp;gt;
9.&amp;amp;ensp;^&amp;lt;br&amp;gt;
10.&amp;amp;ensp;|&amp;lt;br&amp;gt;

11.&amp;amp;ensp;&amp;amp;&amp;amp;&amp;lt;br&amp;gt;
12.&amp;amp;ensp;||&amp;lt;br&amp;gt;
13.&amp;amp;ensp;(조건식) ? (참) : (거짓)&amp;lt;br&amp;gt;
14.&amp;amp;ensp;=&amp;amp;ensp;+=&amp;amp;ensp;-=&amp;amp;ensp;*=&amp;amp;ensp;/=&amp;amp;ensp;%= &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



(3) 연산자 상세 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  증감 연산자 (Incremenmt &amp;amp; Decrement Operator) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;x++&amp;amp;ensp;&amp;lt;/span&amp;gt; vs. &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;&amp;amp;ensp;++x&amp;lt;/span&amp;gt; 차이점 &amp;lt;br&amp;gt;
ㆍx++&amp;amp;ensp;/&amp;amp;ensp;x-- : 변수 값 사용 -&amp;gt; 값을 1 증가/감소 &amp;lt;br&amp;gt;
ㆍ++x&amp;amp;ensp;/&amp;amp;ensp;--x : 값을 1 증가/감소 -&amp;gt; 변수 값 사용
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  산술 연산자&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;/ (나누기 연산)&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;
ㆍ정수 / 정수 = 정수&amp;lt;br&amp;gt;
ㆍ정수 / 실수 = 실수&amp;lt;br&amp;gt;
ㆍ실수 / 정수 = 실수&amp;lt;br&amp;gt;
ㆍ실수 / 실수 = 실수&amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;% (나머지 연산)&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;
ㆍ정수끼리만 사용
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;

  시프트 연산자 (Shift Operator) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍa&amp;amp;ensp;&amp;lt;&amp;lt;&amp;amp;ensp;b:&amp;amp;ensp;a * 2&amp;lt;sup&amp;gt;b&amp;lt;/sup&amp;gt; &amp;lt;br&amp;gt;
ㆍa&amp;amp;ensp;&amp;gt;&amp;gt;&amp;amp;ensp;b:&amp;amp;ensp;a / 2&amp;lt;sup&amp;gt;b&amp;lt;/sup&amp;gt; &amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  비트 연산자 (Bit Operator) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ&amp;amp; : AND 연산자. 모두 1이면 1, 하나라도 0이면 0&amp;lt;br&amp;gt;
ㆍ| : OR 연산자. 하나라도 1이면 1, 모두 0이면 0&amp;lt;br&amp;gt;
ㆍ^ : XOR 연산자. 서로 다르면 1, 같으면 0&amp;lt;br&amp;gt;
ㆍ~ : NOT 연산자. 0 &amp;harr; 1. 0이면 1, 1이면 0&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


  논리 연산자 (Logic Operator) &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ&amp;amp;&amp;amp; : AND 연산자. 모두 True면 True, 하나라도 Fasle면 False&amp;lt;br&amp;gt;
ㆍ|| : OR 연산자. 하나라도 True면 True, 모두 Fasle면 Fasle&amp;lt;br&amp;gt;
ㆍ! : NOT 연산자. False &amp;harr; True. False면 True, True면 False&amp;lt;br&amp;gt;
ㆍcf : 참이면 1, 거짓이면 0을 반환
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


&amp;lt;!-- 7 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 7️⃣ 조건문&amp;lt;/h3&amp;gt;
(1) if 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ조건의 참 거짓 여부에 따라 경로 선택&amp;lt;br&amp;gt;
ㆍ코드 한 줄일 경우, 중괄호 생략 가능&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) switch 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍ여러 개의 경로 중 하나의 경로 선택&amp;lt;br&amp;gt;
ㆍ경우와 일치하는 case 문 실행&amp;lt;br&amp;gt;
ㆍ경우와 일치하는 case 없으면 default 실행&amp;lt;br&amp;gt;
ㆍbreak 만날 때 까지 계속 실행 (break 없으면 모든 case, default 까지 실행됨)&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



&amp;lt;!-- 8 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;h3&amp;gt; 8️⃣ 반복문&amp;lt;/h3&amp;gt;
(1) while 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;while(조건문)&amp;amp;#123;
  명령문;
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍ조건문이 참일 동안 명령문 반복 수행
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(2) do while 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;do&amp;amp;#123;
  명령문;
&amp;amp;#125; while(조건문)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;br&amp;gt;
ㆍ조건문의 참 거짓 여부에 관련 없이 무조건 반복문 한 번 수행 &amp;lt;br&amp;gt;
ㆍ이후 조건문이 참일 동안 명령문 반복 수행
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;



(3) for 문 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
&amp;lt;pre style=&amp;quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;language-c&amp;quot;&amp;gt;for(초기식; 조건식; 증감식)&amp;amp;#123;
  명령문;
&amp;amp;#125;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;br&amp;gt;
ㆍ조건식이 참일 경우 명령문 수행 &amp;lt;br&amp;gt;
ㆍ증감식으로 값 변경, 조건식 참일 경우 명령문 수행 과정을 반복
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;


(4) 루프 제어 명령어 &amp;lt;br&amp;gt;
&amp;lt;div style=&amp;quot; display: inline-block; border: 1.5px solid #ccc; 
  border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&amp;quot;&amp;gt;
ㆍbreak 문- 만나면 즉시 반복문 탈출 &amp;lt;br&amp;gt;
ㆍcontinue 문- 다음 코드를 실행하지 않고 while 문 시작 부분인 조건식으로 돌아와 이후 과정을 수행
&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&quot;&gt;&lt;!-- 목록 --&gt; &lt;span style=&quot;font-weight: bold; font-size: 18px;&quot;&gt; ☰ &amp;nbsp; 정보처리기사 실기 &amp;nbsp; &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border-radius: 8px; padding: 10px; background-color: #ccc;&quot;&gt;
&lt;div style=&quot;display: inline-block;&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/13&quot;&gt; Ⅰ. 요구사항 확인 &lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/41&quot;&gt; Ⅵ. 프로그래밍 언어 활용 - 프로그래밍을 위한 기본 사항, C언어1 (~ 반복문) &lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/43&quot;&gt; Ⅵ. 프로그래밍 언어 활용 - C언어2 (배열 ~) &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;font-size: 24px; font-weight: bold;&quot;&gt;Ⅵ. 프로그래밍 언어 활용&lt;/div&gt;
&lt;!-- chapter01 --&gt; &lt;br /&gt;
&lt;div style=&quot;border-left: 4px solid; padding-left: 12px; margin: 16px 0; font-size: 24px; font-weight: bold;&quot;&gt;01. 프로그래밍을 위한 기본 사항&lt;/div&gt;
&lt;!-- 본론 --&gt; &lt;!-- 1 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 진수&lt;/h3&gt;
(1) 진수 변환 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ2 &amp;lt;-&amp;gt; 10 진수 변환&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 아스키 코드 (ASCII Code) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;border: 1px solid #ccc; padding: 5px; background: #f5f5f5;&quot;&gt;10진수&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #ccc; padding: 5px; background: #f5f5f5;&quot;&gt;부호&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;32&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;' '(space)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;48&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;65&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;97&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- chapter02 --&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;border-left: 4px solid; padding-left: 12px; margin: 16px 0; font-size: 24px; font-weight: bold;&quot;&gt;02. C언어&lt;/div&gt;
&lt;!-- 본론 --&gt; &lt;!-- 1 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ C언어 기본&lt;/h3&gt;
(1) C언어 기본 구조 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ전처리 부분 + 본문 &lt;br /&gt;ㆍ헤더 - xxxx.h&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 전처리기(Preprocessor) &lt;br /&gt; 개념 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;전처리기 지시문(#)을 처리 &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  종류 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ#include (헤더 파일),&lt;br /&gt;ㆍ#define (매크로 정의, 예약어 - 상숫값 지정)&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 2 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 자료형(Data Type)&lt;/h3&gt;
(1) 자료형 유형 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ문자 - char &lt;br /&gt;ㆍ정수 - int &lt;br /&gt;ㆍ부동 소수점 - float, double &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 3 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 식별자(Identifier)&lt;/h3&gt;
(1) 식별자 명명 규칙 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ사용 가능 - 대/소문자, 숫자, 언더바(_) &lt;br /&gt;ㆍ규칙 - 처음에 숫자 사용 X &lt;s&gt;(1num)&lt;/s&gt; / 중간에 공백 X / 예약어 변수로 X &lt;s&gt;(if)&lt;/s&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 식별자 표기법 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ카멜(Camel) - &lt;span style=&quot;color: red;&quot;&gt;i&lt;/span&gt;nput&lt;span style=&quot;color: red;&quot;&gt;F&lt;/span&gt;unction; 첫 단어 첫 글자 소문자, 나머지 단어 첫 글자 대문자 &lt;br /&gt;ㆍ파스칼(Pascal) - &lt;span style=&quot;color: red;&quot;&gt;I&lt;/span&gt;nput&lt;span style=&quot;color: red;&quot;&gt;F&lt;/span&gt;unction; 모든 단어 첫 글자 대문자 &lt;br /&gt;ㆍ스네이크(Snake) - &lt;span style=&quot;color: red;&quot;&gt;i&lt;/span&gt;nput&lt;span style=&quot;color: red;&quot;&gt;_f&lt;/span&gt;unction; 모든 단어 사이에 언더바 &lt;br /&gt;ㆍ헝가리안(Hungarian) - &lt;span style=&quot;color: red;&quot;&gt;n&lt;/span&gt;Score; 자료형 + 식별자 &lt;br /&gt;&amp;emsp;int(n), char(c), 문자열(sz)&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 4 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ 변수(Variable)&lt;/h3&gt;
(1) 변수 개념 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ어떠한 값을 주기억 장치에 기억하기 위한 공간 &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 변수 선언 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ변수나 함수가 있음을 알려주는 행위
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;ㆍ 자료형 변수명; // 초기화 X
ㆍ 자료형 변수명 = 초깃값; // 초기화 O&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(3) 변수 유효범위 &lt;br /&gt;  전역 변수(Global Variable) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ아무 곳에서 사용 가능 &lt;br /&gt;ㆍ생성 - 프로그램 시작 &lt;br /&gt;ㆍ종료 - 프로그램 종료 &lt;br /&gt;ㆍ초기화 X - 정수 = 0, 실수 = 0.0, 문자 = NULL 로 자동 초기화&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  지역 변수(Local Variable) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ해당 블록 내에서만 사용 가능 &lt;br /&gt;ㆍ선언 - 블록이 시작하는 부분 &lt;br /&gt;ㆍ종료 - 중괄호가 닫히는 시점&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 5 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;div&gt;
&lt;h3 style=&quot;display: inline;&quot; data-ke-size=&quot;size23&quot;&gt;5️⃣ 표준 입출력 함수&lt;/h3&gt;
&lt;h4 style=&quot;display: inline;&quot; data-ke-size=&quot;size20&quot;&gt;; &amp;lt;stdio.h&amp;gt; 선언&lt;/h4&gt;
&lt;/div&gt;
&lt;div style=&quot;margin-top: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
(1) 표준 출력 함수(printf) &lt;br /&gt;  단순 출력 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;printf(&quot;문자열&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  이스케이프 문자 이용&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;printf(&quot;\t문자열\n&quot;); // \n(개행 문자), \t(tab 수평이동)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  포맷스트링 이용&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;ㆍ문자 printf(&quot;%c&quot;, char);
ㆍ문자열 printf(&quot;%s&quot;, string);
ㆍ정수 printf(&quot;%u, %d, %o, %x, %X&quot;, 
unsigned_decimal, decimal, octal, hexa_decimal);
// 부호 없는 10진수 정수, 10진수 정수, 8진수 정수, 16진수 정수(영어 소문자, 대문자)
ㆍ부동소수점 printf(&quot;%e, %E, %f, %lf&quot;, 
exponent, floating_point, long_floating_point);
// 지수 표기, 부동 소수점, 부동 소수점(long)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  포맷스트링 - 부동 소수점 상세&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;div style=&quot;font-weight: bold; margin-bottom: 10px;&quot;&gt;%[-][0][전체자리수].[소수점자리수]스트링&lt;/div&gt;
ㆍ&lt;span style=&quot;font-weight: bold;&quot;&gt; - &lt;/span&gt; : - 를 붙이면 왼쪽 정렬, - 붙이지 않고 [전체자리수] 정해져 있으면 오른쪽 정렬 &lt;br /&gt;ㆍ&lt;span style=&quot;font-weight: bold;&quot;&gt; 0 &lt;/span&gt; : 빈 공간을 0으로 채움 &lt;br /&gt;ㆍ&lt;span style=&quot;font-weight: bold;&quot;&gt; 전체자리수 &lt;/span&gt; : 소수점(.) 포함 &lt;br /&gt;ㆍ&lt;span style=&quot;font-weight: bold;&quot;&gt; 소수점자리수 &lt;/span&gt; : [소수점자리수]만큼 소수점 출력 (반올림) &lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;1.234에 대해 각 포맷 스트링을 적용했을 때
&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #bbb; padding: 5px; background-color: #ccc;&quot;&gt;%-05.lf&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #bbb; padding: 5px; background-color: #ccc;&quot;&gt;%05.lf&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #bbb; padding: 5px; background-color: #ccc;&quot;&gt;%5.lf&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid #bbb; padding: 5px; background-color: #ccc;&quot;&gt;%.2f&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #ccc; padding: 5px;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 표준 입력 함수(scanf) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px;&quot;&gt;ㆍ포맷 스트링으로 데이터 읽음 &lt;br /&gt;ㆍ포맷 스트링은 printf와 동일
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;scanf(&quot;%d %c&quot;, &amp;amp;age, &amp;amp;gender); // &amp;amp;변수 = 변수의 주솟값&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 6 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6️⃣ 연산자(Operator)&lt;/h3&gt;
(1) 연산자 종류 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ증감 연산자 &amp;ensp; ++&amp;ensp;-- &lt;br /&gt;ㆍ산술 &amp;ensp; +&amp;ensp;-&amp;ensp;*&amp;ensp;/&amp;ensp;% &lt;br /&gt;ㆍ시프트 &amp;ensp; &amp;lt;&amp;lt;&amp;ensp;&amp;gt;&amp;gt; &lt;br /&gt;ㆍ관계 &amp;ensp; &amp;gt;&amp;ensp;&amp;lt;&amp;ensp;&amp;gt;=&amp;ensp;&amp;lt;=&amp;ensp;==&amp;ensp;!=&lt;br /&gt;ㆍ비트 &amp;ensp; &amp;amp;&amp;ensp;|&amp;ensp;^(XOR)&amp;ensp;~ &lt;br /&gt;ㆍ논리 &amp;ensp; &amp;amp;&amp;amp;&amp;ensp;||&amp;ensp;! &lt;br /&gt;ㆍ삼항 &amp;ensp; (조건식) ? (참) : (거짓)&lt;br /&gt;ㆍ대입 &amp;ensp;=&amp;ensp;+=&amp;ensp;-=&amp;ensp;*=&amp;ensp;/=&amp;ensp;%= &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) 연산자 우선순위 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-weight: bold; background-color: #eee; font-size: 20px; padding: 5px;&quot;&gt;증감 산술 시프트 관계 비트 논리 삼항 대입&lt;/span&gt; &lt;br /&gt;1.&amp;ensp;x++&amp;ensp;x-- &lt;br /&gt;2.&amp;ensp;++x&amp;ensp;--x &lt;br /&gt;&amp;emsp;! &lt;br /&gt;&amp;emsp;~ &lt;br /&gt;3.&amp;ensp;*&amp;ensp;/&amp;ensp;%&lt;br /&gt;4.&amp;ensp;+&amp;ensp;-&lt;br /&gt;5.&amp;ensp;&amp;lt;&amp;lt;&amp;ensp;&amp;gt;&amp;gt;&lt;br /&gt;6.&amp;ensp;&amp;lt;&amp;ensp;&amp;lt;=&amp;ensp;&amp;gt;&amp;ensp;&amp;gt;=&lt;br /&gt;7.&amp;ensp;==&amp;ensp;!=&lt;br /&gt;8.&amp;ensp;&amp;amp;&lt;br /&gt;9.&amp;ensp;^&lt;br /&gt;10.&amp;ensp;|&lt;br /&gt;11.&amp;ensp;&amp;amp;&amp;amp;&lt;br /&gt;12.&amp;ensp;||&lt;br /&gt;13.&amp;ensp;(조건식) ? (참) : (거짓)&lt;br /&gt;14.&amp;ensp;=&amp;ensp;+=&amp;ensp;-=&amp;ensp;*=&amp;ensp;/=&amp;ensp;%= &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(3) 연산자 상세 &lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
  증감 연산자 (Incremenmt &amp;amp; Decrement Operator) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;x++&amp;ensp;&lt;/span&gt; vs. &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;ensp;++x&lt;/span&gt; 차이점 &lt;br /&gt;ㆍx++&amp;ensp;/&amp;ensp;x-- : 변수 값 사용 -&amp;gt; 값을 1 증가/감소 &lt;br /&gt;ㆍ++x&amp;ensp;/&amp;ensp;--x : 값을 1 증가/감소 -&amp;gt; 변수 값 사용&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  산술 연산자&lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;/ (나누기 연산)&lt;/span&gt; &lt;br /&gt;ㆍ정수 / 정수 = 정수&lt;br /&gt;ㆍ정수 / 실수 = 실수&lt;br /&gt;ㆍ실수 / 정수 = 실수&lt;br /&gt;ㆍ실수 / 실수 = 실수&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;% (나머지 연산)&lt;/span&gt; &lt;br /&gt;ㆍ정수끼리만 사용&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  시프트 연산자 (Shift Operator) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍa&amp;ensp;&amp;lt;&amp;lt;&amp;ensp;b:&amp;ensp;a * 2&lt;sup&gt;b&lt;/sup&gt; &lt;br /&gt;ㆍa&amp;ensp;&amp;gt;&amp;gt;&amp;ensp;b:&amp;ensp;a / 2&lt;sup&gt;b&lt;/sup&gt; &lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  비트 연산자 (Bit Operator) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ&amp;amp; : AND 연산자. 모두 1이면 1, 하나라도 0이면 0&lt;br /&gt;ㆍ| : OR 연산자. 하나라도 1이면 1, 모두 0이면 0&lt;br /&gt;ㆍ^ : XOR 연산자. 서로 다르면 1, 같으면 0&lt;br /&gt;ㆍ~ : NOT 연산자. 0 &amp;harr; 1. 0이면 1, 1이면 0&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;  논리 연산자 (Logic Operator) &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ&amp;amp;&amp;amp; : AND 연산자. 모두 True면 True, 하나라도 Fasle면 False&lt;br /&gt;ㆍ|| : OR 연산자. 하나라도 True면 True, 모두 Fasle면 Fasle&lt;br /&gt;ㆍ! : NOT 연산자. False &amp;harr; True. False면 True, True면 False&lt;br /&gt;ㆍcf : 참이면 1, 거짓이면 0을 반환&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 7 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7️⃣ 조건문&lt;/h3&gt;
(1) if 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ조건의 참 거짓 여부에 따라 경로 선택&lt;br /&gt;ㆍ코드 한 줄일 경우, 중괄호 생략 가능&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) switch 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍ여러 개의 경로 중 하나의 경로 선택&lt;br /&gt;ㆍ경우와 일치하는 case 문 실행&lt;br /&gt;ㆍ경우와 일치하는 case 없으면 default 실행&lt;br /&gt;ㆍbreak 만날 때 까지 계속 실행 (break 없으면 모든 case, default 까지 실행됨)&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;!-- 8 --&gt; &lt;br /&gt;&lt;br /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8️⃣ 반복문&lt;/h3&gt;
(1) while 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;while(조건문){
  명령문;
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ조건문이 참일 동안 명령문 반복 수행&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(2) do while 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;do{
  명령문;
} while(조건문)&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ조건문의 참 거짓 여부에 관련 없이 무조건 반복문 한 번 수행 &lt;br /&gt;ㆍ이후 조건문이 참일 동안 명령문 반복 수행&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(3) for 문 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;
&lt;pre style=&quot;white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; overflow-x: hidden; margin: 0;&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;for(초기식; 조건식; 증감식){
  명령문;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ조건식이 참일 경우 명령문 수행 &lt;br /&gt;ㆍ증감식으로 값 변경, 조건식 참일 경우 명령문 수행 과정을 반복&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;(4) 루프 제어 명령어 &lt;br /&gt;
&lt;div style=&quot;display: inline-block; border: 1.5px solid #ccc; border-radius: 8px; margin-bottom: 10px; margin-top: 10px; padding: 10px; line-height: 1.8;&quot;&gt;ㆍbreak 문- 만나면 즉시 반복문 탈출 &lt;br /&gt;ㆍcontinue 문- 다음 코드를 실행하지 않고 while 문 시작 부분인 조건식으로 돌아와 이후 과정을 수행&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/div&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;06_C언어.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp90y5/dJMcadBiJoK/kcq7Dv6Eq0Cv8xPbsaL45K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp90y5/dJMcadBiJoK/kcq7Dv6Eq0Cv8xPbsaL45K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp90y5/dJMcadBiJoK/kcq7Dv6Eq0Cv8xPbsaL45K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp90y5%2FdJMcadBiJoK%2Fkcq7Dv6Eq0Cv8xPbsaL45K%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;300&quot; height=&quot;295&quot; data-filename=&quot;06_C언어.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>자격증/정보처리기사 - 실기</category>
      <category>C언어</category>
      <category>반복문</category>
      <category>반복문정리</category>
      <category>연산자</category>
      <category>입출력함수</category>
      <category>정보처리기사</category>
      <category>정보처리기사실기</category>
      <category>정처기</category>
      <category>정처기실기</category>
      <category>조건문</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/41</guid>
      <comments>https://rodesi.tistory.com/41#entry41comment</comments>
      <pubDate>Fri, 20 Mar 2026 19:37:44 +0900</pubDate>
    </item>
    <item>
      <title>[대학전쟁3] 양면빙고 웹 개발 09 - UI/UX 개선 및 기능 보완</title>
      <link>https://rodesi.tistory.com/38</link>
      <description>&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-filename=&quot;305 rematch 색 안 변함 (sol).gif&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/psnvb/dJMcaaj1wgX/BKtkhFNRhRAJxqv2ZEhPKk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/psnvb/dJMcaaj1wgX/BKtkhFNRhRAJxqv2ZEhPKk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/psnvb/dJMcaaj1wgX/BKtkhFNRhRAJxqv2ZEhPKk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/psnvb/dJMcaaj1wgX/BKtkhFNRhRAJxqv2ZEhPKk/img.gif&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;1660&quot; height=&quot;602&quot; data-filename=&quot;305 rematch 색 안 변함 (sol).gif&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div id=&quot;code_1771735009082&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;div style=&amp;quot;margin-left: 20px;&amp;quot;&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- 서론 --&amp;gt;
  &amp;lt;h3&amp;gt; 0️⃣ 지난 번까지.. &amp;lt;/h3&amp;gt;
지난 글에서는 2인이 play할 수 있는 기능을 구현했다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
오늘은 이어서 &amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot;&amp;gt;UI/UX 개선&amp;lt;/span&amp;gt; 및 게임 로직 보완을 중심으로 프로젝트 전반을 리팩토링할 것이다.
&amp;lt;/span&amp;gt;


&amp;lt;!-- 목록 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;span style=&amp;quot;font-weight:bold; font-size: 18px;&amp;quot;&amp;gt;
  ☰ &amp;amp;nbsp; 양면빙고 (double-sided-bingo) 개발 과정 &amp;amp;nbsp; &amp;lt;/span&amp;gt;
  &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;div style=&amp;quot;display: inline-block; align-items: center; 
border-radius: 8px; padding: 10px; background-color: #ddd;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;

    &amp;lt;ul style=&amp;quot;margin: 0; padding: 0; list-style-position: inside; gap: 16px;&amp;quot;&amp;gt;
      
    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/19&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 01 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; list, 타일 뒤집기 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/23&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 02 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 list 내 이동 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/25&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 03 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 착수 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    
    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/26&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 04 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 뒤집기, 이동 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/27&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 05 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 빙고 판단, player 2명 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/31&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 06 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 직전 타일 이동, 뒤집기 제한 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/36&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 07 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; timer, highlight, restart &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/37&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 08 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 2인 play &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; 

    &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;



&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 1 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 1️⃣ 게임 전 - 대기 및 설정 (Setup)&amp;lt;/h3&amp;gt;

&amp;lt;!-- 메인 화면 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    메인 화면 CSS 적용 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2F2diF2%2FdJMb99ZTGrS%2FAAAAAAAAAAAAAAAAAAAAAF9SRVPr36jZFoLQXcpG8xaTNBKW-nCyU_UlsQaMHzGT%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3D67htVmyBVBlv8f1vcD7dp75YJbI%253D&amp;quot;
  alt=&amp;quot;메인 화면&amp;quot;
  style=&amp;quot;width: 100%; max-width: 300px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
메인 화면의 UI 개선을 위해 CSS 스타일을 적용했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- 초대코드복사 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    초대 코드 복사 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/djJDAK/dJMcabKbe0m/AAAAAAAAAAAAAAAAAAAAAFDKHaw24U8HmHAwTPACRfwYDHAp9E3yGXcAvPry0FsA/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=7zYAWjfqCqWhzRqkEyM8X1K02lo%3D&amp;quot;
  alt=&amp;quot;초대코드복사&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/LdTTg/dJMcaiiciof/AAAAAAAAAAAAAAAAAAAAAEOM5IEy-EyECS1LBtzDW0wwqw0yCh8828nTrNa24qIh/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=H1tsvkzZMT18bO7cNJWvIm0ElgA%3D&amp;quot;
  alt=&amp;quot;초대코드복사&amp;quot;
  style=&amp;quot;width: 100%; max-width: 200px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
게임방 생성 후 현재 방의 초대 코드가 화면에 표시되도록 구성했다.
사용자가 코드를 클릭하면 자동 복사되며,
복사 되었음을 시각적으로 전달하기 위해
CSS의 @keyframes을 활용하여 초대 코드 크기가 축소 후 다시 되돌아오는 애니메이션을 추가했다.
이를 통해 플레이어 간 빠른 초대가 가능하도록 개선했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- 게임 시작 3초 딜레이 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    3초 후 게임 시작 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/eGJ9TP/dJMcaadp4y7/AAAAAAAAAAAAAAAAAAAAAKBbqlNSj3ECtMO3nhpIXzo7z33UwCG_hQsjXm4RBINx/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=Idw6pbpC7Ap6WZPycZWdBi8L8YE%3D&amp;quot;
  alt=&amp;quot;3초후게임시작&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
두 플레이어가 모두 입장하면 즉시 게임이 시작되는 대신
게임 시작 전 3초의 카운트다운을 거친 후 게임이 시작되도록 로직을 수정했다.
카운트다운은 3-2-1 숫자가 화면 중앙에 화면에 애니메이션으로 구성해
게임 시작 시점을 직관적으로 인지할 수 있도록 UX를 개선했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- 입장제한 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    입장 제한 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/mjv2M/dJMcaaR2dyH/AAAAAAAAAAAAAAAAAAAAADWyfKCwRPnlcwPq6Um8y8_ZMFw0n2-hVI6YJwv6Z6F1/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=M7yH7B3khYn1%2Fk9QHtk3m%2Bgb%2Bwo%3D&amp;quot;
  alt=&amp;quot;입장제한&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
player 정원을 2명으로 제한해
방의 인원 정원이 초과된 경우에는
추가 입장이 불가하도록 입장 제한 로직을 구현했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 2 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 2️⃣ 게임 중 - 진행 단계 (In-Game)&amp;lt;/h3&amp;gt;

&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    시간 set &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;!-- 시간set (img) --&amp;gt;
&amp;lt;span&amp;gt;
  ❓ 타일 리스트에서 뒤집기, 정렬 시 timer reset &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/BFHNN/dJMcagknmgV/AAAAAAAAAAAAAAAAAAAAABvYdVuDFZLuEkkJrMihdYM8358C6-fh28rO5gTkuMcN/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=5pkJVM9l0eNWNbfjbcPGAiTVPAU%3D&amp;quot;
  alt=&amp;quot;시간set&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
현재는 playing 상태에서 모든 snapshot마다 타이머가 갱신되고 있다.
그 결과 타일 리스트 정렬 및 뒤집기와 같은 단순 UI 상호작용에도 시간이 갱신되는 문제가 발생했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;span&amp;gt;
    문제 해결 (Game.js) &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/bGNaWi/dJMcaaka63E/AAAAAAAAAAAAAAAAAAAAAIR0uwVOPh3bxl4TcCsLRRT0D3JrDS-x3-1pQAjNMlbN/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=IIzW4SZl545MDuCgRMHyrORDI5Q%3D&amp;quot;
  alt=&amp;quot;시간set&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
기존에는 아래 조건문으로 인해 snapshot 변경 시마다 타이머가 초기화되는 문제가 발생했다.
Game.js의 함수 applyRoomSnapshot 내부의 타이머 초기화 로직을 제거해
타이머가 턴 변경 시에만 reset되도록 수정했다.
&amp;lt;!-- 코드 --&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;- if (roomDoc.status === &amp;quot;playing&amp;quot; &amp;amp;&amp;amp; !roomDoc.winner) &amp;amp;#123;
-   setTimeLeft(TURN_LIMIT);
- &amp;amp;#125; &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    turn 변경 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;!-- 시간set (img) --&amp;gt;
&amp;lt;span&amp;gt;
  ❓ time out 시 turn 변경 안 됨 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/dAGgCu/dJMcafFMZXe/AAAAAAAAAAAAAAAAAAAAAFPf19j5cVzn2t2ZvzyjGyfVgGcwS-HY22mDkSAQem_b/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=KcmG%2BcmK1zhN9x4tV0Xm4zhg8Mg%3D&amp;quot;
  alt=&amp;quot;turn변경&amp;quot;
  style=&amp;quot;width: 100%; max-width: 200px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
현재는 타이머 제한 시간이 종료되어도 턴이 변경되지 않는 문제가 있다.
타임아웃 처리가 로컬 타이머(UI)에서만 수행되어
서버 상태(currentTurn)가 갱신되지 않아 
상대 플레이어로 턴이 넘어가지 않았던 것이다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;span&amp;gt;
    문제 해결 (roomService.js, Game.js) &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/btgOpJ/dJMcadOFQdb/AAAAAAAAAAAAAAAAAAAAAEeE3j5YK0GmR9T_HPuOE5hrATPiGSJxj7PyT40ULJro/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=xLc3TxYo9UQe3n0CDc8OlfbzCd0%3D&amp;quot;
  alt=&amp;quot;turn변경&amp;quot;
  style=&amp;quot;width: 100%; max-width: 200px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
타임아웃 발생 시 서버 트랜잭션을 통해 턴을 명시적으로 넘기도록 수정했다.
이를 위해 서버에서 안전하게 턴을 전환하는 함수를 구현하고
로컬 타이머 종료 시 해당 함수를 호출하도록 구조를 변경했다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

ㆍ roomService.js: 서버에서 안전하게 턴 전환 함수 구현 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ Game.js: 로컬 타이머 종료 시 서버 함수를 호출하도록 수정하고 중복 호출 방지 로직 추가
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- roomService 코드 --&amp;gt;
&amp;lt;details&amp;gt;
  &amp;lt;summary&amp;gt;
&amp;lt;span&amp;gt;
    roomService.js &amp;lt;/span&amp;gt; &amp;lt;/summary&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;export async function handleTurnTimeout(&amp;amp;#123; roomId, timedOutUid &amp;amp;#125;) &amp;amp;#123;
  if (!roomId) throw new Error(&amp;quot;roomId required&amp;quot;);
  if (!timedOutUid) throw new Error(&amp;quot;timedOutUid required&amp;quot;);

  const roomRef = doc(db, &amp;quot;rooms&amp;quot;, roomId);

  try &amp;amp;#123;
    const result = await runTransaction(db, async (tx) =&amp;amp;gt; &amp;amp;#123;
      const snap = await tx.get(roomRef);
      if (!snap.exists()) return &amp;amp;#123; updated: false, reason: &amp;quot;ROOM_NOT_FOUND&amp;quot; &amp;amp;#125;;

      const room = snap.data();

      // 상태/승자 검증
      if (room.status !== &amp;quot;playing&amp;quot;) return &amp;amp;#123; updated: false, reason: &amp;quot;NOT_PLAYING&amp;quot; &amp;amp;#125;;
      if (room.winner) return &amp;amp;#123; updated: false, reason: &amp;quot;ALREADY_ENDED&amp;quot; &amp;amp;#125;;

      // 현재 턴 확인 (중복/경합 방지)
      if (room.currentTurn !== timedOutUid) return &amp;amp;#123; updated: false, reason: &amp;quot;TURN_CHANGED&amp;quot; &amp;amp;#125;;

      const players = room.players || &amp;amp;#123;&amp;amp;#125;;
      const playerUids = Object.keys(players);
      if (playerUids.length &amp;amp;lt; 1) return &amp;amp;#123; updated: false, reason: &amp;quot;NO_PLAYERS&amp;quot; &amp;amp;#125;;

      // turn 넘기기
      const nextUid = getNextTurnUid(players, timedOutUid);
      if (!nextUid) return &amp;amp;#123; updated: false, reason: &amp;quot;NO_OTHER_PLAYER&amp;quot; &amp;amp;#125;;

      // DB 업데이트 - turnCount 증가 X
      const updateData = &amp;amp;#123;
        currentTurn: nextUid,
        lastAction: &amp;amp;#123;
          type: &amp;quot;TIMEOUT&amp;quot;,
          actorUid: timedOutUid,
          ts: serverTimestamp(),
        &amp;amp;#125;,
        lastTimeoutAt: serverTimestamp(),
      &amp;amp;#125;;

      tx.update(roomRef, updateData);

      return &amp;amp;#123; updated: true, newTurn: nextUid &amp;amp;#125;;
    &amp;amp;#125;);

    return result;
  &amp;amp;#125; catch (err) &amp;amp;#123;
    console.error(&amp;quot;handleTurnTimeout transaction failed:&amp;quot;, err);
    throw err;
  &amp;amp;#125;
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;/details&amp;gt;
&amp;lt;br&amp;gt;
ㆍ 트랜잭션 내에서 현재 룸 상태 검증: &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;amp;emsp;- 방 존재, status === &amp;quot;playing&amp;quot;, winner 없음 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;amp;emsp;- room.currentTurn이 timedOutUid(타임아웃 당한 플레이어)와 동일한지 확인&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ currentTurn을 상대 플레이어로 변경 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ lastAction에 { type: &amp;quot;TIMEOUT&amp;quot;, actorUid: timedOutUid, ts: serverTimestamp() } 기록 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ 반환값으로 성공여부와 새 currentTurn 반환
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- Game 코드 --&amp;gt;
&amp;lt;details&amp;gt;
  &amp;lt;summary&amp;gt;
&amp;lt;span&amp;gt;
    Game.js &amp;lt;/span&amp;gt; &amp;lt;/summary&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;setTimeLeft((prev) =&amp;amp;gt; &amp;amp;#123;
  if (prev &amp;amp;lt;= 1) &amp;amp;#123;
  // 타임아웃 시도는 currentTurn이 내 uid일 때만 실행
  if (currentTurn === myUid &amp;amp;&amp;amp; !timeoutCallingRef.current) &amp;amp;#123;
    timeoutCallingRef.current = true;
    (async () =&amp;amp;gt; &amp;amp;#123;
      try &amp;amp;#123;
        const res = await handleTurnTimeout(&amp;amp;#123; roomId, timedOutUid: currentTurn &amp;amp;#125;);     
        setTimeLeft(TURN_LIMIT);
      &amp;amp;#125; catch (err) &amp;amp;#123;
        console.error(&amp;quot;handleTurnTimeout failed&amp;quot;, err);
        // 실패 시 안전하게 리셋
        setTimeLeft(TURN_LIMIT);
      &amp;amp;#125; finally &amp;amp;#123;
        timeoutCallingRef.current = false;
      &amp;amp;#125;
    &amp;amp;#125;)();
  &amp;amp;#125; else &amp;amp;#123;
    setTimeLeft(TURN_LIMIT);
  &amp;amp;#125;
  return TURN_LIMIT; // 현재 20초 제한 (추후 수정)
&amp;amp;#125;
  return prev - 1;
&amp;amp;#125;);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;/details&amp;gt;
&amp;lt;br&amp;gt;
ㆍ 로컬 타이머가 0이 되었을 때 오직 현재 턴을 가진 플레이어의 클라이언트만
서버에 handleTurnTimeout 호출을 시도
(동시 호출이 발생하더라도 서버 트랜잭션으로 안전하게 보호됨) &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ 중복 호출 방지를 위해 timeoutCallingRef 도입 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ 호출 성공/실패 후 timeLeft를 재설정
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- exit (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    상대방 나갈 시 게임 종료 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
중도 퇴장 시 게임 종료 및 승패 처리 로직을 구현했다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;span&amp;gt;
  버튼 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/crolWF/dJMcad2dmxz/AAAAAAAAAAAAAAAAAAAAAMtIOfrGQQLZwr63aB19yPeQluuWKeL3Xkvp3P303c5w/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=aPci00z0z1shzxA5rQHzCHgST8c%3D&amp;quot;
  alt=&amp;quot;exit&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
게임 중 플레이어가 '나가기' 버튼으로 세션을 이탈하면 게임을 즉시 종료하고
남은 플레이어에게는 모달창으로 상대의 이탈과 승리 결과를 알리도록 구현했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;span&amp;gt;
  뒤로 가기 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/lxJiG/dJMcahwQF40/AAAAAAAAAAAAAAAAAAAAAFoLx8w6ajFist98lbmXbkjoTrFQqGyaP0T4Y5I9SFpx/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=DHAfDUMIpHtJwQCcjlPnUmot4FI%3D&amp;quot;
  alt=&amp;quot;exit&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
게임 중 플레이어가 '뒤로 가기' 로 세션을 이탈하면 게임을 즉시 종료하고
남은 플레이어에게는 모달창으로 상대의 이탈과 승리 결과를 알리도록 구현했다.



&amp;lt;!-- 3 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 3️⃣ 게임 후 - 결과 및 피드백 (Outcome)&amp;lt;/h3&amp;gt;

&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    빙고 완성 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;!-- 시간set (img) --&amp;gt;
&amp;lt;span&amp;gt;
  ❓ 둘의 main color가 아닌데 빙고가 완성됨 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbvhQj7%2FdJMcahcwoS9%2FAAAAAAAAAAAAAAAAAAAAABpKvSIqSQeTvs0U8z-mK11bGT0tuwO1r3hdcuOi04ye%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DrPnaMPf6kvh1wjiOnkSEJrDKxvM%253D&amp;quot;
  alt=&amp;quot;빙고완성&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
player의 main color가 아닌 타일 조합에서도 빙고 라인이 감지되어 게임이 종료되는 문제가 발생했다.
&amp;lt;!-- 문제 코드 --&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;// 승자 set
if (!serverWinner &amp;amp;&amp;amp; uidWithColor) setServerWinner(uidWithColor);
// 빙고 line set
setWinningLine(found);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;span&amp;gt;
    문제 해결 (Game.js) &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbADTmK%2FdJMcaivHLAd%2FAAAAAAAAAAAAAAAAAAAAAJx_0Wy7k5JIjkshpzaTb-cyj_8GIcfVd70zeQ7kKQlW%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DdX2i499Lag5jjvxytFFvc%252BWHl8U%253D&amp;quot;
  alt=&amp;quot;시간set&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
기존 로직은 특정 줄에서 빙고 라인이 탐지 되면
main color와 무관한 빙고 라인 완성 시에도 승자 설정 로직이 실행되어 게임이 종료되는 문제가 있었다.
이를 해결하기 위해 player의 main color로 빙고가 완성된 경우에만 승자 설정 및 빙고 라인이 표시되도록 로직을 수정했다.
&amp;lt;!-- 코드 --&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;if (uidWithColor) &amp;amp;#123;
  setWinningLine(found); // 빙고 line set
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- rematch 모달 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    rematch 모달창 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/bcuoTc/dJMcaaEuP5d/AAAAAAAAAAAAAAAAAAAAAEv4VzK_4e43-Ev5AJ6qF9YKy4WdrnuZiIm8Pq3ui4mY/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=whzAO0AFkR%2FibWk3m4WYlJL8nQM%3D&amp;quot;
  alt=&amp;quot;rematch모달&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
게임 종료 시 단순히 'rematch' 버튼만 보여주는 것이 아니라 대화형 리매치 모달을 띄우도록 구현했다.

UI/UX 측면에서 요청, 대기, 수신, 응답의 각 상태 전환에 맞춰
모달 메시지가 동적으로 변경되도록 구현해 즉각적인 시각적 피드백을 제공했다.
이를 통해 player가 진행 상황을 명확히 인지할 수 있도록 했으며
단순 대기 시간을 인터랙티브한 경험으로 전환하도록 설계했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- 모달 승자 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    모달창 승자 표시 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FXMIHi%2FdJMcagdDCAs%2FAAAAAAAAAAAAAAAAAAAAALZ5Wc3ML-xpx3FOgRl7hAh6aaoJwZStIxubUc2Vw25A%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DrFgELDAx0Dl5Cg1gibNzr2Z0Q8Y%253D&amp;quot;
  alt=&amp;quot;모달창승자표시&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
게임 종료 시 플레이어가 결과를 즉각적으로 인지할 수 있도록
모달창 상단에 You win / You lose 메시지를 배치해
플레이어가 승패 결과를 한눈에 확인할 수 있는 직관적인 UI를 구현했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    rematch 시 main color &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;!-- 시간set (img) --&amp;gt;
&amp;lt;span&amp;gt;
  ❓ rematch 시 main color가 계속 유지됨 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/tE1d2/dJMcaaqWSnQ/AAAAAAAAAAAAAAAAAAAAAA1sSeXaAVUBr7spVr7MfqiHHh-BDHrMDWM7Q1mt2vON/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=6cmG12XnO0rEhpUH%2Fo5ksU3S%2BsE%3D&amp;quot;
  alt=&amp;quot;rematch&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
rematch 시 이전 게임에서 부여받은 각각의 main color가 그대로 유지되는 문제가 있다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 

&amp;lt;span&amp;gt;
    문제 해결 (roomService.js) &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/SY46P/dJMcabDorfq/AAAAAAAAAAAAAAAAAAAAAJL0CGJ7it62FMWedPcsBGwWc3grPGClPh4eWzlbRPDa/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=dKrFTvHUY92qgavpA7O%2FeUXX%2B8I%3D&amp;quot;
  alt=&amp;quot;rematch&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
이는 rematch 초기화 과정에서 플레이어 색상 재할당 로직이 제대로 수행되지 않았기 때문이다.
이를 해결하기 위해 rematch 시 기존에 작성한 assignRandomColors 함수를 호출해
main color가 무작위로 다시 배정되도록 수정했다.
&amp;lt;!-- 코드 --&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const hostUid = room.hostUid || playerUids[0];
const otherUid = playerUids.find(u =&amp;gt; u !== hostUid) || hostUid;

const updatedPlayers = assignRandomColors(newPlayers, hostUid, otherUid); // random으로 색 다시 배정
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 




&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 4 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 4️⃣ 시스템(System) 및 공통 로직&amp;lt;/h3&amp;gt;

&amp;lt;!-- 메인 화면 / 게임 화면 링크 분리 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
   라우팅(Routing) 분리 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FpwvL6%2FdJMcac94uPE%2FAAAAAAAAAAAAAAAAAAAAAHGDQqqQR3elzoA4BuVmtITyb8erH2XJXGGgkhvKOtGo%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DoowXJ%252FKjU1qavfPLav3OgeAUZGU%253D&amp;quot;
  alt=&amp;quot;메인화면&amp;quot;
  style=&amp;quot;width: 100%; max-width: 300px; height: auto; margin-right: 30px;&amp;quot;
&amp;gt;
&amp;lt;img
  src=&amp;quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FrJC5w%2FdJMcac3kEX2%2FAAAAAAAAAAAAAAAAAAAAAOmsVeRj2ctvQwYc10QFFjhkLRatPqNeghS0dA0JbDTZ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DisihJSP5BhBHPTXi1ZALZ4xSsiQ%253D&amp;quot;
  alt=&amp;quot;게임화면&amp;quot;
  style=&amp;quot;width: 100%; max-width: 300px; height: auto;&amp;quot;
&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:15px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
메인 화면과 게임 화면의 역할을 명확히 분리하기 위해 라우팅 구조를 분리했다.
기존에는 하나의 흐름에서 화면 상태로만 전환되던 구조였으나
/home과 /game 경로를 각각 독립적으로 구성해 화면 책임을 분리하고 네비게이션 흐름을 명확히 했다.
이를 통해 진입 로직, 게임 세션 관리, 예외 처리 등을 화면 단위로 관리할 수 있도록 구조를 개선했다.



&amp;lt;!-- 앞으로 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;h3&amp;gt; 5️⃣ 앞으로... &amp;lt;/h3&amp;gt;
이제 자잘한 오류들을 거의 다 잡았다..
끝이 보이는데 끝이 보이질 않는다.

&amp;lt;span style=&amp;quot;text-decoration: line-through;&amp;quot;&amp;gt;3월 되기전에는 끝ㄴ내야지&amp;lt;/span&amp;gt;

&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;/div&amp;gt;&quot;&gt;
&lt;div style=&quot;margin-left: 20px;&quot;&gt;&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 서론 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0️⃣ 지난 번까지..&lt;/h3&gt;
지난 글에서는 2인이 play할 수 있는 기능을 구현했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
오늘은 이어서 &lt;span style=&quot;text-decoration: underline;&quot;&gt;UI/UX 개선&lt;/span&gt; 및 게임 로직 보완을 중심으로 프로젝트 전반을 리팩토링할 것이다. &lt;!-- 목록 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span style=&quot;font-weight: bold; font-size: 18px;&quot;&gt; ☰ &amp;nbsp; 양면빙고 (double-sided-bingo) 개발 과정 &amp;nbsp; &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border-radius: 8px; padding: 10px; background-color: #ddd;&quot;&gt;
&lt;div style=&quot;display: inline-block;&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/19&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 01 - &lt;span style=&quot;font-weight: bold;&quot;&gt; list, 타일 뒤집기 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/23&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 02 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 list 내 이동 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/25&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 03 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 착수 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/26&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 04 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 뒤집기, 이동 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/27&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 05 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 빙고 판단, player 2명 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/31&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 06 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 직전 타일 이동, 뒤집기 제한 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/36&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 07 - &lt;span style=&quot;font-weight: bold;&quot;&gt; timer, highlight, restart &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/37&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 08 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 2인 play &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 본론 --&gt; &lt;!-- 1 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 게임 전 - 대기 및 설정 (Setup)&lt;/h3&gt;
&lt;!-- 메인 화면 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   메인 화면 CSS 적용 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 300px; height: auto;&quot; src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2F2diF2%2FdJMb99ZTGrS%2FAAAAAAAAAAAAAAAAAAAAAF9SRVPr36jZFoLQXcpG8xaTNBKW-nCyU_UlsQaMHzGT%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3D67htVmyBVBlv8f1vcD7dp75YJbI%253D&quot; alt=&quot;메인 화면&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
메인 화면의 UI 개선을 위해 CSS 스타일을 적용했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 초대코드복사 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   초대 코드 복사 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/djJDAK/dJMcabKbe0m/AAAAAAAAAAAAAAAAAAAAAFDKHaw24U8HmHAwTPACRfwYDHAp9E3yGXcAvPry0FsA/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=7zYAWjfqCqWhzRqkEyM8X1K02lo%3D&quot; alt=&quot;초대코드복사&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 200px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/LdTTg/dJMcaiiciof/AAAAAAAAAAAAAAAAAAAAAEOM5IEy-EyECS1LBtzDW0wwqw0yCh8828nTrNa24qIh/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=H1tsvkzZMT18bO7cNJWvIm0ElgA%3D&quot; alt=&quot;초대코드복사&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
게임방 생성 후 현재 방의 초대 코드가 화면에 표시되도록 구성했다. 사용자가 코드를 클릭하면 자동 복사되며, 복사 되었음을 시각적으로 전달하기 위해 CSS의 @keyframes을 활용하여 초대 코드 크기가 축소 후 다시 되돌아오는 애니메이션을 추가했다. 이를 통해 플레이어 간 빠른 초대가 가능하도록 개선했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 게임 시작 3초 딜레이 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   3초 후 게임 시작 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/eGJ9TP/dJMcaadp4y7/AAAAAAAAAAAAAAAAAAAAAKBbqlNSj3ECtMO3nhpIXzo7z33UwCG_hQsjXm4RBINx/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=Idw6pbpC7Ap6WZPycZWdBi8L8YE%3D&quot; alt=&quot;3초후게임시작&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
두 플레이어가 모두 입장하면 즉시 게임이 시작되는 대신 게임 시작 전 3초의 카운트다운을 거친 후 게임이 시작되도록 로직을 수정했다. 카운트다운은 3-2-1 숫자가 화면 중앙에 화면에 애니메이션으로 구성해 게임 시작 시점을 직관적으로 인지할 수 있도록 UX를 개선했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 입장제한 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   입장 제한 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/mjv2M/dJMcaaR2dyH/AAAAAAAAAAAAAAAAAAAAADWyfKCwRPnlcwPq6Um8y8_ZMFw0n2-hVI6YJwv6Z6F1/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=M7yH7B3khYn1%2Fk9QHtk3m%2Bgb%2Bwo%3D&quot; alt=&quot;입장제한&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
player 정원을 2명으로 제한해 방의 인원 정원이 초과된 경우에는 추가 입장이 불가하도록 입장 제한 로직을 구현했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 본론 --&gt; &lt;!-- 2 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 게임 중 - 진행 단계 (In-Game)&lt;/h3&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;   시간 set &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 시간set (img) --&gt; &lt;span&gt; ❓ 타일 리스트에서 뒤집기, 정렬 시 timer reset &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/BFHNN/dJMcagknmgV/AAAAAAAAAAAAAAAAAAAAABvYdVuDFZLuEkkJrMihdYM8358C6-fh28rO5gTkuMcN/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=5pkJVM9l0eNWNbfjbcPGAiTVPAU%3D&quot; alt=&quot;시간set&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
현재는 playing 상태에서 모든 snapshot마다 타이머가 갱신되고 있다. 그 결과 타일 리스트 정렬 및 뒤집기와 같은 단순 UI 상호작용에도 시간이 갱신되는 문제가 발생했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span&gt;   문제 해결 (Game.js) &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/bGNaWi/dJMcaaka63E/AAAAAAAAAAAAAAAAAAAAAIR0uwVOPh3bxl4TcCsLRRT0D3JrDS-x3-1pQAjNMlbN/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=IIzW4SZl545MDuCgRMHyrORDI5Q%3D&quot; alt=&quot;시간set&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
기존에는 아래 조건문으로 인해 snapshot 변경 시마다 타이머가 초기화되는 문제가 발생했다. Game.js의 함수 applyRoomSnapshot 내부의 타이머 초기화 로직을 제거해 타이머가 턴 변경 시에만 reset되도록 수정했다. &lt;!-- 코드 --&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;- if (roomDoc.status === &quot;playing&quot; &amp;amp;&amp;amp; !roomDoc.winner) {
-   setTimeLeft(TURN_LIMIT);
- } &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;   turn 변경 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 시간set (img) --&gt; &lt;span&gt; ❓ time out 시 turn 변경 안 됨 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 200px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/dAGgCu/dJMcafFMZXe/AAAAAAAAAAAAAAAAAAAAAFPf19j5cVzn2t2ZvzyjGyfVgGcwS-HY22mDkSAQem_b/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=KcmG%2BcmK1zhN9x4tV0Xm4zhg8Mg%3D&quot; alt=&quot;turn변경&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
현재는 타이머 제한 시간이 종료되어도 턴이 변경되지 않는 문제가 있다. 타임아웃 처리가 로컬 타이머(UI)에서만 수행되어 서버 상태(currentTurn)가 갱신되지 않아 상대 플레이어로 턴이 넘어가지 않았던 것이다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span&gt;   문제 해결 (roomService.js, Game.js) &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 200px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/btgOpJ/dJMcadOFQdb/AAAAAAAAAAAAAAAAAAAAAEeE3j5YK0GmR9T_HPuOE5hrATPiGSJxj7PyT40ULJro/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=xLc3TxYo9UQe3n0CDc8OlfbzCd0%3D&quot; alt=&quot;turn변경&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
타임아웃 발생 시 서버 트랜잭션을 통해 턴을 명시적으로 넘기도록 수정했다. 이를 위해 서버에서 안전하게 턴을 전환하는 함수를 구현하고 로컬 타이머 종료 시 해당 함수를 호출하도록 구조를 변경했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ roomService.js: 서버에서 안전하게 턴 전환 함수 구현 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ Game.js: 로컬 타이머 종료 시 서버 함수를 호출하도록 수정하고 중복 호출 방지 로직 추가 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- roomService 코드 --&gt;&lt;details&gt;
&lt;summary&gt;&lt;span&gt;   roomService.js &lt;/span&gt;&lt;/summary&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;export async function handleTurnTimeout({ roomId, timedOutUid }) {
  if (!roomId) throw new Error(&quot;roomId required&quot;);
  if (!timedOutUid) throw new Error(&quot;timedOutUid required&quot;);

  const roomRef = doc(db, &quot;rooms&quot;, roomId);

  try {
    const result = await runTransaction(db, async (tx) =&amp;gt; {
      const snap = await tx.get(roomRef);
      if (!snap.exists()) return { updated: false, reason: &quot;ROOM_NOT_FOUND&quot; };

      const room = snap.data();

      // 상태/승자 검증
      if (room.status !== &quot;playing&quot;) return { updated: false, reason: &quot;NOT_PLAYING&quot; };
      if (room.winner) return { updated: false, reason: &quot;ALREADY_ENDED&quot; };

      // 현재 턴 확인 (중복/경합 방지)
      if (room.currentTurn !== timedOutUid) return { updated: false, reason: &quot;TURN_CHANGED&quot; };

      const players = room.players || {};
      const playerUids = Object.keys(players);
      if (playerUids.length &amp;lt; 1) return { updated: false, reason: &quot;NO_PLAYERS&quot; };

      // turn 넘기기
      const nextUid = getNextTurnUid(players, timedOutUid);
      if (!nextUid) return { updated: false, reason: &quot;NO_OTHER_PLAYER&quot; };

      // DB 업데이트 - turnCount 증가 X
      const updateData = {
        currentTurn: nextUid,
        lastAction: {
          type: &quot;TIMEOUT&quot;,
          actorUid: timedOutUid,
          ts: serverTimestamp(),
        },
        lastTimeoutAt: serverTimestamp(),
      };

      tx.update(roomRef, updateData);

      return { updated: true, newTurn: nextUid };
    });

    return result;
  } catch (err) {
    console.error(&quot;handleTurnTimeout transaction failed:&quot;, err);
    throw err;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;&lt;br /&gt;ㆍ 트랜잭션 내에서 현재 룸 상태 검증: &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&amp;emsp;- 방 존재, status === &quot;playing&quot;, winner 없음 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&amp;emsp;- room.currentTurn이 timedOutUid(타임아웃 당한 플레이어)와 동일한지 확인&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ currentTurn을 상대 플레이어로 변경 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ lastAction에 { type: &quot;TIMEOUT&quot;, actorUid: timedOutUid, ts: serverTimestamp() } 기록 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ 반환값으로 성공여부와 새 currentTurn 반환 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- Game 코드 --&gt;&lt;details&gt;
&lt;summary&gt;&lt;span&gt;   Game.js &lt;/span&gt;&lt;/summary&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;setTimeLeft((prev) =&amp;gt; {
  if (prev &amp;lt;= 1) {
  // 타임아웃 시도는 currentTurn이 내 uid일 때만 실행
  if (currentTurn === myUid &amp;amp;&amp;amp; !timeoutCallingRef.current) {
    timeoutCallingRef.current = true;
    (async () =&amp;gt; {
      try {
        const res = await handleTurnTimeout({ roomId, timedOutUid: currentTurn });     
        setTimeLeft(TURN_LIMIT);
      } catch (err) {
        console.error(&quot;handleTurnTimeout failed&quot;, err);
        // 실패 시 안전하게 리셋
        setTimeLeft(TURN_LIMIT);
      } finally {
        timeoutCallingRef.current = false;
      }
    })();
  } else {
    setTimeLeft(TURN_LIMIT);
  }
  return TURN_LIMIT; // 현재 20초 제한 (추후 수정)
}
  return prev - 1;
});&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;&lt;br /&gt;ㆍ 로컬 타이머가 0이 되었을 때 오직 현재 턴을 가진 플레이어의 클라이언트만 서버에 handleTurnTimeout 호출을 시도 (동시 호출이 발생하더라도 서버 트랜잭션으로 안전하게 보호됨) &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ 중복 호출 방지를 위해 timeoutCallingRef 도입 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ 호출 성공/실패 후 timeLeft를 재설정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- exit (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   상대방 나갈 시 게임 종료 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
중도 퇴장 시 게임 종료 및 승패 처리 로직을 구현했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span&gt;   버튼 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/crolWF/dJMcad2dmxz/AAAAAAAAAAAAAAAAAAAAAMtIOfrGQQLZwr63aB19yPeQluuWKeL3Xkvp3P303c5w/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=aPci00z0z1shzxA5rQHzCHgST8c%3D&quot; alt=&quot;exit&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
게임 중 플레이어가 '나가기' 버튼으로 세션을 이탈하면 게임을 즉시 종료하고 남은 플레이어에게는 모달창으로 상대의 이탈과 승리 결과를 알리도록 구현했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span&gt;   뒤로 가기 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/lxJiG/dJMcahwQF40/AAAAAAAAAAAAAAAAAAAAAFoLx8w6ajFist98lbmXbkjoTrFQqGyaP0T4Y5I9SFpx/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=DHAfDUMIpHtJwQCcjlPnUmot4FI%3D&quot; alt=&quot;exit&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
게임 중 플레이어가 '뒤로 가기' 로 세션을 이탈하면 게임을 즉시 종료하고 남은 플레이어에게는 모달창으로 상대의 이탈과 승리 결과를 알리도록 구현했다. &lt;!-- 3 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 게임 후 - 결과 및 피드백 (Outcome)&lt;/h3&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;   빙고 완성 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 시간set (img) --&gt; &lt;span&gt; ❓ 둘의 main color가 아닌데 빙고가 완성됨 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbvhQj7%2FdJMcahcwoS9%2FAAAAAAAAAAAAAAAAAAAAABpKvSIqSQeTvs0U8z-mK11bGT0tuwO1r3hdcuOi04ye%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DrPnaMPf6kvh1wjiOnkSEJrDKxvM%253D&quot; alt=&quot;빙고완성&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
player의 main color가 아닌 타일 조합에서도 빙고 라인이 감지되어 게임이 종료되는 문제가 발생했다. &lt;!-- 문제 코드 --&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 승자 set
if (!serverWinner &amp;amp;&amp;amp; uidWithColor) setServerWinner(uidWithColor);
// 빙고 line set
setWinningLine(found);&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span&gt;   문제 해결 (Game.js) &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbADTmK%2FdJMcaivHLAd%2FAAAAAAAAAAAAAAAAAAAAAJx_0Wy7k5JIjkshpzaTb-cyj_8GIcfVd70zeQ7kKQlW%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DdX2i499Lag5jjvxytFFvc%252BWHl8U%253D&quot; alt=&quot;시간set&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
기존 로직은 특정 줄에서 빙고 라인이 탐지 되면 main color와 무관한 빙고 라인 완성 시에도 승자 설정 로직이 실행되어 게임이 종료되는 문제가 있었다. 이를 해결하기 위해 player의 main color로 빙고가 완성된 경우에만 승자 설정 및 빙고 라인이 표시되도록 로직을 수정했다. &lt;!-- 코드 --&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;if (uidWithColor) {
  setWinningLine(found); // 빙고 line set
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- rematch 모달 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   rematch 모달창 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/bcuoTc/dJMcaaEuP5d/AAAAAAAAAAAAAAAAAAAAAEv4VzK_4e43-Ev5AJ6qF9YKy4WdrnuZiIm8Pq3ui4mY/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=whzAO0AFkR%2FibWk3m4WYlJL8nQM%3D&quot; alt=&quot;rematch모달&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
게임 종료 시 단순히 'rematch' 버튼만 보여주는 것이 아니라 대화형 리매치 모달을 띄우도록 구현했다. UI/UX 측면에서 요청, 대기, 수신, 응답의 각 상태 전환에 맞춰 모달 메시지가 동적으로 변경되도록 구현해 즉각적인 시각적 피드백을 제공했다. 이를 통해 player가 진행 상황을 명확히 인지할 수 있도록 했으며 단순 대기 시간을 인터랙티브한 경험으로 전환하도록 설계했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 모달 승자 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   모달창 승자 표시 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FXMIHi%2FdJMcagdDCAs%2FAAAAAAAAAAAAAAAAAAAAALZ5Wc3ML-xpx3FOgRl7hAh6aaoJwZStIxubUc2Vw25A%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DrFgELDAx0Dl5Cg1gibNzr2Z0Q8Y%253D&quot; alt=&quot;모달창승자표시&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
게임 종료 시 플레이어가 결과를 즉각적으로 인지할 수 있도록 모달창 상단에 You win / You lose 메시지를 배치해 플레이어가 승패 결과를 한눈에 확인할 수 있는 직관적인 UI를 구현했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;   rematch 시 main color &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 시간set (img) --&gt; &lt;span&gt; ❓ rematch 시 main color가 계속 유지됨 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/tE1d2/dJMcaaqWSnQ/AAAAAAAAAAAAAAAAAAAAAA1sSeXaAVUBr7spVr7MfqiHHh-BDHrMDWM7Q1mt2vON/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=6cmG12XnO0rEhpUH%2Fo5ksU3S%2BsE%3D&quot; alt=&quot;rematch&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
rematch 시 이전 게임에서 부여받은 각각의 main color가 그대로 유지되는 문제가 있다. &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;span&gt;   문제 해결 (roomService.js) &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/SY46P/dJMcabDorfq/AAAAAAAAAAAAAAAAAAAAAJL0CGJ7it62FMWedPcsBGwWc3grPGClPh4eWzlbRPDa/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=dKrFTvHUY92qgavpA7O%2FeUXX%2B8I%3D&quot; alt=&quot;rematch&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
이는 rematch 초기화 과정에서 플레이어 색상 재할당 로직이 제대로 수행되지 않았기 때문이다. 이를 해결하기 위해 rematch 시 기존에 작성한 assignRandomColors 함수를 호출해 main color가 무작위로 다시 배정되도록 수정했다. &lt;!-- 코드 --&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const hostUid = room.hostUid || playerUids[0];
const otherUid = playerUids.find(u =&amp;gt; u !== hostUid) || hostUid;

const updatedPlayers = assignRandomColors(newPlayers, hostUid, otherUid); // random으로 색 다시 배정
&lt;/code&gt;&lt;/pre&gt;
&lt;!-- 본론 --&gt; &lt;!-- 4 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ 시스템(System) 및 공통 로직&lt;/h3&gt;
&lt;!-- 메인 화면 / 게임 화면 링크 분리 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;  라우팅(Routing) 분리 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 300px; height: auto; margin-right: 30px;&quot; src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FpwvL6%2FdJMcac94uPE%2FAAAAAAAAAAAAAAAAAAAAAHGDQqqQR3elzoA4BuVmtITyb8erH2XJXGGgkhvKOtGo%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DoowXJ%252FKjU1qavfPLav3OgeAUZGU%253D&quot; alt=&quot;메인화면&quot; /&gt; &lt;img style=&quot;width: 100%; max-width: 300px; height: auto;&quot; src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FrJC5w%2FdJMcac3kEX2%2FAAAAAAAAAAAAAAAAAAAAAOmsVeRj2ctvQwYc10QFFjhkLRatPqNeghS0dA0JbDTZ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1774969199%26allow_ip%3D%26allow_referer%3D%26signature%3DisihJSP5BhBHPTXi1ZALZ4xSsiQ%253D&quot; alt=&quot;게임화면&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 15px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
메인 화면과 게임 화면의 역할을 명확히 분리하기 위해 라우팅 구조를 분리했다. 기존에는 하나의 흐름에서 화면 상태로만 전환되던 구조였으나 /home과 /game 경로를 각각 독립적으로 구성해 화면 책임을 분리하고 네비게이션 흐름을 명확히 했다. 이를 통해 진입 로직, 게임 세션 관리, 예외 처리 등을 화면 단위로 관리할 수 있도록 구조를 개선했다. &lt;!-- 앞으로 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5️⃣ 앞으로...&lt;/h3&gt;
이제 자잘한 오류들을 거의 다 잡았다.. 끝이 보이는데 끝이 보이질 않는다. &lt;span style=&quot;text-decoration: line-through;&quot;&gt;3월 되기전에는 끝ㄴ내야지&lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 개발/대학전쟁</category>
      <category>대학전쟁</category>
      <category>양면빙고</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/38</guid>
      <comments>https://rodesi.tistory.com/38#entry38comment</comments>
      <pubDate>Sun, 22 Feb 2026 16:25:20 +0900</pubDate>
    </item>
    <item>
      <title>[대학전쟁3] 양면빙고 웹 개발 08 - 2인 play</title>
      <link>https://rodesi.tistory.com/37</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;008 2인 play.gif&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QWqdB/dJMcad1VUJh/rTDg5v9cAskPsONKikvV3K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QWqdB/dJMcad1VUJh/rTDg5v9cAskPsONKikvV3K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QWqdB/dJMcad1VUJh/rTDg5v9cAskPsONKikvV3K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/QWqdB/dJMcad1VUJh/rTDg5v9cAskPsONKikvV3K/img.gif&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;1864&quot; height=&quot;888&quot; data-filename=&quot;008 2인 play.gif&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div id=&quot;code_1770557972407&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;div style=&amp;quot;max-width: 900px; margin: 0 auto;&amp;quot;&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- 서론 --&amp;gt;
  &amp;lt;h3&amp;gt; 0️⃣ 지난 번까지.. &amp;lt;/h3&amp;gt;
지난 글에서는 제한시간이 넘어가면 turn이 넘어가고, 빙고 완성 시 highlight가 되고, restart 할 수 있는 기능을 구현했다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
오늘은 이어서 &amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot;&amp;gt;2인&amp;lt;/span&amp;gt; play가 가능한 기능을 구현해보고자 한다.
&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- 목록 --&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block; align-items: center; 
border-radius: 8px; padding: 10px; background-color: #ddd;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;

  &amp;lt;span style=&amp;quot;font-weight:bold; font-size: 18px;&amp;quot;&amp;gt;
  ☰ &amp;amp;nbsp; 양면빙고 (double-sided-bingo) 개발 과정 &amp;amp;nbsp; &amp;lt;/span&amp;gt; &amp;lt;div style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;ul style=&amp;quot;margin: 0; padding: 0; list-style-position: inside; gap: 16px;&amp;quot;&amp;gt;
      
    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/19&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 01 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; list, 타일 뒤집기 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/23&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 02 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 list 내 이동 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/25&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 03 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 착수 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    
    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/26&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 04 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 뒤집기, 이동 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/27&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 05 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 빙고 판단, player 2명 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/31&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 06 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 직전 타일 이동, 뒤집기 제한 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/36&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 07 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; timer, highlight, restart &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/38&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 09 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; UI/UX 개선 및 기능 보완 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;


&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 1 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 1️⃣ firebase&amp;lt;/h3&amp;gt;

&amp;lt;!-- firebase --&amp;gt;
  firebase &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
이 게임은 2인이 동시에 접속해 play하는 웹 기반 빙고 게임이다.
별도의 서버를 직접 구축하기보다는 빠르게 배포하고 실시간 상태 동기화를 처리할 수 있는
백엔드 서비스가 필요했다.

Firebase는 웹 배포(Hosting), 사용자 인증(Auth),
그리고 실시간 데이터베이스(Firestore)를 한 번에 제공하기 때문에
프론트엔드 중심의 개인 프로젝트에 적합하다고 판단해 Firebase를 사용했다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

Firebase 프로젝트 생성 및 기본 설정 과정은 공식 문서를 참고했다.
자세한 내용은 아래 링크에서 확인할 수 있다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- 링크 달아두기 --&amp;gt;



&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 2 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 2️⃣ 현재 진행 상황&amp;lt;/h3&amp;gt;

&amp;lt;!-- 메인 화면 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    메인 화면 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbTFfvU%2FdJMb99ZBWqM%2FAAAAAAAAAAAAAAAAAAAAALuOpFXtfPRLkdFaD7vvBOCxym_DfXURE7SCmiJOfuhz%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1772290799%26allow_ip%3D%26allow_referer%3D%26signature%3D%252FhmFdZBfjGcThOIgx17STiGYSIY%253D&amp;quot;
  alt=&amp;quot;메인 화면&amp;quot;
  style=&amp;quot;width: 100%; max-width: 300px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
게임 화면과 분리된 메인 화면을 새로 구현했다.
메인 화면에서는 방을 새로 생성하거나 이미 생성된 초대코드를 입력하여 게임에 입장할 수 있다.
(아직은 CSS가 적용되지 않은 상태다.)
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- 방 생성 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    방 생성 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/V6Tg4/dJMcagEqJGG/AAAAAAAAAAAAAAAAAAAAAN7eh1KRwF3FlzKRfowcxSNkTth7mOJ8mBrGLbCnPZK9/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1772290799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=mYJDz%2FNai8o6nRMYYdofpJKo6y4%3D&amp;quot;
  alt=&amp;quot;방 생성&amp;quot;
  style=&amp;quot;width: 100%; max-width: 300px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
'방 생성' 버튼을 누르면 게임 화면에 입장한다.
다른 플레이어를 초대할 수 있는 초대 코드도 함께 확인할 수 있다.
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    

&amp;lt;!-- 방 입장 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    방 입장 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/bOUcu1/dJMcacvgwoX/AAAAAAAAAAAAAAAAAAAAAL-np5-D1b13G-XYwMU7fRuh49CO7giK38A7SRppHoP0/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1772290799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=JUrY4q%2BA8wTcy5ERCPdofa8sNs0%3D&amp;quot;
  alt=&amp;quot;방 입장&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
앞서 발급된 초대 코드를 다른 플레이어가 입력하면 동일한 게임 방에 입장할 수 있다.&amp;quot;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- play (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    play &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/bb8gaQ/dJMcagEqJG1/AAAAAAAAAAAAAAAAAAAAADA1K_C1UIzVZQJekdC-Eg_Q-4O7wzyEv_JIsY80b7HL/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1772290799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=ssWO1zhJuekSTXEHhTSdv4ELlVU%3D&amp;quot;
  alt=&amp;quot;play&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
실시간 동기화가 정상적으로 동작하는가 확인하기 위해 두 개의 브라우저로 교차 테스트를 진행했다.
같은 방에 입장한 뒤 subscribeRoom을 통해
한쪽 탭에서 발생한 행동이 다른 탭에도 실시간으로 반영되는 것을 확인할 수 있었다.
착수, 뒤집기, 이동 모든 액션이 Firestore를 통해 즉시 동기화되었고
별도의 새로고침 없이도 두 클라이언트의 상태가 일관되게 유지되는 것을 확인했다.


&amp;lt;!-- 앞으로 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;h3&amp;gt; 3️⃣ 앞으로... &amp;lt;/h3&amp;gt;
아직 세세한 오류가 너무너무너무너ㅜㅁ너무 많다...
이 오류들을 잘 잡고 깔끔하게 CSS 적용하면 끝이다!
&amp;lt;span style=&amp;quot;text-decoration: line-through;&amp;quot;&amp;gt;(왜 끝날 것 같은데 안 끝나냐)&amp;lt;/span&amp;gt;

&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;/div&amp;gt;&quot;&gt;
&lt;div style=&quot;max-width: 900px; margin: 0 auto;&quot;&gt;&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 서론 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0️⃣ 지난 번까지..&lt;/h3&gt;
지난 글에서는 제한시간이 넘어가면 turn이 넘어가고, 빙고 완성 시 highlight가 되고, restart 할 수 있는 기능을 구현했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
오늘은 이어서 &lt;span style=&quot;text-decoration: underline;&quot;&gt;2인&lt;/span&gt; play가 가능한 기능을 구현해보고자 한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 목록 --&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border-radius: 8px; padding: 10px; background-color: #ddd;&quot;&gt;
&lt;div style=&quot;display: inline-block;&quot;&gt;&lt;span style=&quot;font-weight: bold; font-size: 18px;&quot;&gt; ☰ &amp;nbsp; 양면빙고 (double-sided-bingo) 개발 과정 &amp;nbsp; &lt;/span&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/19&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 01 - &lt;span style=&quot;font-weight: bold;&quot;&gt; list, 타일 뒤집기 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/23&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 02 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 list 내 이동 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/25&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 03 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 착수 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/26&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 04 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 뒤집기, 이동 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/27&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 05 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 빙고 판단, player 2명 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/31&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 06 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 직전 타일 이동, 뒤집기 제한 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/36&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 07 - &lt;span style=&quot;font-weight: bold;&quot;&gt; timer, highlight, restart &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/38&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 09 - &lt;span style=&quot;font-weight: bold;&quot;&gt; UI/UX 개선 및 기능 보완 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 본론 --&gt; &lt;!-- 1 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ firebase&lt;/h3&gt;
&lt;!-- firebase --&gt;   firebase &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
이 게임은 2인이 동시에 접속해 play하는 웹 기반 빙고 게임이다. 별도의 서버를 직접 구축하기보다는 빠르게 배포하고 실시간 상태 동기화를 처리할 수 있는 백엔드 서비스가 필요했다. Firebase는 웹 배포(Hosting), 사용자 인증(Auth), 그리고 실시간 데이터베이스(Firestore)를 한 번에 제공하기 때문에 프론트엔드 중심의 개인 프로젝트에 적합하다고 판단해 Firebase를 사용했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
Firebase 프로젝트 생성 및 기본 설정 과정은 공식 문서를 참고했다. 자세한 내용은 아래 링크에서 확인할 수 있다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 링크 달아두기 --&gt; &lt;!-- 본론 --&gt; &lt;!-- 2 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 현재 진행 상황&lt;/h3&gt;
&lt;!-- 메인 화면 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   메인 화면 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 300px; height: auto;&quot; src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbTFfvU%2FdJMb99ZBWqM%2FAAAAAAAAAAAAAAAAAAAAALuOpFXtfPRLkdFaD7vvBOCxym_DfXURE7SCmiJOfuhz%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1772290799%26allow_ip%3D%26allow_referer%3D%26signature%3D%252FhmFdZBfjGcThOIgx17STiGYSIY%253D&quot; alt=&quot;메인 화면&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
게임 화면과 분리된 메인 화면을 새로 구현했다. 메인 화면에서는 방을 새로 생성하거나 이미 생성된 초대코드를 입력하여 게임에 입장할 수 있다. (아직은 CSS가 적용되지 않은 상태다.) &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 방 생성 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   방 생성 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 300px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/V6Tg4/dJMcagEqJGG/AAAAAAAAAAAAAAAAAAAAAN7eh1KRwF3FlzKRfowcxSNkTth7mOJ8mBrGLbCnPZK9/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1772290799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=mYJDz%2FNai8o6nRMYYdofpJKo6y4%3D&quot; alt=&quot;방 생성&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
'방 생성' 버튼을 누르면 게임 화면에 입장한다. 다른 플레이어를 초대할 수 있는 초대 코드도 함께 확인할 수 있다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 방 입장 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   방 입장 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/bOUcu1/dJMcacvgwoX/AAAAAAAAAAAAAAAAAAAAAL-np5-D1b13G-XYwMU7fRuh49CO7giK38A7SRppHoP0/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1772290799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=JUrY4q%2BA8wTcy5ERCPdofa8sNs0%3D&quot; alt=&quot;방 입장&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
앞서 발급된 초대 코드를 다른 플레이어가 입력하면 동일한 게임 방에 입장할 수 있다.&quot; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- play (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   play &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/bb8gaQ/dJMcagEqJG1/AAAAAAAAAAAAAAAAAAAAADA1K_C1UIzVZQJekdC-Eg_Q-4O7wzyEv_JIsY80b7HL/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1772290799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=ssWO1zhJuekSTXEHhTSdv4ELlVU%3D&quot; alt=&quot;play&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
실시간 동기화가 정상적으로 동작하는가 확인하기 위해 두 개의 브라우저로 교차 테스트를 진행했다. 같은 방에 입장한 뒤 subscribeRoom을 통해 한쪽 탭에서 발생한 행동이 다른 탭에도 실시간으로 반영되는 것을 확인할 수 있었다. 착수, 뒤집기, 이동 모든 액션이 Firestore를 통해 즉시 동기화되었고 별도의 새로고침 없이도 두 클라이언트의 상태가 일관되게 유지되는 것을 확인했다. &lt;!-- 앞으로 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 앞으로...&lt;/h3&gt;
아직 세세한 오류가 너무너무너무너ㅜㅁ너무 많다... 이 오류들을 잘 잡고 깔끔하게 CSS 적용하면 끝이다! &lt;span style=&quot;text-decoration: line-through;&quot;&gt;(왜 끝날 것 같은데 안 끝나냐)&lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개인 개발/대학전쟁</category>
      <category>강지후</category>
      <category>김강현</category>
      <category>김동건</category>
      <category>김동연</category>
      <category>대학전쟁</category>
      <category>성태훈</category>
      <category>송명수</category>
      <category>이동재</category>
      <category>한종윤</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/37</guid>
      <comments>https://rodesi.tistory.com/37#entry37comment</comments>
      <pubDate>Sun, 8 Feb 2026 22:40:18 +0900</pubDate>
    </item>
    <item>
      <title>[대학전쟁3] 양면빙고 웹 개발 07 - timer, highlight, restart</title>
      <link>https://rodesi.tistory.com/36</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;002 highlisht.gif&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMEUsh/dJMcaihRO3w/lJ64GYY6Toq5Hq6XGtw8Uk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMEUsh/dJMcaihRO3w/lJ64GYY6Toq5Hq6XGtw8Uk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMEUsh/dJMcaihRO3w/lJ64GYY6Toq5Hq6XGtw8Uk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bMEUsh/dJMcaihRO3w/lJ64GYY6Toq5Hq6XGtw8Uk/img.gif&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;1246&quot; height=&quot;824&quot; data-filename=&quot;002 highlisht.gif&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;824&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;div id=&quot;code_1769858168927&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;div style=&amp;quot;max-width: 900px; margin: 0 auto;&amp;quot;&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- 서론 --&amp;gt;
  &amp;lt;h3&amp;gt; 0️⃣ 지난 번까지.. &amp;lt;/h3&amp;gt;
지난 주에 양면빙고를 끝냈어야 했는데... 너무 오랜만에 글을 써본다... &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
지난 글에서는 빙고판 위의 타일 개수에 따라 이동 뒤집기를 제한하는 기능을 구현했다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
오늘은 이어서 시간 제한을 만들어 &amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot;&amp;gt;제한시간이 넘어가면 turn이 넘어가는&amp;lt;/span&amp;gt; 기능을 구현해보고자 한다.
&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- 목록 --&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block; align-items: center; 
border-radius: 8px; padding: 10px; background-color: #ddd;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;

  &amp;lt;span style=&amp;quot;font-weight:bold; font-size: 18px;&amp;quot;&amp;gt;
  ☰ &amp;amp;nbsp; 양면빙고 (double-sided-bingo) 개발 과정 &amp;amp;nbsp; &amp;lt;/span&amp;gt; &amp;lt;div style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;ul style=&amp;quot;margin: 0; padding: 0; list-style-position: inside; gap: 16px;&amp;quot;&amp;gt;
      
    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/19&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 01 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; list, 타일 뒤집기 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/23&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 02 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 list 내 이동 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/25&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 03 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 착수 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    
    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/26&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 04 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 뒤집기, 이동 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/27&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 05 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 빙고 판단, player 2명 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/31&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 06 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 직전 타일 이동, 뒤집기 제한 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/37&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 08 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 2인 play &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/38&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 09 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; UI/UX 개선 및 기능 보완 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;


&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 1 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 1️⃣ timer&amp;lt;/h3&amp;gt;

&amp;lt;!-- App --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
  App.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- const --&amp;gt;
  const 추가 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const TURN_LIMIT = 60;
const [timeLeft, setTimeLeft] = useState(TURN_LIMIT);
const isDanger = timeLeft &amp;amp;lt;= 5;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
ㆍ TURN_LIMIT - 한 turn당 제한 시간을 60으로(초 단위) 설정한다. (현재는 test 단계기 때문에 10으로 설정했다) &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ timeLeft - 남은 시간을 표시하는데 사용한다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ isDanger - timeLeft가 5 초과일 경우 false, 5 이하로 줄어들면 true로 설정하여 시각적으로 서로 다른 알림을 주는데에 사용한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- endTurnNoCount --&amp;gt;
  endTurnNoCount 함수 추가 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const endTurnNoCount = () =&amp;amp;gt; &amp;amp;#123;
  if (!winner) &amp;amp;#123;
    setCurrentTurn(prev =&amp;amp;gt; prev === &amp;quot;me&amp;quot; ? &amp;quot;opponent&amp;quot; : &amp;quot;me&amp;quot;);
  &amp;amp;#125;
&amp;amp;#125;;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
현재는 다른 player의 turn으로 넘어가면 setTurnCount이 1 증가하게 되어있다.
하지만 시간 초과로 turn이 넘어갈 경우에는 setTurnCount이 증가하면 안 된다. (착수하지 않았기 때문이다.)
따라서 turn이 넘어가지만 setTurnCount은 증가하지 않는 함수, endTurnNoCount를 추가로 작성한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- useEffect --&amp;gt;
  useEffect 작성 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;useEffect(() =&amp;amp;gt; &amp;amp;#123;
  setTimeLeft(TURN_LIMIT);
&amp;amp;#125;, [currentTurn]);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
턴 바뀔 때마다 타이머 TURN_LIMIT가 reset 되도록 코드를 작성한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- useEffect --&amp;gt;
  useEffect 작성 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;useEffect(() =&amp;amp;gt; &amp;amp;#123;
  if (winner) return;

  const timer = setInterval(() =&amp;amp;gt; &amp;amp;#123;
    setTimeLeft(prev =&amp;amp;gt; &amp;amp;#123;
      if (prev &amp;amp;lt;= 1) &amp;amp;#123;
        endTurnNoCount();
        return TURN_LIMIT;
      &amp;amp;#125;
      return prev - 1;
    &amp;amp;#125;);
  &amp;amp;#125;, 1000);

  return () =&amp;amp;gt; clearInterval(timer);
&amp;amp;#125;, [currentTurn, winner]);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
currentTurn이 변경될 때마다 타이머를 실행하기 위해 useEffect가 실행 되도록 한다.
(단, winner가 결정되면 타이머를 실행하지 않도록 바로 return 한다.)
setInterval을 통해 1초마다 setTimeLeft를 호출하여 남은 시간을 1씩 감소시킨다.
남은 시간이 1 이하가 되면 endTurnNoCount 함수를 호출해 setTurnCount이 증가 없이 턴을 종료하고
다음 player의 턴을 위해 시간을 TURN_LIMIT으로 초기화한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- return --&amp;gt;
  return 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;&amp;amp;lt;div className=&amp;amp;#123;&amp;#96;timer $&amp;amp;#123;isDanger ? &amp;quot;danger&amp;quot; : &amp;quot;&amp;quot;&amp;amp;#125;&amp;#96;&amp;amp;#125;&amp;amp;gt;
  &amp;amp;lt;span className=&amp;quot;timer-icon&amp;quot;&amp;amp;gt;?&amp;amp;lt;/span&amp;amp;gt;
  &amp;amp;lt;span className=&amp;quot;timer-text&amp;quot;&amp;amp;gt;Time Left&amp;amp;lt;/span&amp;amp;gt;
  &amp;amp;lt;span className=&amp;quot;timer-value&amp;quot;&amp;amp;gt;&amp;amp;#123;timeLeft&amp;amp;#125;s&amp;amp;lt;/span&amp;amp;gt;
&amp;amp;lt;/div&amp;amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
남은 시간을 화면 상단에 표시한다.
danger 클래스를 추가해 isDanger의 값에 따라 타이머의 시각적 효과를 달리 한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- App --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
  App.css 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- css --&amp;gt;
  css 작성 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;.timer &amp;amp;#123;
  display: inline-flex;
  align-items: center;
  gap: 8px;

  padding: 8px 14px;
  border-radius: 10px;

  background: #1f2937;
  color: #ffffff;

  font-weight: 600;

  margin-left: 300px;
&amp;amp;#125;

.timer-icon &amp;amp;#123;
  font-size: 18px;
&amp;amp;#125;

.timer-value &amp;amp;#123;
  font-size: 18px;
  font-weight: 700;
  color: #22c55e;
&amp;amp;#125;

.timer.danger &amp;amp;#123;
  background: #dc2626;
  animation: pulse 1s infinite;
&amp;amp;#125;

.timer.danger .timer-value &amp;amp;#123;
  color: #fca5a5;
&amp;amp;#125;

@keyframes pulse &amp;amp;#123;
  0% &amp;amp;#123; transform: scale(1); &amp;amp;#125;
  50% &amp;amp;#123; transform: scale(1.1); &amp;amp;#125;
  100% &amp;amp;#123; transform: scale(1); &amp;amp;#125;
&amp;amp;#125;

.timer-container.danger &amp;amp;#123;
  animation: pulse 1s infinite;
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
남은 시간이 5 초과일 경우에는 흰색, 초록색 text와 어두운 계열 배경으로 깔끔한 timer 버튼 UI를 구성한다.
남은 시간이 5 이하일 경우 글자색과 배경색이 각각
&amp;lt;span style=&amp;quot;color: #fca5a5;&amp;quot;&amp;gt;#fca5a5&amp;lt;/span&amp;gt; ,
&amp;lt;span style=&amp;quot;background-color: #dc2626; border-radius: 5px; padding: 2px;&amp;quot;&amp;gt;#dc2626&amp;lt;/span&amp;gt;
으로 변한다.
또한 pulse 애니메이션을 적용해 타이머의 크기가 반복적으로 커졌다 작아지도록 설정하여
시간이 얼마 남지 않았음을 시각적으로 강조한다. 
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- 타이머 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    타이머 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/cTxXD8/dJMcadnicyU/AAAAAAAAAAAAAAAAAAAAALFdmko1N9BSRNskdq_MLiJSwcPFyVVVeSU4NZCkNTaf/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=aVK2d9s1Gvs77GcN3ZwdlrjWnbE%3D&amp;quot;
  alt=&amp;quot;타이머&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
남은 시간이 5 이하일 때와 5 초과일 때 타이머가 서로 다른 스타일로 표시되는 것을 확인할 수 있다.



&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 2 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 2️⃣ 빙고 완료 시, 빙고 highlight&amp;lt;/h3&amp;gt;

&amp;lt;!-- App --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
  App.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- const --&amp;gt;
  const 추가 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const [winningLine, setWinningLine] = useState([]);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
완성된 빙고 line을 저장할 const를 작성한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- checkBingo --&amp;gt;
  checkBingo 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;// 빙고 기준 set
const lines = [
// 행 빙고
[0,1,2,3], [4,5,6,7], [8,9,10,11], [12,13,14,15],
// 열 빙고
[0,4,8,12], [1,5,9,13], [2,6,10,14], [3,7,11,15],
// 대각선 빙고
[0,5,10,15], [3,6,9,12],
];

const checkBingo = (boardTiles, targetColor) =&amp;amp;gt; &amp;amp;#123;
  const winningLine = lines.find((line) =&amp;amp;gt;
    line.every((idx) =&amp;amp;gt; &amp;amp;#123;
      const tile = boardTiles[idx];
      if (!tile) return false;
      return getVisibleColor(tile) === targetColor;
    &amp;amp;#125;)
  );

  return winningLine || null;
&amp;amp;#125;;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
빙고가 완성이 될 경우 해당 빙고를 시각적으로 표시하기 위해 checkBingo 함수 코드를 재작성한다.
빙고의 완성 여부를 판별함과 동시에 완성된 빙고 line 배열을 반환한다.
미리 정의한 'lines' 배열을 순회하며 빙고 조건에 만족하는 첫 번째 line을 반환한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- useEffect --&amp;gt;
  useEffect 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;useEffect(() =&amp;amp;gt; &amp;amp;#123;
  // 1. 내 빙고 체크
  const myBingoLine = checkBingo(boardTiles, players.me.mainColor);
  if (myBingoLine) &amp;amp;#123;
    setWinner(&amp;quot;me&amp;quot;);
    setWinningLine(myBingoLine);
    return;
  &amp;amp;#125;

  // 2. 상대 빙고 체크
  const oppBingoLine = checkBingo(boardTiles, players.opponent.mainColor);
  if (oppBingoLine) &amp;amp;#123;
    setWinner(&amp;quot;opponent&amp;quot;);
    setWinningLine(oppBingoLine);
  &amp;amp;#125;
&amp;amp;#125;, [boardTiles]);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
빙고판(bingoboard)이 바뀔 때마다 useEffect를 통해 checkBingo 호출한다.
checkBingo를 통해 빙고가 완성됨을 확인하면 완성된 빙고 line을 setWinningLine에 저장한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- return --&amp;gt;
  return 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;&amp;amp;lt;BingoBoard winningLine=&amp;amp;#123;winningLine&amp;amp;#125; /&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
완성된 빙고 line을 BingoBoard 에 전달해준다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- BingoBoard --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
  BingoBoard.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- BingoBoard --&amp;gt;
  코드 작성 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const BingoCell = (&amp;amp;#123; winningLine= [] &amp;amp;#125;)
const isBingo = winningLine.includes(cellId);
isBingo=&amp;amp;#123;isBingo&amp;amp;#125;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
ㆍ winningLine= [] - winningLine을 props로 받는다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ isBingo - 빙고가 완성된 cellId를 저장한다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ isBingo={isBingo} - BingoCell에 빙고 여부 전달
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- BingoCell --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
  BingoCell.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- const --&amp;gt;
  코드 작성 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const BingoCell = (&amp;amp;#123; isBingo &amp;amp;#125;)
$&amp;amp;#123;isBingo ? &amp;quot;bingo-highlight&amp;quot; : &amp;quot;&amp;quot;&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
ㆍ isBingo - props로 받는다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍ isBingo ? &amp;quot;bingo-highlight&amp;quot; : &amp;quot;&amp;quot; - 빙고 완성 여부에 따른 CSS를 달리한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- BingoBoard --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
  BingoBoard.css 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- const --&amp;gt;
  css 작성 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;.bingo-highlight &amp;amp;#123;
  border: 3px solid #11ff00 !important;
  box-shadow: 0 0 15px #11ff00;
  transform: scale(1.05);
  z-index: 10;
  transition: all 0.3s ease;
  animation: pulse 1s infinite;
&amp;amp;#125;

@keyframes pulse &amp;amp;#123;
  0% &amp;amp;#123; transform: scale(1); &amp;amp;#125;
  50% &amp;amp;#123; transform: scale(1.05); &amp;amp;#125;
  100% &amp;amp;#123; transform: scale(1); &amp;amp;#125;
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
빙고가 완성된 경우 border와 box-shadow를 사용해 완성된 line을 시각적으로 강조하고
pulse 애니메이션으로 highlight의 크기가 반복적으로 변하도록 스타일을 적용한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- highlight (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    highlight &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/rE9mp/dJMcabXlpkZ/AAAAAAAAAAAAAAAAAAAAAEW68LPvpBzGRDZZxypO468ZFBkzmNaca3hkyHbqCvhi/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=55h5qAxADXS9E4ujrjF8%2FXxht%2FQ%3D&amp;quot;
  alt=&amp;quot;highlight&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
빙고가 완성된 경우 초록색 highlight가 표시됨을 볼 수 있고 타일과 line의 크기가 반복적으로 변하는 것을 확인할 수 있다.



&amp;lt;!-- 3 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 3️⃣ restart 버튼 &amp;lt;/h3&amp;gt;

&amp;lt;!-- App --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
  App.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- disabled --&amp;gt;
  disabled &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;&amp;amp;#123;winner &amp;amp;&amp;amp; (
  &amp;amp;lt;div className=&amp;quot;end&amp;quot;&amp;amp;gt;
    &amp;amp;lt;h1 className=&amp;quot;winner&amp;quot;&amp;amp;gt;
      Winner: &amp;amp;#123;winner === &amp;quot;me&amp;quot; ? &amp;quot;ME&amp;quot; : &amp;quot;OPPONENT&amp;quot;&amp;amp;#125;
    &amp;amp;lt;/h1&amp;amp;gt;

    &amp;amp;lt;button
      className=&amp;quot;restart&amp;quot;
      onClick=&amp;amp;#123;() =&amp;amp;gt; window.location.reload()&amp;amp;#125;
    &amp;amp;gt;
      게임 다시 시작
    &amp;amp;lt;/button&amp;amp;gt;
  &amp;amp;lt;/div&amp;amp;gt;
)&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
빙고가 완성되어 winner가 set되면 조건부 렌더링을 통해 winner를 표시하고 그 아래에는 게임을 다시 시작할 수 있는 restart 버튼을 렌더링한다.
restart 버튼은 window.location.reload()를 호출해 웹 전체 상태를 초기화하기 때문에 새 게임을 이어서 할 수 있다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- App --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
  App.css 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- disabled --&amp;gt;
  css 작성 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;/* 빙고 완성 시 */
.end &amp;amp;#123;
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.6);
  color: white;

  display: flex;
  flex-direction: column; /* ? 세로 정렬 */
  align-items: center;
  justify-content: center;
  gap: 24px; /* h1과 버튼 사이 간격 */

  z-index: 999;
&amp;amp;#125;

/* 승자 */
.winner &amp;amp;#123;
  font-size: 48px;
  margin: 0;
&amp;amp;#125;

/* 다시 시작 버튼 */
.restart &amp;amp;#123;
  font-size: 18px;
  padding: 12px 24px;
  border: none;
  border-radius: 8px;
  cursor: pointer;

  background-color: #ffffff;
  color: #000000;
&amp;amp;#125;

.restart:hover &amp;amp;#123;
  background-color: #e0e0e0;
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
기본 상태에서는 흰색 배경과 검은색 text로 깔끔한 restart 버튼 UI를 구성하고
마우스를 올렸을 때는 :hover를 통해 배경색이 회색으로 변경되도록 설정해
버튼이 클릭 가능한 인터랙션 요소임을 직관적으로 알 수 있도록 한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- restart (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    restart &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/dvt0yL/dJMcaf6v18w/AAAAAAAAAAAAAAAAAAAAAPj_i_CbTAWamtHoOQJ_l5QTWDBTq5twjVNxqIL2DC-C/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=z4GURkQRLHfM5DkA9RgYMB8s1p0%3D&amp;quot;
  alt=&amp;quot;restart&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
빙고가 완성되면 restart 버튼이 화면에 표시되고
버튼을 클릭해 게임을 다시 시작할 수 있다.



&amp;lt;!-- 앞으로 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;h3&amp;gt; 4️⃣ 앞으로... &amp;lt;/h3&amp;gt;
타이머, 빙고 highlight, restart 버튼을 만들었다.
이제 진짜 진짜 거의 끝이다!

다음에는 컴퓨터 한 대에서 턴을 번갈아 진행하던 방식이 아니라
서로 다른 두 기기에서 play할 수 있도록 구현하고자 한다.
또한 현재처럼 하나의 기기에서도 2명이 play할 수 있게
main color 등이 표시되는 방법을 바꿀 것이다.

그리고 웹 배포까지 하면 끝이다..

&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;/div&amp;gt;&quot;&gt;
&lt;div style=&quot;max-width: 900px; margin: 0 auto;&quot;&gt;&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 서론 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0️⃣ 지난 번까지..&lt;/h3&gt;
지난 주에 양면빙고를 끝냈어야 했는데... 너무 오랜만에 글을 써본다... &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
지난 글에서는 빙고판 위의 타일 개수에 따라 이동 뒤집기를 제한하는 기능을 구현했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
오늘은 이어서 시간 제한을 만들어 &lt;span style=&quot;text-decoration: underline;&quot;&gt;제한시간이 넘어가면 turn이 넘어가는&lt;/span&gt; 기능을 구현해보고자 한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 목록 --&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border-radius: 8px; padding: 10px; background-color: #ddd;&quot;&gt;
&lt;div style=&quot;display: inline-block;&quot;&gt;&lt;span style=&quot;font-weight: bold; font-size: 18px;&quot;&gt; ☰ &amp;nbsp; 양면빙고 (double-sided-bingo) 개발 과정 &amp;nbsp; &lt;/span&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/19&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 01 - &lt;span style=&quot;font-weight: bold;&quot;&gt; list, 타일 뒤집기 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/23&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 02 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 list 내 이동 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/25&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 03 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 착수 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/26&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 04 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 뒤집기, 이동 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/27&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 05 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 빙고 판단, player 2명 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/31&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 06 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 직전 타일 이동, 뒤집기 제한 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/37&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 08 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 2인 play &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/38&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 09 - &lt;span style=&quot;font-weight: bold;&quot;&gt; UI/UX 개선 및 기능 보완 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 본론 --&gt; &lt;!-- 1 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ timer&lt;/h3&gt;
&lt;!-- App --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   App.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- const --&gt;   const 추가 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const TURN_LIMIT = 60;
const [timeLeft, setTimeLeft] = useState(TURN_LIMIT);
const isDanger = timeLeft &amp;lt;= 5;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ TURN_LIMIT - 한 turn당 제한 시간을 60으로(초 단위) 설정한다. (현재는 test 단계기 때문에 10으로 설정했다) &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ timeLeft - 남은 시간을 표시하는데 사용한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ isDanger - timeLeft가 5 초과일 경우 false, 5 이하로 줄어들면 true로 설정하여 시각적으로 서로 다른 알림을 주는데에 사용한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- endTurnNoCount --&gt;   endTurnNoCount 함수 추가 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const endTurnNoCount = () =&amp;gt; {
  if (!winner) {
    setCurrentTurn(prev =&amp;gt; prev === &quot;me&quot; ? &quot;opponent&quot; : &quot;me&quot;);
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;현재는 다른 player의 turn으로 넘어가면 setTurnCount이 1 증가하게 되어있다. 하지만 시간 초과로 turn이 넘어갈 경우에는 setTurnCount이 증가하면 안 된다. (착수하지 않았기 때문이다.) 따라서 turn이 넘어가지만 setTurnCount은 증가하지 않는 함수, endTurnNoCount를 추가로 작성한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- useEffect --&gt;   useEffect 작성 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;useEffect(() =&amp;gt; {
  setTimeLeft(TURN_LIMIT);
}, [currentTurn]);&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;턴 바뀔 때마다 타이머 TURN_LIMIT가 reset 되도록 코드를 작성한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- useEffect --&gt;   useEffect 작성 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;useEffect(() =&amp;gt; {
  if (winner) return;

  const timer = setInterval(() =&amp;gt; {
    setTimeLeft(prev =&amp;gt; {
      if (prev &amp;lt;= 1) {
        endTurnNoCount();
        return TURN_LIMIT;
      }
      return prev - 1;
    });
  }, 1000);

  return () =&amp;gt; clearInterval(timer);
}, [currentTurn, winner]);&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;currentTurn이 변경될 때마다 타이머를 실행하기 위해 useEffect가 실행 되도록 한다. (단, winner가 결정되면 타이머를 실행하지 않도록 바로 return 한다.) setInterval을 통해 1초마다 setTimeLeft를 호출하여 남은 시간을 1씩 감소시킨다. 남은 시간이 1 이하가 되면 endTurnNoCount 함수를 호출해 setTurnCount이 증가 없이 턴을 종료하고 다음 player의 턴을 위해 시간을 TURN_LIMIT으로 초기화한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- return --&gt;   return 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;div className={`timer ${isDanger ? &quot;danger&quot; : &quot;&quot;}`}&amp;gt;
  &amp;lt;span className=&quot;timer-icon&quot;&amp;gt;?&amp;lt;/span&amp;gt;
  &amp;lt;span className=&quot;timer-text&quot;&amp;gt;Time Left&amp;lt;/span&amp;gt;
  &amp;lt;span className=&quot;timer-value&quot;&amp;gt;{timeLeft}s&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;남은 시간을 화면 상단에 표시한다. danger 클래스를 추가해 isDanger의 값에 따라 타이머의 시각적 효과를 달리 한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- App --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   App.css 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- css --&gt;   css 작성 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;.timer {
  display: inline-flex;
  align-items: center;
  gap: 8px;

  padding: 8px 14px;
  border-radius: 10px;

  background: #1f2937;
  color: #ffffff;

  font-weight: 600;

  margin-left: 300px;
}

.timer-icon {
  font-size: 18px;
}

.timer-value {
  font-size: 18px;
  font-weight: 700;
  color: #22c55e;
}

.timer.danger {
  background: #dc2626;
  animation: pulse 1s infinite;
}

.timer.danger .timer-value {
  color: #fca5a5;
}

@keyframes pulse {
  0% { transform: scale(1); }
  50% { transform: scale(1.1); }
  100% { transform: scale(1); }
}

.timer-container.danger {
  animation: pulse 1s infinite;
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;남은 시간이 5 초과일 경우에는 흰색, 초록색 text와 어두운 계열 배경으로 깔끔한 timer 버튼 UI를 구성한다. 남은 시간이 5 이하일 경우 글자색과 배경색이 각각 &lt;span style=&quot;color: #fca5a5;&quot;&gt;#fca5a5&lt;/span&gt; , &lt;span style=&quot;background-color: #dc2626; border-radius: 5px; padding: 2px;&quot;&gt;#dc2626&lt;/span&gt; 으로 변한다. 또한 pulse 애니메이션을 적용해 타이머의 크기가 반복적으로 커졌다 작아지도록 설정하여 시간이 얼마 남지 않았음을 시각적으로 강조한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 타이머 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   타이머 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/cTxXD8/dJMcadnicyU/AAAAAAAAAAAAAAAAAAAAALFdmko1N9BSRNskdq_MLiJSwcPFyVVVeSU4NZCkNTaf/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=aVK2d9s1Gvs77GcN3ZwdlrjWnbE%3D&quot; alt=&quot;타이머&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
남은 시간이 5 이하일 때와 5 초과일 때 타이머가 서로 다른 스타일로 표시되는 것을 확인할 수 있다. &lt;!-- 본론 --&gt; &lt;!-- 2 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 빙고 완료 시, 빙고 highlight&lt;/h3&gt;
&lt;!-- App --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   App.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- const --&gt;   const 추가 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const [winningLine, setWinningLine] = useState([]);&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;완성된 빙고 line을 저장할 const를 작성한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- checkBingo --&gt;   checkBingo 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 빙고 기준 set
const lines = [
// 행 빙고
[0,1,2,3], [4,5,6,7], [8,9,10,11], [12,13,14,15],
// 열 빙고
[0,4,8,12], [1,5,9,13], [2,6,10,14], [3,7,11,15],
// 대각선 빙고
[0,5,10,15], [3,6,9,12],
];

const checkBingo = (boardTiles, targetColor) =&amp;gt; {
  const winningLine = lines.find((line) =&amp;gt;
    line.every((idx) =&amp;gt; {
      const tile = boardTiles[idx];
      if (!tile) return false;
      return getVisibleColor(tile) === targetColor;
    })
  );

  return winningLine || null;
};&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;빙고가 완성이 될 경우 해당 빙고를 시각적으로 표시하기 위해 checkBingo 함수 코드를 재작성한다. 빙고의 완성 여부를 판별함과 동시에 완성된 빙고 line 배열을 반환한다. 미리 정의한 'lines' 배열을 순회하며 빙고 조건에 만족하는 첫 번째 line을 반환한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- useEffect --&gt;   useEffect 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;useEffect(() =&amp;gt; {
  // 1. 내 빙고 체크
  const myBingoLine = checkBingo(boardTiles, players.me.mainColor);
  if (myBingoLine) {
    setWinner(&quot;me&quot;);
    setWinningLine(myBingoLine);
    return;
  }

  // 2. 상대 빙고 체크
  const oppBingoLine = checkBingo(boardTiles, players.opponent.mainColor);
  if (oppBingoLine) {
    setWinner(&quot;opponent&quot;);
    setWinningLine(oppBingoLine);
  }
}, [boardTiles]);&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;빙고판(bingoboard)이 바뀔 때마다 useEffect를 통해 checkBingo 호출한다. checkBingo를 통해 빙고가 완성됨을 확인하면 완성된 빙고 line을 setWinningLine에 저장한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- return --&gt;   return 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;BingoBoard winningLine={winningLine} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;완성된 빙고 line을 BingoBoard 에 전달해준다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- BingoBoard --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   BingoBoard.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- BingoBoard --&gt;   코드 작성 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const BingoCell = ({ winningLine= [] })
const isBingo = winningLine.includes(cellId);
isBingo={isBingo}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ winningLine= [] - winningLine을 props로 받는다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ isBingo - 빙고가 완성된 cellId를 저장한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ isBingo={isBingo} - BingoCell에 빙고 여부 전달 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- BingoCell --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   BingoCell.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- const --&gt;   코드 작성 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const BingoCell = ({ isBingo })
${isBingo ? &quot;bingo-highlight&quot; : &quot;&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍ isBingo - props로 받는다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍ isBingo ? &quot;bingo-highlight&quot; : &quot;&quot; - 빙고 완성 여부에 따른 CSS를 달리한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- BingoBoard --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   BingoBoard.css 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- const --&gt;   css 작성 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;.bingo-highlight {
  border: 3px solid #11ff00 !important;
  box-shadow: 0 0 15px #11ff00;
  transform: scale(1.05);
  z-index: 10;
  transition: all 0.3s ease;
  animation: pulse 1s infinite;
}

@keyframes pulse {
  0% { transform: scale(1); }
  50% { transform: scale(1.05); }
  100% { transform: scale(1); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;빙고가 완성된 경우 border와 box-shadow를 사용해 완성된 line을 시각적으로 강조하고 pulse 애니메이션으로 highlight의 크기가 반복적으로 변하도록 스타일을 적용한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- highlight (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   highlight &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/rE9mp/dJMcabXlpkZ/AAAAAAAAAAAAAAAAAAAAAEW68LPvpBzGRDZZxypO468ZFBkzmNaca3hkyHbqCvhi/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=55h5qAxADXS9E4ujrjF8%2FXxht%2FQ%3D&quot; alt=&quot;highlight&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
빙고가 완성된 경우 초록색 highlight가 표시됨을 볼 수 있고 타일과 line의 크기가 반복적으로 변하는 것을 확인할 수 있다. &lt;!-- 3 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ restart 버튼&lt;/h3&gt;
&lt;!-- App --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   App.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- disabled --&gt;   disabled &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;{winner &amp;amp;&amp;amp; (
  &amp;lt;div className=&quot;end&quot;&amp;gt;
    &amp;lt;h1 className=&quot;winner&quot;&amp;gt;
      Winner: {winner === &quot;me&quot; ? &quot;ME&quot; : &quot;OPPONENT&quot;}
    &amp;lt;/h1&amp;gt;

    &amp;lt;button
      className=&quot;restart&quot;
      onClick={() =&amp;gt; window.location.reload()}
    &amp;gt;
      게임 다시 시작
    &amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
)}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;빙고가 완성되어 winner가 set되면 조건부 렌더링을 통해 winner를 표시하고 그 아래에는 게임을 다시 시작할 수 있는 restart 버튼을 렌더링한다. restart 버튼은 window.location.reload()를 호출해 웹 전체 상태를 초기화하기 때문에 새 게임을 이어서 할 수 있다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- App --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   App.css 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- disabled --&gt;   css 작성 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;/* 빙고 완성 시 */
.end {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.6);
  color: white;

  display: flex;
  flex-direction: column; /* ? 세로 정렬 */
  align-items: center;
  justify-content: center;
  gap: 24px; /* h1과 버튼 사이 간격 */

  z-index: 999;
}

/* 승자 */
.winner {
  font-size: 48px;
  margin: 0;
}

/* 다시 시작 버튼 */
.restart {
  font-size: 18px;
  padding: 12px 24px;
  border: none;
  border-radius: 8px;
  cursor: pointer;

  background-color: #ffffff;
  color: #000000;
}

.restart:hover {
  background-color: #e0e0e0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;기본 상태에서는 흰색 배경과 검은색 text로 깔끔한 restart 버튼 UI를 구성하고 마우스를 올렸을 때는 :hover를 통해 배경색이 회색으로 변경되도록 설정해 버튼이 클릭 가능한 인터랙션 요소임을 직관적으로 알 수 있도록 한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- restart (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   restart &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/dvt0yL/dJMcaf6v18w/AAAAAAAAAAAAAAAAAAAAAPj_i_CbTAWamtHoOQJ_l5QTWDBTq5twjVNxqIL2DC-C/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=z4GURkQRLHfM5DkA9RgYMB8s1p0%3D&quot; alt=&quot;restart&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
빙고가 완성되면 restart 버튼이 화면에 표시되고 버튼을 클릭해 게임을 다시 시작할 수 있다. &lt;!-- 앞으로 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ 앞으로...&lt;/h3&gt;
타이머, 빙고 highlight, restart 버튼을 만들었다. 이제 진짜 진짜 거의 끝이다! 다음에는 컴퓨터 한 대에서 턴을 번갈아 진행하던 방식이 아니라 서로 다른 두 기기에서 play할 수 있도록 구현하고자 한다. 또한 현재처럼 하나의 기기에서도 2명이 play할 수 있게 main color 등이 표시되는 방법을 바꿀 것이다. 그리고 웹 배포까지 하면 끝이다.. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dsb2.png&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEVu7e/dJMcag5ro78/BBNk8UPhqizEzn2rsFF9P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEVu7e/dJMcag5ro78/BBNk8UPhqizEzn2rsFF9P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEVu7e/dJMcag5ro78/BBNk8UPhqizEzn2rsFF9P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEVu7e%2FdJMcag5ro78%2FBBNk8UPhqizEzn2rsFF9P0%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;379&quot; height=&quot;376&quot; data-filename=&quot;dsb2.png&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개인 개발/대학전쟁</category>
      <category>EliteLeague</category>
      <category>김강현</category>
      <category>김동건</category>
      <category>대학전쟁</category>
      <category>박상연</category>
      <category>송명수</category>
      <category>이윤범</category>
      <category>이충서</category>
      <category>최아인</category>
      <category>한종윤</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/36</guid>
      <comments>https://rodesi.tistory.com/36#entry36comment</comments>
      <pubDate>Sat, 31 Jan 2026 20:16:05 +0900</pubDate>
    </item>
    <item>
      <title>[대학전쟁3] 양면빙고 웹 개발 06 - 직전 타일 이동, 뒤집기 제한</title>
      <link>https://rodesi.tistory.com/31</link>
      <description>&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-filename=&quot;005 최근에 착수한 수 - gray로 (15번째부터.gif&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ysdn9/dJMcacu78lw/qzI9z6QLvsXP3lS3pwsfQ1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ysdn9/dJMcacu78lw/qzI9z6QLvsXP3lS3pwsfQ1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ysdn9/dJMcacu78lw/qzI9z6QLvsXP3lS3pwsfQ1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ysdn9/dJMcacu78lw/qzI9z6QLvsXP3lS3pwsfQ1/img.gif&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;700&quot; height=&quot;475&quot; data-filename=&quot;005 최근에 착수한 수 - gray로 (15번째부터.gif&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;834&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;div id=&quot;code_1769166240834&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;div style=&amp;quot;max-width: 900px; margin: 0 auto;&amp;quot;&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- 서론 --&amp;gt;
  &amp;lt;h3&amp;gt; 0️⃣ 지난 번까지.. &amp;lt;/h3&amp;gt;
대학전쟁에 나온 '양면빙고 (double sided bingo)' 게임을 보고 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
이 게임을 웹으로 만들면 재밌겠다는 생각이 들어 양면빙고 웹 개발을 시작했다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
오늘 드디어 대학전쟁3 결승전까지 끝났다.. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
진짜 결승전 개존잼.. 안 본 사람들 다들 보러가세여 ㄱㄱ &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

나의 양면빙고 웹도 거의거의 막바지 단계다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
지난 글에서는 빙고가 완성되면 게임을 중단하고, player가 행동하면 turn이 넘어가는 기능을 구현했다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
오늘은 이어서 빙고판 위의 타일 개수에 따라 &amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot;&amp;gt;이동 뒤집기&amp;lt;/span&amp;gt;를 제한하는 기능을 구현해보고자 한다.
&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- 목록 --&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block; align-items: center; 
border-radius: 8px; padding: 10px; background-color: #ddd;&amp;quot;&amp;gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;

  &amp;lt;span style=&amp;quot;font-weight:bold; font-size: 18px;&amp;quot;&amp;gt;
  ☰ &amp;amp;nbsp; 양면빙고 (double-sided-bingo) 개발 과정 &amp;amp;nbsp; &amp;lt;/span&amp;gt; &amp;lt;div style=&amp;quot;height: 10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;ul style=&amp;quot;margin: 0; padding: 0; list-style-position: inside; gap: 16px;&amp;quot;&amp;gt;
      
    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/19&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 01 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; list, 타일 뒤집기 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/23&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 02 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 list 내 이동 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/25&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 03 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 착수 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    
    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/26&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 04 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 타일 뒤집기, 이동 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/27&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 05 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 빙고 판단, player 2명 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;  &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/36&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 07 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; timer, highlight, restart &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;&amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/37&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 08 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; 2인 play &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt; &amp;lt;div style=&amp;quot;height:5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;li style=&amp;quot;list-style: none;&amp;quot;&amp;gt;
      &amp;lt;a href=&amp;quot;https://rodesi.tistory.com/38&amp;quot;
      style=&amp;quot;text-decoration: none; color: #777;&amp;quot;
      onmouseover=&amp;quot;this.style.textDecoration='underline'; this.style.color='#000';&amp;quot;
      onmouseout=&amp;quot;this.style.textDecoration='none'; this.style.color='#777';&amp;quot;&amp;gt;
      ㆍ [대학전쟁3] 양면빙고 웹 개발 09 - &amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt; UI/UX 개선 및 기능 보완 &amp;lt;/span&amp;gt; 
      &amp;lt;/a&amp;gt;
    &amp;lt;/li&amp;gt;
 
    &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;


&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 1 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 1️⃣ 타일 개수에 따른 이동, 뒤집기 제한&amp;lt;/h3&amp;gt;

&amp;lt;!-- App --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
   App.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

 &amp;lt;!-- const --&amp;gt;
   const 추가 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const [turnCount, setTurnCount] = useState(0);
const [phase, setPhase] = useState(&amp;quot;PLACE&amp;quot;);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
ㆍturnCount - 빙고판에 올라가있는 타일의 개수를 판단하기 위해 turnCount를 사용한다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
ㆍphase - turnCount가 14 이상이 되는 순간, phase의 상태를 MOVE_FLIP으로 바꾼다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- endTurn --&amp;gt;
   endTurn 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;setTurnCount(prev =&amp;amp;gt; prev + 1);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
Turn이 지날 때마다 turnCount이 1 씩 증가할 수 있도록 코드를 추가한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- canMoveFlip --&amp;gt;
   canMoveFlip 함수 작성 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const canMoveOrFlip = (tileKey) =&amp;amp;gt; &amp;amp;#123;
    if (phase !== &amp;quot;MOVE_FLIP&amp;quot;) return false;
    if (lastAction &amp;amp;&amp;amp; lastAction.tileKey === tileKey) return false;
    return true;
&amp;amp;#125;;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
phase가 PLACE일 경우 착수만, MOVE_FLIP일 경우에 뒤집기, 이동할 수 있도록 코드를 작성한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- handleFlip --&amp;gt;
   handleFlip 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;if (fromBoard &amp;amp;&amp;amp; !canMoveOrFlip(key)) return;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
착수 14번 이하면 뒤집을 수 없도록 코드를 추가한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- handleDragStart --&amp;gt;
   handleDragStart 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;if (!canMoveOrFlip(active.id)) return;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
착수 14번 이하면 이동할 수 없도록 코드를 추가한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- handleDragEnd --&amp;gt;
   handleDragEnd 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;if (!canMoveOrFlip(active.id)) return;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
착수 14번 이하면 이동할 수 없도록 코드를 추가한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- return --&amp;gt;
   return 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;&amp;amp;lt;BingoBoard
  boardTiles=&amp;amp;#123;boardTiles&amp;amp;#125;
  movableCell=&amp;amp;#123;movableCell&amp;amp;#125;
  onFlip=&amp;amp;#123;(key) =&amp;amp;gt; handleFlip(key, true)&amp;amp;#125;
  isDisabled=&amp;amp;#123;canMoveOrFlip&amp;amp;#125; /&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
BingoTile로 내려주어 실제 동작 차단을 하도록 한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- 4개부터 가능 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    4개부터 이동 가능 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/HrUFg/dJMcacomG1h/AAAAAAAAAAAAAAAAAAAAAKQqpIsyQ9jwwqsZe4GeLbqZYPwZ6Cp-aUQKvw_McrS_/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=EnqKxXehqBYaOCPvxfFFCBo6zD4%3D&amp;quot;
  alt=&amp;quot;4개부터&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
원래는 14개를 착수하여야 이동이 가능하지만, 현재는 테스트 단계이기 때문에 4개로 테스트 하였다.



&amp;lt;!-- 본론 --&amp;gt;
&amp;lt;!-- 2 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 2️⃣ 직전 타일 이동, 뒤집기 제한&amp;lt;/h3&amp;gt;

&amp;lt;!-- App --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
   App.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

 &amp;lt;!-- const --&amp;gt;
   const 추가 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;setLastAction(&amp;amp;#123; tileKey: key, owner: currentTurn &amp;amp;#125;);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
마지막 타일을 저장할 수 있는 const를 추가한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- canMoveOrFlip --&amp;gt;
   canMoveOrFlip 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const canMoveOrFlip = (tileKey) =&amp;amp;gt; &amp;amp;#123;
  if (phase !== &amp;quot;MOVE_FLIP&amp;quot;) return false;
  if (!tileKey) return true;
  if (lastAction &amp;amp;&amp;amp; lastAction.tileKey === tileKey) return false;
 return true;
&amp;amp;#125;;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
직전 턴에 이동/뒤집기한 타일은 다음 턴에 이동/ 뒤집기를 제한하도록 코드를 수정한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- handleFlip --&amp;gt;
   handleFlip 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;setLastAction(&amp;amp;#123; tileKey: key, owner: currentTurn &amp;amp;#125;);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
이번 턴에 뒤집었으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- handleDragStart --&amp;gt;
   handleDragStart 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const activeTileKey = active.data.current?.tileKey ?? active.id;
const tile = myTiles.find(t =&amp;amp;gt; t.key === activeTileKey);
setActiveTile(tile ?? null);&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
이번 턴에 움직였으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- handleDragEnd --&amp;gt;
   handleDragEnd 함수 수정 &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;const movedTile = boardTiles[from];
const movedTile = boardTiles[from];
 if (movedTile?.key) &amp;amp;#123;
   setLastAction(&amp;amp;#123; tileKey: movedTile.key, owner: currentTurn &amp;amp;#125;);      
 &amp;amp;#125; else &amp;amp;#123;
   setLastAction(&amp;amp;#123; tileKey: activeTileKey, owner: currentTurn &amp;amp;#125;);      
 &amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
이번 턴에 움직였으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;!-- 직전 타일 막음 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    직전 타일 막음 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/bTWdZK/dJMcaivi4wQ/AAAAAAAAAAAAAAAAAAAAAAusESiaLL4i62nOxru80GeoNp1CCsbVaBzuXO6J5Cex/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=1QTwIF236J6FQSa%2F%2BFyClOtojPE%3D&amp;quot;
  alt=&amp;quot;직전 타일 막음&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
직전 타일은 뒤집기도 이동도 불가능하다. 이동이 불가능한 타일이 빨간색으로 출력되는 것을 확인할 수 있다.



&amp;lt;!-- 3 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 3️⃣ 이동 자체도 막음 &amp;lt;/h3&amp;gt;

&amp;lt;!-- BingoTile --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
   BingoTile.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

 &amp;lt;!-- disabled --&amp;gt;
   disabled &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;disabled: !!isDisabled,&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
useDraggable 옵션 중 하나인 disabled를 사용해 props로 받은 isDisabled의 드래그 동작 자체를 비활성화한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- 직전 타일 막음 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    직전 타일 막음 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/tETVJ/dJMb99SIyFz/AAAAAAAAAAAAAAAAAAAAAIQ7YX8zgrYCsbEeSxYlE781dJJcHuZR2E5jZ1pQEGsq/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=5myhZjIx1HjsrvsBNo9aDBq4Wf8%3D&amp;quot;
  alt=&amp;quot;직전 타일 막음&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
직전 타일을 이동할 때 빨간색으로 출력하는 것이 아니라 아예 움직이지 않게 막았다.



&amp;lt;!-- 4 --&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;h3&amp;gt; 4️⃣ gray 표시 &amp;lt;/h3&amp;gt;

&amp;lt;!-- BingoTile --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
   BingoTile.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;&amp;amp;lt;TileItem showOverlay=&amp;amp;#123;isDisabled&amp;amp;#125; /&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
props로 받은 isDisabled를 TileItem에게도 넘겨준다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- TileItem --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
   TileItem.js 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;&amp;amp;lt;div className=&amp;quot;tile-img-wrap&amp;quot; data-overlay=&amp;amp;#123;showOverlay ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;&amp;amp;#125;&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
showOverlay 상태값에 따라 서로 다른 CSS 스타일을 적용하기 위해 코드를 작성한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;


&amp;lt;!-- TileItem --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
   TileItem.CSS 코드 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code class=&amp;quot;language-javascript&amp;quot;&amp;gt;.TileItem .tile-img-wrap &amp;amp;#123;
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
  overflow: hidden;
  border-radius: inherit;
&amp;amp;#125;
.tile-img-wrap[data-overlay=&amp;quot;true&amp;quot;] .tile-img &amp;amp;#123;
  cursor: default;   /* 또는 not-allowed */
&amp;amp;#125;
.TileItem .tile-img-wrap[data-overlay=&amp;quot;true&amp;quot;]::before &amp;amp;#123;
  content: &amp;quot;&amp;quot;;
  position: absolute;
  inset: 0;
  background: rgba(0,0,0,0.20);
  pointer-events: none;
  z-index: 2;
  mix-blend-mode: normal;
  transition: background .18s ease;
  border-radius: inherit;
&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; 
&amp;lt;br&amp;gt;
true일 경우 (직전에 착수, 이동, 뒤집은 타일일 경우) 회색처리를 한다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;



&amp;lt;!-- 직전 타일 회색 (img) --&amp;gt;
&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;
    직전 타일 회색 &amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img
  src=&amp;quot;https://blog.kakaocdn.net/dna/rjqSW/dJMcabJMvTk/AAAAAAAAAAAAAAAAAAAAABgMKqcqOdrCevDP5EvmZ0ZQqtyivKnjp5rqUGteguoH/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=CIhNYpWET0Zi3G6jwsGfqDWbYhE%3D&amp;quot;
  alt=&amp;quot;직전 타일 회색&amp;quot;
  style=&amp;quot;width: 100%; max-width: 700px; height: auto;&amp;quot;
&amp;gt; &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
직전 타일 (착수, 이동, 뒤집기)은 건들지 못하기 떄문에 시각적으로 볼 수 있게 타일에 회색 처리를 했다. 
&amp;lt;span style=&amp;quot;text-decoration: line-through;&amp;quot;&amp;gt;근데 뭔가 빙고 완성이 한 눈에 보이지 않아 나중에 삭제할 수도..&amp;lt;/span&amp;gt;


&amp;lt;!-- 앞으로 --&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;h3&amp;gt; 5️⃣ 앞으로... &amp;lt;/h3&amp;gt;
이동, 뒤집기를 제한하는 기능을 만들었다. &amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
이제 시간 제한을 만들고 빙고 완성 시, 빙고를 highlight하는 기능을 만들 것이다.
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;div style=&amp;quot;height:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;/div&amp;gt;&quot;&gt;
&lt;div style=&quot;max-width: 900px; margin: 0 auto;&quot;&gt;&lt;br /&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 서론 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0️⃣ 지난 번까지..&lt;/h3&gt;
대학전쟁에 나온 '양면빙고 (double sided bingo)' 게임을 보고 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
이 게임을 웹으로 만들면 재밌겠다는 생각이 들어 양면빙고 웹 개발을 시작했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
오늘 드디어 대학전쟁3 결승전까지 끝났다.. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
진짜 결승전 개존잼.. 안 본 사람들 다들 보러가세여 ㄱㄱ &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
나의 양면빙고 웹도 거의거의 막바지 단계다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
지난 글에서는 빙고가 완성되면 게임을 중단하고, player가 행동하면 turn이 넘어가는 기능을 구현했다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
오늘은 이어서 빙고판 위의 타일 개수에 따라 &lt;span style=&quot;text-decoration: underline;&quot;&gt;이동 뒤집기&lt;/span&gt;를 제한하는 기능을 구현해보고자 한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 목록 --&gt;
&lt;div style=&quot;display: inline-block; align-items: center; border-radius: 8px; padding: 10px; background-color: #ddd;&quot;&gt;
&lt;div style=&quot;display: inline-block;&quot;&gt;&lt;span style=&quot;font-weight: bold; font-size: 18px;&quot;&gt; ☰ &amp;nbsp; 양면빙고 (double-sided-bingo) 개발 과정 &amp;nbsp; &lt;/span&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/19&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 01 - &lt;span style=&quot;font-weight: bold;&quot;&gt; list, 타일 뒤집기 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/23&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 02 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 list 내 이동 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/25&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 03 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 착수 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/26&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 04 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 타일 뒤집기, 이동 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/27&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 05 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 빙고 판단, player 2명 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/36&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 07 - &lt;span style=&quot;font-weight: bold;&quot;&gt; timer, highlight, restart &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/37&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 08 - &lt;span style=&quot;font-weight: bold;&quot;&gt; 2인 play &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;height: 5px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;margin: 0px; padding: 0px; list-style-position: inside; gap: 16px; list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style: none;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: #777;&quot; href=&quot;https://rodesi.tistory.com/38&quot;&gt; ㆍ [대학전쟁3] 양면빙고 웹 개발 09 - &lt;span style=&quot;font-weight: bold;&quot;&gt; UI/UX 개선 및 기능 보완 &lt;/span&gt; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 본론 --&gt; &lt;!-- 1 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 타일 개수에 따른 이동, 뒤집기 제한&lt;/h3&gt;
&lt;!-- App --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   App.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- const --&gt;   const 추가 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const [turnCount, setTurnCount] = useState(0);
const [phase, setPhase] = useState(&quot;PLACE&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;ㆍturnCount - 빙고판에 올라가있는 타일의 개수를 판단하기 위해 turnCount를 사용한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
ㆍphase - turnCount가 14 이상이 되는 순간, phase의 상태를 MOVE_FLIP으로 바꾼다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- endTurn --&gt;   endTurn 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;setTurnCount(prev =&amp;gt; prev + 1);&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;Turn이 지날 때마다 turnCount이 1 씩 증가할 수 있도록 코드를 추가한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- canMoveFlip --&gt;   canMoveFlip 함수 작성 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const canMoveOrFlip = (tileKey) =&amp;gt; {
    if (phase !== &quot;MOVE_FLIP&quot;) return false;
    if (lastAction &amp;amp;&amp;amp; lastAction.tileKey === tileKey) return false;
    return true;
};&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;phase가 PLACE일 경우 착수만, MOVE_FLIP일 경우에 뒤집기, 이동할 수 있도록 코드를 작성한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- handleFlip --&gt;   handleFlip 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;if (fromBoard &amp;amp;&amp;amp; !canMoveOrFlip(key)) return;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;착수 14번 이하면 뒤집을 수 없도록 코드를 추가한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- handleDragStart --&gt;   handleDragStart 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;if (!canMoveOrFlip(active.id)) return;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;착수 14번 이하면 이동할 수 없도록 코드를 추가한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- handleDragEnd --&gt;   handleDragEnd 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;if (!canMoveOrFlip(active.id)) return;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;착수 14번 이하면 이동할 수 없도록 코드를 추가한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- return --&gt;   return 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;BingoBoard
  boardTiles={boardTiles}
  movableCell={movableCell}
  onFlip={(key) =&amp;gt; handleFlip(key, true)}
  isDisabled={canMoveOrFlip} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;BingoTile로 내려주어 실제 동작 차단을 하도록 한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 4개부터 가능 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   4개부터 이동 가능 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/HrUFg/dJMcacomG1h/AAAAAAAAAAAAAAAAAAAAAKQqpIsyQ9jwwqsZe4GeLbqZYPwZ6Cp-aUQKvw_McrS_/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=EnqKxXehqBYaOCPvxfFFCBo6zD4%3D&quot; alt=&quot;4개부터&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
원래는 14개를 착수하여야 이동이 가능하지만, 현재는 테스트 단계이기 때문에 4개로 테스트 하였다. &lt;!-- 본론 --&gt; &lt;!-- 2 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 직전 타일 이동, 뒤집기 제한&lt;/h3&gt;
&lt;!-- App --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   App.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- const --&gt;   const 추가 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;setLastAction({ tileKey: key, owner: currentTurn });&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;마지막 타일을 저장할 수 있는 const를 추가한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- canMoveOrFlip --&gt;   canMoveOrFlip 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const canMoveOrFlip = (tileKey) =&amp;gt; {
  if (phase !== &quot;MOVE_FLIP&quot;) return false;
  if (!tileKey) return true;
  if (lastAction &amp;amp;&amp;amp; lastAction.tileKey === tileKey) return false;
 return true;
};&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;직전 턴에 이동/뒤집기한 타일은 다음 턴에 이동/ 뒤집기를 제한하도록 코드를 수정한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- handleFlip --&gt;   handleFlip 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;setLastAction({ tileKey: key, owner: currentTurn });&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;이번 턴에 뒤집었으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- handleDragStart --&gt;   handleDragStart 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const activeTileKey = active.data.current?.tileKey ?? active.id;
const tile = myTiles.find(t =&amp;gt; t.key === activeTileKey);
setActiveTile(tile ?? null);&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;이번 턴에 움직였으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- handleDragEnd --&gt;   handleDragEnd 함수 수정 &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const movedTile = boardTiles[from];
const movedTile = boardTiles[from];
 if (movedTile?.key) {
   setLastAction({ tileKey: movedTile.key, owner: currentTurn });      
 } else {
   setLastAction({ tileKey: activeTileKey, owner: currentTurn });      
 }&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;이번 턴에 움직였으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 직전 타일 막음 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   직전 타일 막음 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/bTWdZK/dJMcaivi4wQ/AAAAAAAAAAAAAAAAAAAAAAusESiaLL4i62nOxru80GeoNp1CCsbVaBzuXO6J5Cex/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=1QTwIF236J6FQSa%2F%2BFyClOtojPE%3D&quot; alt=&quot;직전 타일 막음&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
직전 타일은 뒤집기도 이동도 불가능하다. 이동이 불가능한 타일이 빨간색으로 출력되는 것을 확인할 수 있다. &lt;!-- 3 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 이동 자체도 막음&lt;/h3&gt;
&lt;!-- BingoTile --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   BingoTile.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- disabled --&gt;   disabled &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;disabled: !!isDisabled,&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;useDraggable 옵션 중 하나인 disabled를 사용해 props로 받은 isDisabled의 드래그 동작 자체를 비활성화한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 직전 타일 막음 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   직전 타일 막음 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/tETVJ/dJMb99SIyFz/AAAAAAAAAAAAAAAAAAAAAIQ7YX8zgrYCsbEeSxYlE781dJJcHuZR2E5jZ1pQEGsq/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=5myhZjIx1HjsrvsBNo9aDBq4Wf8%3D&quot; alt=&quot;직전 타일 막음&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
직전 타일을 이동할 때 빨간색으로 출력하는 것이 아니라 아예 움직이지 않게 막았다. &lt;!-- 4 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ gray 표시&lt;/h3&gt;
&lt;!-- BingoTile --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   BingoTile.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;TileItem showOverlay={isDisabled} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;props로 받은 isDisabled를 TileItem에게도 넘겨준다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- TileItem --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   TileItem.js 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;div className=&quot;tile-img-wrap&quot; data-overlay={showOverlay ? &quot;true&quot; : &quot;false&quot;}&amp;gt; &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;showOverlay 상태값에 따라 서로 다른 CSS 스타일을 적용하기 위해 코드를 작성한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- TileItem --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   TileItem.CSS 코드 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;.TileItem .tile-img-wrap {
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
  overflow: hidden;
  border-radius: inherit;
}
.tile-img-wrap[data-overlay=&quot;true&quot;] .tile-img {
  cursor: default;   /* 또는 not-allowed */
}
.TileItem .tile-img-wrap[data-overlay=&quot;true&quot;]::before {
  content: &quot;&quot;;
  position: absolute;
  inset: 0;
  background: rgba(0,0,0,0.20);
  pointer-events: none;
  z-index: 2;
  mix-blend-mode: normal;
  transition: background .18s ease;
  border-radius: inherit;
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;true일 경우 (직전에 착수, 이동, 뒤집은 타일일 경우) 회색처리를 한다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;!-- 직전 타일 회색 (img) --&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;   직전 타일 회색 &lt;/span&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;img style=&quot;width: 100%; max-width: 700px; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dna/rjqSW/dJMcabJMvTk/AAAAAAAAAAAAAAAAAAAAABgMKqcqOdrCevDP5EvmZ0ZQqtyivKnjp5rqUGteguoH/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=CIhNYpWET0Zi3G6jwsGfqDWbYhE%3D&quot; alt=&quot;직전 타일 회색&quot; /&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
직전 타일 (착수, 이동, 뒤집기)은 건들지 못하기 떄문에 시각적으로 볼 수 있게 타일에 회색 처리를 했다. &lt;span style=&quot;text-decoration: line-through;&quot;&gt;근데 뭔가 빙고 완성이 한 눈에 보이지 않아 나중에 삭제할 수도..&lt;/span&gt; &lt;!-- 앞으로 --&gt; &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5️⃣ 앞으로...&lt;/h3&gt;
이동, 뒤집기를 제한하는 기능을 만들었다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
이제 시간 제한을 만들고 빙고 완성 시, 빙고를 highlight하는 기능을 만들 것이다. &lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;height: 10px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B57ke/dJMcabCYZ6c/dj9tfkTTnAm4UjKqLCeHkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B57ke/dJMcabCYZ6c/dj9tfkTTnAm4UjKqLCeHkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B57ke/dJMcabCYZ6c/dj9tfkTTnAm4UjKqLCeHkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB57ke%2FdJMcabCYZ6c%2Fdj9tfkTTnAm4UjKqLCeHkK%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;700&quot; height=&quot;688&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개인 개발/대학전쟁</category>
      <category>강지후</category>
      <category>김동연</category>
      <category>김민석</category>
      <category>서울대</category>
      <category>성균관대</category>
      <category>성태훈</category>
      <category>이동재</category>
      <category>이승현</category>
      <category>주민서</category>
      <category>한서연</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/31</guid>
      <comments>https://rodesi.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 23 Jan 2026 20:01:20 +0900</pubDate>
    </item>
    <item>
      <title>[아나콘다] 차근차근 로그인 안 하고 / 로그인 없이 파이썬 아나콘다 다운로드 설치하는 법 anaconda download without log</title>
      <link>https://rodesi.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;노트북이 맛탱이가 갔다....&lt;br&gt;&amp;nbsp;&lt;br&gt;아나콘다 VS code 등등 다시 다 다운로드 하는 중..&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;새 학기 첫 수업 때는 항상 아나콘다를 설치하는데 수업 놓친 학생들도 따라 설치하면 좋을 것 같다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1️⃣ anaconda 설치&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;a href=&quot;https://www.anaconda.com/download/success&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://www.anaconda.com/download/success&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;위 링크에 들어간다.&lt;/span&gt;&lt;br&gt;이 링크를 누르면 &lt;span style=&quot;color: #ee2323;&quot;&gt;로그인 없이&lt;/span&gt; 다운로드 할 수 있는 창으로 넘어간다.&lt;br&gt;(cf 아나콘다 웹사이트 우측에 있는 free download를 누르면 로그인하는 창으로 넘어간다..)&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgh5EU/dJMcachz5ss/IeSvdmQkrB0bAOXMUn0r3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgh5EU/dJMcachz5ss/IeSvdmQkrB0bAOXMUn0r3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgh5EU/dJMcachz5ss/IeSvdmQkrB0bAOXMUn0r3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdgh5EU%2FdJMcachz5ss%2FIeSvdmQkrB0bAOXMUn0r3K%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;97&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;  Windows - Anaconda Distribution&lt;br&gt;각자 운영체제에 맞는 탭에 들어가 다운로드를 진행한다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;945&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYOzUP/dJMcai27T7e/MjNiL6LEkulHtbv0r7jrKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYOzUP/dJMcai27T7e/MjNiL6LEkulHtbv0r7jrKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYOzUP/dJMcai27T7e/MjNiL6LEkulHtbv0r7jrKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYOzUP%2FdJMcai27T7e%2FMjNiL6LEkulHtbv0r7jrKk%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;700&quot; height=&quot;347&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;945&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;  다운로드 중..&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpKupc/dJMcacol6JX/EnKGZLDL2O1K8nLHbTUfiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpKupc/dJMcacol6JX/EnKGZLDL2O1K8nLHbTUfiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpKupc/dJMcacol6JX/EnKGZLDL2O1K8nLHbTUfiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpKupc%2FdJMcacol6JX%2FEnKGZLDL2O1K8nLHbTUfiK%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;223&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2️⃣ anaconda Setup&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span style=&quot;color: #333333;&quot;&gt; 더블 클릭 후 실행&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLj3pa/dJMcaa49a4T/O4EdS3pKVNstU7v0jlPl11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLj3pa/dJMcaa49a4T/O4EdS3pKVNstU7v0jlPl11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLj3pa/dJMcaa49a4T/O4EdS3pKVNstU7v0jlPl11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLj3pa%2FdJMcaa49a4T%2FO4EdS3pKVNstU7v0jlPl11%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;400&quot; height=&quot;49&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt; &lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Next / I Agree&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucDNh/dJMb996eVzB/1rQP8vOQXXZDKJNdGstjyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucDNh/dJMb996eVzB/1rQP8vOQXXZDKJNdGstjyK/img.png&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;574&quot; style=&quot;width: 49.8311%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucDNh/dJMb996eVzB/1rQP8vOQXXZDKJNdGstjyK/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FucDNh%2FdJMb996eVzB%2F1rQP8vOQXXZDKJNdGstjyK%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;751&quot; height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bedizI/dJMcad1OIOM/7ID8eff80KWHIbTHRtSLd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bedizI/dJMcad1OIOM/7ID8eff80KWHIbTHRtSLd1/img.png&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;579&quot; style=&quot;width: 49.0061%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bedizI/dJMcad1OIOM/7ID8eff80KWHIbTHRtSLd1/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbedizI%2FdJMcad1OIOM%2F7ID8eff80KWHIbTHRtSLd1%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;745&quot; height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;  Next&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt; ✅ Just &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Me (recommended)&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Just Me 체크 후 Next를 누른다.&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IFt0j/dJMcad1OIOQ/K31ougNSKr50KL0k2x4B1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IFt0j/dJMcad1OIOQ/K31ougNSKr50KL0k2x4B1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IFt0j/dJMcad1OIOQ/K31ougNSKr50KL0k2x4B1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIFt0j%2FdJMcad1OIOQ%2FK31ougNSKr50KL0k2x4B1K%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;600&quot; height=&quot;456&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt; &lt;span style=&quot;color: #333333;&quot;&gt; Next &lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Destination Folder &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;C:\Users\{사용자이름}\anaconda3&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 확인 후 Next&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuk421/dJMcacPrnHM/kBnIs3eXnzkhNxo469Va6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuk421/dJMcacPrnHM/kBnIs3eXnzkhNxo469Va6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuk421/dJMcacPrnHM/kBnIs3eXnzkhNxo469Va6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuk421%2FdJMcacPrnHM%2FkBnIs3eXnzkhNxo469Va6k%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;600&quot; height=&quot;467&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt; &lt;span style=&quot;color: #333333;&quot;&gt; Install&lt;/span&gt;&lt;br&gt;✅ Create shortcuts (supported packages only).&lt;br&gt;✅ Add Anaconda3 to my PATH environment variable &amp;lt;&amp;lt; &lt;span style=&quot;color: #ee2323;&quot;&gt;반드시 체크&lt;/span&gt;&lt;br&gt;✅ Register Anaconda3 as my default Python 3.13&lt;br&gt;☑️ Clear the package cache upon completion&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn8Af8/dJMcacPrnHN/4VOUZ6sDeKB25L3WHMQl81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn8Af8/dJMcacPrnHN/4VOUZ6sDeKB25L3WHMQl81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn8Af8/dJMcacPrnHN/4VOUZ6sDeKB25L3WHMQl81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn8Af8%2FdJMcacPrnHN%2F4VOUZ6sDeKB25L3WHMQl81%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;600&quot; height=&quot;465&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt; &lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Next&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Completed 되면 next&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J2nGh/dJMcagK4z26/CReWXjKNJxiwFkhLs8W320/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J2nGh/dJMcagK4z26/CReWXjKNJxiwFkhLs8W320/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J2nGh/dJMcagK4z26/CReWXjKNJxiwFkhLs8W320/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ2nGh%2FdJMcagK4z26%2FCReWXjKNJxiwFkhLs8W320%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;600&quot; height=&quot;470&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt; &lt;span style=&quot;color: #333333;&quot;&gt; Next&lt;/span&gt;&lt;br&gt;Everything you love about Anaconda now available from the cloud with Anaconda's fully-loaded Jupyter notebook.&lt;br&gt;No setup required. Get started for free.&lt;br&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Code in the cloud with Anaconda Notebooks&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rgLoY/dJMcafk5kdQ/0WicOMNKSLOCyN7nf2vBXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rgLoY/dJMcafk5kdQ/0WicOMNKSLOCyN7nf2vBXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rgLoY/dJMcafk5kdQ/0WicOMNKSLOCyN7nf2vBXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrgLoY%2FdJMcafk5kdQ%2F0WicOMNKSLOCyN7nf2vBXk%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;600&quot; height=&quot;466&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt; &lt;span style=&quot;color: #333333;&quot;&gt; Finish&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;체크 해제 후 Finish&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt; ☑️ &amp;nbsp;Launch Anaconda Navigator&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;☑️ Welcome to Anaconda&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lQ6ml/dJMcagddJb1/z9HeKd0BF8tnzJWfwkZ4RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lQ6ml/dJMcagddJb1/z9HeKd0BF8tnzJWfwkZ4RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lQ6ml/dJMcagddJb1/z9HeKd0BF8tnzJWfwkZ4RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlQ6ml%2FdJMcagddJb1%2Fz9HeKd0BF8tnzJWfwkZ4RK%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;600&quot; height=&quot;471&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3️⃣ anaconda 설치 확인&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span style=&quot;color: #333333;&quot;&gt; anaconda python 설치 확인&lt;/span&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;conda --version

python --version&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqt5t/dJMcahiUeeP/ksNW9c6EBUJlCcJYNLIj11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqt5t/dJMcahiUeeP/ksNW9c6EBUJlCcJYNLIj11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqt5t/dJMcahiUeeP/ksNW9c6EBUJlCcJYNLIj11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvqt5t%2FdJMcahiUeeP%2FksNW9c6EBUJlCcJYNLIj11%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;228&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt; &lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;tmi..&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;anaconda 용량 진짜 크다....&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;무려무려 12기가..&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpy2rV/dJMcaiB4hFF/0G2zWbKLlkKbhpnRey4qeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpy2rV/dJMcaiB4hFF/0G2zWbKLlkKbhpnRey4qeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpy2rV/dJMcaiB4hFF/0G2zWbKLlkKbhpnRey4qeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcpy2rV%2FdJMcaiB4hFF%2F0G2zWbKLlkKbhpnRey4qeK%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;737&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjf8au/dJMcagjZnNC/hqK9AgJivGMbuDOH0BXwwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjf8au/dJMcagjZnNC/hqK9AgJivGMbuDOH0BXwwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjf8au/dJMcagjZnNC/hqK9AgJivGMbuDOH0BXwwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjf8au%2FdJMcagjZnNC%2FhqK9AgJivGMbuDOH0BXwwk%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;499&quot; height=&quot;445&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;</description>
      <category>개발/정보</category>
      <category>Anaconda</category>
      <category>download</category>
      <category>python</category>
      <category>spyder</category>
      <category>설치</category>
      <category>스파이더</category>
      <category>아나콘다</category>
      <category>파이썬</category>
      <author>로데시</author>
      <guid isPermaLink="true">https://rodesi.tistory.com/29</guid>
      <comments>https://rodesi.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 22 Jan 2026 15:18:19 +0900</pubDate>
    </item>
  </channel>
</rss>