<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>while (true)</title>
    <link>https://3colored.tistory.com/</link>
    <description>자바, JSP, 스프링, 알고리즘 관련 정보 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 16 Jun 2026 12:51:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>3COLORED</managingEditor>
    <image>
      <title>while (true)</title>
      <url>https://tistory1.daumcdn.net/tistory/2957813/attach/f98edcd1b8ee44d7a185d7deb83ff406</url>
      <link>https://3colored.tistory.com</link>
    </image>
    <item>
      <title>kotlin enum method</title>
      <link>https://3colored.tistory.com/31</link>
      <description>&lt;pre id=&quot;code_1632047112540&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// jdk 1.7 style
enum class Formula {
    POWER {
        override fun calculate(n: Long): Long {
            return n * n;
        }

        // unwanted method
        override fun calculate(n: Long, m: Long): Double {
            return 0.0
        }
    },
    GAUSE {
        override fun calculate(n: Long): Long {
            return (1 + n) * (n / 2)
        }

        // unwanted method
        override fun calculate(n: Long, m: Long): Double {
            return 0.0
        }
    },
    PYTHAGORAS {
        override fun calculate(n: Long, m: Long): Double {
            return sqrt((calculate(n) + calculate(m)).toDouble())
        }

        // unwanted method
        override fun calculate(n: Long): Long {
            return 0
        }
    };
    abstract fun calculate(n: Long): Long // implements POWER, GAUSE
    abstract fun calculate(n: Long, m: Long): Double // implements PYTHAGORAS
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 불필요한 메서드까지 구현해야하는 단점이 있으므로 불편합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1632047174190&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// jdk 8 style
import java.util.function.BiFunction
import java.util.function.Function
import kotlin.math.sqrt

enum class Formula {
    POWER(Function&amp;lt;Long, Long&amp;gt; { n: Long -&amp;gt; n * n }),
    GAUSE(Function&amp;lt;Long, Long&amp;gt; { n: Long -&amp;gt; (1 + n) * (n / 2) }),
    PYTHAGORAS(BiFunction { n: Long, m: Long -&amp;gt; sqrt((POWER.calculate(n) + POWER.calculate(m)).toDouble()) });

    private lateinit var expression: Function&amp;lt;Long, Long&amp;gt;
    private lateinit var pythagoras: BiFunction&amp;lt;Long, Long, Double&amp;gt;

    constructor(expression: Function&amp;lt;Long, Long&amp;gt;) {
        this.expression = expression
    }

    constructor(pythagoras: BiFunction&amp;lt;Long, Long, Double&amp;gt;) {
        this.pythagoras = pythagoras
    }

    fun calculate(value: Long): Long {
        return expression.apply(value)
    }

    fun calculate(a: Long, b: Long): Double {
        return pythagoras.apply(a, b)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 방식으로 구현하면 함수형 스타일로, 불필요한 메서드까지 구현해야하는 불편함 없이 사용할 수 있습니다.&lt;/p&gt;</description>
      <category>Other</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/31</guid>
      <comments>https://3colored.tistory.com/31#entry31comment</comments>
      <pubDate>Sun, 19 Sep 2021 19:28:05 +0900</pubDate>
    </item>
    <item>
      <title>disable typescript duck typing (타입스크립트 덕타이핑 제한)</title>
      <link>https://3colored.tistory.com/30</link>
      <description>&lt;pre id=&quot;code_1627508523845&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Point2D {
  norminal: Point2D;
  x: number;
  y: number;
}

interface Point3D {
  norminal: Point3D;
  x: number;
  y: number;
  z: number;
}

type Nominal&amp;lt;T&amp;gt; = T;

const point2D = &amp;lt;Nominal&amp;lt;Point2D&amp;gt;&amp;gt; { x: 16, y: 24 };
const point3D = &amp;lt;Nominal&amp;lt;Point3D&amp;gt;&amp;gt; { x: 39, y: 7, z: 12 };

interface DisableDuckTyping&amp;lt;T extends Point2D&amp;gt; extends Point2D {  readonly norminal: T;  }
  
type p2dType = DisableDuckTyping&amp;lt;Point2D&amp;gt;;
type p3dType = DisableDuckTyping&amp;lt;Point3D&amp;gt;;

const p2d = (1 as never as p2dType);
const p3d = (2 as never as p3dType); 

// then

function iTakePoint2D(point: p3dType) { 
    console.log(point.x, point.y);
}

iTakePoint2D(point2D); // error: iTakePoint2D parameter type mismatch
iTakePoint2D(point3D); // point type is p3dType, so it works.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Frontend</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/30</guid>
      <comments>https://3colored.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 29 Jul 2021 06:42:41 +0900</pubDate>
    </item>
    <item>
      <title>java 슈퍼 타입 토큰을 활용한 map 및 list 구현</title>
      <link>https://3colored.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1627504171660&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.company.SuperTypeToken;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.junit.Test;
import org.junit.jupiter.api.DisplayName;
import org.springframework.core.ResolvableType;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;

import static java.util.stream.Collectors.toList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class SuperTypeTokenTest {

    @EqualsAndHashCode
    static class TypeSafeMap {
        private final Map&amp;lt;Type, Object&amp;gt; map = new HashMap&amp;lt;&amp;gt;();

        &amp;lt;T&amp;gt; void put(TypeReference&amp;lt;T&amp;gt; tr, T value) {
            map.put(tr.type, value);
        }

        // explicit type casting is perfectly safe.
        @SuppressWarnings(&quot;unchecked&quot;)
        &amp;lt;T&amp;gt; T get(TypeReference&amp;lt;T&amp;gt; tr) {
            if (tr.type instanceof Class&amp;lt;?&amp;gt;) return ((Class&amp;lt;T&amp;gt;) tr.type).cast(map.get(tr.type));
            else return ((Class&amp;lt;T&amp;gt;)((ParameterizedType)tr.type).getRawType()).cast(map.get(tr.type));
        }
        
        public int size() { return map.size(); }
        public void clear() { map.clear(); }
        public boolean isEmpty() { return map.isEmpty(); }
        public boolean containsKey(Object key) { return map.containsKey(key); }
        public &amp;lt;T&amp;gt; T remove(T key) { return (T) map.remove(key); }
        public boolean containsValue(Object value) { return map.containsValue(value); }
        public Set&amp;lt;Type&amp;gt; keySet() { return map.keySet(); }

    }

    static class TypeSafeList implements Iterable&amp;lt;TypeSafeList.Types&amp;lt;?&amp;gt;&amp;gt; {

        @Override
        public Iterator&amp;lt;Types&amp;lt;?&amp;gt;&amp;gt; iterator() {
            return list.iterator();
        }

        @ToString @EqualsAndHashCode
        static class Types&amp;lt;T&amp;gt; {
            private Type type;
            private T data;

            public Type getType() { return type; }
            public T getData() { return data; }
            boolean isSameTypeWith(Type rtype) { return rtype.equals(getType()); }
        }

        private final List&amp;lt;Types&amp;lt;?&amp;gt;&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();

        &amp;lt;T&amp;gt; void add(TypeReference&amp;lt;T&amp;gt; tr, T data) {
            Types&amp;lt;T&amp;gt; types = new Types&amp;lt;&amp;gt;();
            types.type = tr.type;
            types.data = data;
            list.add(types);
        }

        /**
         * @param &amp;lt;T&amp;gt; tr.type
         * @param tr 타입안정성을 위해 사용된 슈퍼 타입토큰
         * @return  tr.type 에 해당하는 모든 값을 list 에서 찾아내어 리스트로 모아서 반환
         */
        // explicit type casting is perfectly safe.
        @SuppressWarnings(&quot;unchecked&quot;)
        &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; getValues(TypeReference&amp;lt;T&amp;gt; tr) {
            if (tr.type instanceof Class&amp;lt;?&amp;gt;)
                return (List&amp;lt;T&amp;gt;) list.stream().filter(e -&amp;gt; e.type.equals(tr.type)).map(e -&amp;gt; e.data).collect(toList());
            else
                return (List&amp;lt;T&amp;gt;) ((Class&amp;lt;T&amp;gt;)((ParameterizedType)tr.type).getRawType()).cast(list.stream().filter(e -&amp;gt; e.type.equals(tr.type)).map(e -&amp;gt; e.data).collect(toList()));
        }

        Type getType(int index) {
            return list.get(index).getType();
        }

        // only one value contains in list. list is immutable.
        List&amp;lt;?&amp;gt; getValue(int index) {
            return List.of(list.get(index).getData());
        }

        public int size() {
            return list.size();
        }

        public List&amp;lt;Types&amp;lt;?&amp;gt;&amp;gt; getList() {
            return list;
        }
    }

    // T does not used in this class directly, but indirectly (getGenericSuperclass()) uses.
    abstract static class TypeReference&amp;lt;T&amp;gt; {
        final Type type;

        public TypeReference() {
            Type sType = this.getClass().getGenericSuperclass();
            if (sType instanceof ParameterizedType) {
                this.type = ((ParameterizedType) sType).getActualTypeArguments()[0];
            } else {
                throw new RuntimeException();
            }
        }

    }

    enum Grade { VIP, VVIP }
    @ToString @Getter @EqualsAndHashCode
    static class User {
        private final String name;
        private final Integer age;
        private Grade grade;

        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
            this.grade = Grade.VIP;
        }
        public User setGrade(Grade grade) { this.grade = grade; return this; }
    }

    @Test
    @DisplayName(&quot;타입 안정성을 지닌 다수의 데이터타입을 가지는 해시맵이 구현되었는지 검증 테스트&quot;)
    public void typeSafeMapTest() {

        // given
        TypeSafeMap m = new TypeSafeMap();

        // when
        m.put(new TypeReference&amp;lt;String&amp;gt;(){}, &quot;String&quot;);
        m.put(new TypeReference&amp;lt;Integer&amp;gt;(){}, 1);
        m.put(new TypeReference&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt;(){}, List.of(1,2,3));
        m.put(new TypeReference&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;(){}, List.of(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;));

        // then
        assertThat(m.get(new TypeReference&amp;lt;String&amp;gt;(){})).isEqualTo(&quot;String&quot;);
        assertThat(m.get(new TypeReference&amp;lt;Integer&amp;gt;(){})).isEqualTo(1);
        assertThat(m.get(new TypeReference&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt;(){})).isEqualTo(List.of(1,2,3));
        assertThat(m.get(new TypeReference&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;(){})).isEqualTo(List.of(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;));
    }

    @Test
    @DisplayName(&quot;스프링이 지원하는 ResolvableType 을 이용한 다양한 타입에 대한 접근이 가능한지에 대하여 검증&quot;)
    public void testResolvableType() {
        ResolvableType rt = ResolvableType.forInstance(new TypeReference&amp;lt;List&amp;lt;Map&amp;lt;Set&amp;lt;Integer&amp;gt;, List&amp;lt;String&amp;gt;&amp;gt;&amp;gt;&amp;gt;() {});

        assertThat(rt.getSuperType().getGenerics().length).isEqualTo(1);
        assertThat(rt.getSuperType().getNested(1).toString()).isEqualTo(&quot;com.company.SuperTypeToken.SuperTypeTokenTest$TypeReference&amp;lt;java.util.List&amp;lt;java.util.Map&amp;lt;java.util.Set&amp;lt;java.lang.Integer&amp;gt;, &quot; +
                                                                            &quot;java.util.List&amp;lt;java.lang.String&amp;gt;&amp;gt;&amp;gt;&amp;gt;&quot;);
        assertThat(rt.getSuperType().getNested(2).toString()).isEqualTo(&quot;java.util.List&amp;lt;java.util.Map&amp;lt;java.util.Set&amp;lt;java.lang.Integer&amp;gt;, java.util.List&amp;lt;java.lang.String&amp;gt;&amp;gt;&amp;gt;&quot;);
        assertThat(rt.getSuperType().getNested(3).toString()).isEqualTo(&quot;java.util.Map&amp;lt;java.util.Set&amp;lt;java.lang.Integer&amp;gt;, java.util.List&amp;lt;java.lang.String&amp;gt;&amp;gt;&quot;);
        assertThat(rt.getSuperType().getNested(4).toString()).isEqualTo(&quot;java.util.List&amp;lt;java.lang.String&amp;gt;&quot;);
        assertThat(rt.getSuperType().getNested(5).toString()).isEqualTo(&quot;java.lang.String&quot;);
        assertThat(rt.getSuperType().getNested(6).toString()).isEqualTo(&quot;?&quot;);
        assertThat(rt.getSuperType().getNested(7).toString()).isEqualTo(&quot;?&quot;);
        assertThat(rt.getSuperType().getNested(8).toString()).isEqualTo(&quot;?&quot;);
        assertThat(rt.getSuperType().getNested(9).toString()).isEqualTo(&quot;?&quot;);
    }

    @Test
    @DisplayName(&quot;typeSafeMap validate value&quot;)
    public void typeSafeMapTest2() {
        // given
        TypeSafeMap typeSafeMap = new TypeSafeMap() {};

        // when
        typeSafeMap.put(new TypeReference&amp;lt;&amp;gt;(){},List.of(&quot;One&quot;));
        typeSafeMap.put(new TypeReference&amp;lt;&amp;gt;(){},12.0);
        typeSafeMap.put(new TypeReference&amp;lt;&amp;gt;(){},List.of(Set.of(1, 2, 3)));

        // then
        assertThat(typeSafeMap.get(new TypeReference&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;() {})).isEqualTo(List.of(&quot;One&quot;));
        assertThat(typeSafeMap.get(new TypeReference&amp;lt;Double&amp;gt;() {})).isEqualTo(12.0);
        assertThat(typeSafeMap.get(new TypeReference&amp;lt;List&amp;lt;Set&amp;lt;Integer&amp;gt;&amp;gt;&amp;gt;() {})).isEqualTo(List.of(Set.of(1, 2, 3)));

        // after check
        // typeSafeMap.map.forEach((k, v) -&amp;gt; System.out.println(k + &quot; : &quot; + v));
    }


    @Test
    @DisplayName(&quot;TypeSafeList 에 들어간 타입 중 특정 타입 값들을 모두 리스트로 꺼내어 타입과 값을 검증함, getValues(TypeReference tr) 사용&quot;)
    public void typeSafeListTest() {

        // given
        TypeSafeList typeSafeList = new TypeSafeList();

        // when
        typeSafeList.add(new TypeReference&amp;lt;Integer&amp;gt;() {}, 4934);
        typeSafeList.add(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;() {}, List.of(13.0, 50.2));
        typeSafeList.add(new TypeReference&amp;lt;List&amp;lt;Map&amp;lt;Integer, String&amp;gt;&amp;gt;&amp;gt;() {}, List.of(Map.of(42, &quot;the answer to the 'ultimate question of life, the universe, and everything.'&quot;)));
        typeSafeList.add(new TypeReference&amp;lt;User&amp;gt;(){}, new User(&quot;charlie&quot;, 17));
        typeSafeList.add(new TypeReference&amp;lt;User&amp;gt;(){}, new User(&quot;mark&quot;, 31));

        // then
        assertThat(typeSafeList.getValues(new TypeReference&amp;lt;Integer&amp;gt;(){})).isEqualTo(List.of(4934));
        typeSafeList.add(new TypeReference&amp;lt;Integer&amp;gt;() {}, 2391);
        assertThat(typeSafeList.getValues(new TypeReference&amp;lt;Integer&amp;gt;(){})).isEqualTo(List.of(4934, 2391));
        assertThat(typeSafeList.getValues(new TypeReference&amp;lt;String&amp;gt;(){})).isEqualTo(Collections.emptyList());
        assertThat(typeSafeList.getValues(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;(){})).isEqualTo(List.of(List.of(13.0, 50.2)));
        typeSafeList.add(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;(){}, List.of(543.23, 705.06));
        assertThat(typeSafeList.getValues(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;(){})).isEqualTo(List.of(List.of(13.0, 50.2), List.of(543.23, 705.06)));
        assertThat(typeSafeList.getValues(new TypeReference&amp;lt;User&amp;gt;(){}).get(0).getName()).isEqualTo(&quot;charlie&quot;);
        assertThat(typeSafeList.getValues(new TypeReference&amp;lt;List&amp;lt;Map&amp;lt;Integer, String&amp;gt;&amp;gt;&amp;gt;(){}).get(0).get(0).get(42)).isEqualTo(&quot;the answer to the 'ultimate question of life, the universe, and everything.'&quot;);
        assertThat(typeSafeList.getValues(new TypeReference&amp;lt;User&amp;gt;(){}).get(0).setGrade(Grade.VVIP).getGrade()).isEqualTo(Grade.VVIP);
        /**
         *  after check
         *  print all list elements in typeSafeList
         *  typeSafeList.list.stream().forEach((v) -&amp;gt; System.out.println(v + &quot; &quot;));
         */
    }

    @Test
    @DisplayName(&quot;TypeSafeList에 담긴 타입들을 검증함, getType(int index) 사용&quot;)
    public void typeSafeListTest2() {
        // given
        TypeSafeList typeSafeList = new TypeSafeList();
        // given for compare using typeReference
        ResolvableType listDoubleRT = ResolvableType.forInstance(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;() {});
        ResolvableType listMapRT = ResolvableType.forInstance(new TypeReference&amp;lt;List&amp;lt;Map&amp;lt;Integer, String&amp;gt;&amp;gt;&amp;gt;() {});

        // when
        typeSafeList.add(new TypeReference&amp;lt;Integer&amp;gt;() {}, 4934);
        typeSafeList.add(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;() {}, List.of(13.0, 50.2));
        typeSafeList.add(new TypeReference&amp;lt;List&amp;lt;Map&amp;lt;Integer, String&amp;gt;&amp;gt;&amp;gt;() {}, List.of(Map.of(42, &quot;the answer to the 'ultimate question of life, the universe, and everything.'&quot;)));
        typeSafeList.add(new TypeReference&amp;lt;User&amp;gt;(){}, new User(&quot;charlie&quot;, 17));
        typeSafeList.add(new TypeReference&amp;lt;User&amp;gt;(){}, new User(&quot;mark&quot;, 34));

        assertThat(typeSafeList.getType(0)).isEqualTo(Integer.class);
        assertThat(typeSafeList.getType(1)).isEqualTo(listDoubleRT.getSuperType().getNested(2).getType());
        assertThat(typeSafeList.getType(2)).isEqualTo(listMapRT.getSuperType().getNested(2).getType());
        assertThat(typeSafeList.getType(3)).isEqualTo(User.class);
        assertThat(typeSafeList.getType(4)).isEqualTo(User.class);
    }

    @Test
    @DisplayName(&quot;TypeSafeList에 담긴 값 하나를 꺼내어 검증함, getValue(int value) 사용&quot;)
    public void typeSafeListTest3() {
        // given
        TypeSafeList tslist = new TypeSafeList();
        // given for compare using typeReference
        ResolvableType listDoubleRT = ResolvableType.forInstance(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;() {});
        ResolvableType listMapRT = ResolvableType.forInstance(new TypeReference&amp;lt;List&amp;lt;Map&amp;lt;Integer, String&amp;gt;&amp;gt;&amp;gt;() {});

        // when
        tslist.add(new TypeReference&amp;lt;Integer&amp;gt;() {}, 4934);
        tslist.add(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;() {}, List.of(13.0, 50.2));
        tslist.add(new TypeReference&amp;lt;List&amp;lt;Map&amp;lt;Integer, String&amp;gt;&amp;gt;&amp;gt;() {}, List.of(Map.of(42, &quot;the answer to the 'ultimate question of life, the universe, and everything.'&quot;)));
        tslist.add(new TypeReference&amp;lt;User&amp;gt;(){}, new User(&quot;charlie&quot;, 17));
        tslist.add(new TypeReference&amp;lt;User&amp;gt;(){}, new User(&quot;mark&quot;, 34));

        assertThat(tslist.getValue(0).get(0)).isEqualTo(4934);
        assertThat(tslist.getValue(1).get(0)).isEqualTo(List.of(13.0, 50.2));
        assertThat(tslist.getValue(2).get(0)).isEqualTo(List.of(Map.of(42, &quot;the answer to the 'ultimate question of life, the universe, and everything.'&quot;)));
        assertThat(tslist.getValue(3).get(0)).isEqualTo(new User(&quot;charlie&quot;, 17));
        assertThat(tslist.getValue(4).get(0)).isNotEqualTo(new User(&quot;charlie&quot;, 17));
    }

    @Test
    @DisplayName(&quot;TypeSafeList foreach type validation&quot;)
    public void typeSafeListTest4() {
        // given
        TypeSafeList typeSafeList = new TypeSafeList();

        // when
        typeSafeList.add(new TypeReference&amp;lt;Integer&amp;gt;() {}, 4934);
        typeSafeList.add(new TypeReference&amp;lt;List&amp;lt;Double&amp;gt;&amp;gt;() {}, List.of(13.0, 50.2));
        typeSafeList.add(new TypeReference&amp;lt;List&amp;lt;Map&amp;lt;Integer, String&amp;gt;&amp;gt;&amp;gt;() {}, List.of(Map.of(42, &quot;the answer to the 'ultimate question of life, the universe, and everything.'&quot;)));
        typeSafeList.add(new TypeReference&amp;lt;User&amp;gt;(){}, new User(&quot;charlie&quot;, 17));
        typeSafeList.add(new TypeReference&amp;lt;User&amp;gt;(){}, new User(&quot;mark&quot;, 34));

        for(int i = 0; i &amp;lt; typeSafeList.size(); i++) {
            assertTrue(typeSafeList.getList().get(i).isSameTypeWith(typeSafeList.getType(i)));
        }

        for(var i : typeSafeList) {
            System.out.println(i.getData());
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Java/Java</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/29</guid>
      <comments>https://3colored.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 29 Jul 2021 05:31:19 +0900</pubDate>
    </item>
    <item>
      <title>sort example not using printf</title>
      <link>https://3colored.tistory.com/28</link>
      <description>&lt;pre id=&quot;code_1607785054232&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &quot;functionPointer.h&quot;

#define SIZE(array) sizeof(array) / sizeof(int)

bool descending(int x, int y)
{
    return (x &amp;lt; y);
}

bool ascending(int x, int y)
{
    return (x &amp;gt; y);
}

void swap(int *x, int *y)
{
    int temp;

    temp = *x;
    *x = *y;
    *y = temp;
}
void ft_putchar(char *str)
{
    while (*str)
        write(1, str++, 1);
}

int ft_len(char *str)
{
    int i;

    i = 0;
    while (str[i])
        i++;

    return (i);
}

char *ft_reverse(char *str)
{
    int i;
    int size;
    char temp;

    size = ft_len(str);
    i = 0;
    while (i &amp;lt; size / 2)
    {
        temp = str[i];
        str[i] = str[size - i - 1];
        str[size - i - 1] = temp;
        i++;
    }
    return (str);
}

void sort(int *array, int size, bool (*comparisonFnc)(int, int))
{
    for (int i = 0; i &amp;lt; size - 1; i++)
    {
        for (int j = 0; j &amp;lt; size - i - 1; j++)
        {
            if (comparisonFnc(array[j], array[j + 1]))
                swap(&amp;amp;array[j], &amp;amp;array[j + 1]);
        }
    }
};

int ft_size(int integer)
{
    int i;

    i = 0;
    while (integer &amp;gt; 0)
    {
        integer /= 10;
        i++;
    }
    return (i);
}

char *ft_itoa(int integer)
{
    int nbr;
    bool negative;
    char *result;
    int i;

    negative = false;
    nbr = integer;
    if (nbr &amp;lt; 0)
    {
        nbr = -nbr;
        negative = true;
    }
    result = (char *)malloc(sizeof(char) * ft_size(nbr) + 2);

    i = 0;
    while (nbr &amp;gt; 0)
    {
        result[i++] = (nbr % 10) + 48;
        nbr /= 10;
    }
    if (negative)
        result[i++] = '-';
    result[i] = '\0';
    result = ft_reverse(result);
    return (result);
}

void ft_print_result(int *arr, int size)
{
    for (int i = 0; i &amp;lt; size; i++)
    {
        ft_putchar(ft_itoa(arr[i]));
        ft_putchar(&quot; &quot;);
    }
    ft_putchar(&quot;\n&quot;);
}

int main(void)
{
    int arr[10] = {10, 2, 8, 6, 1, -3, 4, 7, 5, 9};
    int size;
    size = SIZE(arr);
    sort(arr, size, descending);
    ft_print_result(arr, size);
    sort(arr, size, ascending);
    ft_print_result(arr, size);
    return (0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1607785253719&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sort(int* array, int size, bool (*comparisonFnc)(int, int));
bool descending(int x, int y);
bool ascending(int x, int y); 
void swap(int *x, int *y);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>소식/IT</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/28</guid>
      <comments>https://3colored.tistory.com/28#entry28comment</comments>
      <pubDate>Sat, 12 Dec 2020 23:58:11 +0900</pubDate>
    </item>
    <item>
      <title>은행 계좌 관리 프로그램 ver 1.1</title>
      <link>https://3colored.tistory.com/27</link>
      <description>&lt;pre id=&quot;code_1599128737933&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * @author  : Charlie Lee
 * @date    : 2020-09-03
 * @email   : find1086@gmail.com
 *
 * @info    : simple bank account manage program.
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

public class GenericBankingSystem {
    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static final Map&amp;lt;String, List&amp;lt;BankAccount&amp;gt;&amp;gt; accountsMap = new HashMap&amp;lt;&amp;gt;();
    private static final List&amp;lt;BankUser&amp;gt; userList = new ArrayList&amp;lt;&amp;gt;();

    private static Long accountId = 0L;
    private static final GenericBankingSystem bankSystem = GenericBankingSystem.getInstance();
    private GenericBankingSystem() {}
    public static GenericBankingSystem getInstance() {
        if(bankSystem == null) return new GenericBankingSystem();
        return bankSystem;
    }

    public static void main(String[] args) throws IOException {
        System.out.println(&quot;Welcome to Bank System.&quot;);
        bankSystem.run();
    }

    public void run() throws IOException {
        boolean flag = true;
        while(flag) {
            bankSystem.addAccount();
            System.out.print(&quot;successfully added. do you want to add more? (y/n) : &quot;);
            String addmore = br.readLine().toLowerCase();
            if(!addmore.equals(&quot;y&quot;)) flag = false;
        }
        bankSystem.manageAccount();
    }

    private void addAccount() throws IOException {
        boolean flag = true;
        String accountNumber = &quot;&quot;;
        while(flag) {
            System.out.println(&quot;type account number please.&quot;);
            accountNumber = validateFormat(br.readLine());
            if(accountNumber != null) flag = checkDuplicatedAccountNumber(accountNumber);
            else System.out.println(&quot;it seems not valid account number format.&quot;);
        }
        System.out.print(&quot;type username for adding this account : &quot;);
        String username = br.readLine();
        BankUser user;
        if(!accountsMap.containsKey(username)) {
            user = new BankUser(username);
        } else {
            user = userList.stream()
                           .filter(name -&amp;gt; (name.getUsername()).equals(username))
                           .findFirst()
                           .orElse(null);
        }
        if(user != null) {
            user.addAccount(new BankAccount(++accountId, accountNumber));
            userList.add(user);
            accountsMap.put(username, user.getAccountList());
        } else {
            throw new Error(&quot;Unexpected Error! contact to the Administrator.&quot;);
        }
    }

    private String validateFormat(String text) {
        String koreanFormat = &quot;^[0-9]{3,6}+[-]?[0-9]{2,6}+[-]?[0-9]{1,7}+([-]?[0-9]{1,7})?$&quot;;
        if(text.matches(koreanFormat)) return text;
        return null;
    }

    private boolean checkDuplicatedAccountNumber(String accountNumber) {
        boolean exist = bankSystem.findDuplicatedAccountNumer(accountNumber);
        if(exist) System.out.println(&quot;this number is already exist. try other please.&quot;);
        return exist;
    }

    private boolean findDuplicatedAccountNumer(String number) {
        if(userList.size() &amp;lt;= 0) return false;
        return userList.stream().anyMatch(user -&amp;gt; accountsMap.get(user.getUsername())
                                                                      .stream()
                                                                      .anyMatch(v -&amp;gt; (v.getAccountNumber()).equals(number)));
    }

    private void manageAccount() throws IOException {
        boolean flag = true;
        while (flag) {
            String name = chooseUserAccount();
            List&amp;lt;BankAccount&amp;gt; accountsOfanUser = accountsMap.get(name);
            bankSystem.printUserAccount(accountsOfanUser);
            // specify which account state change.
            BankAccount account = bankSystem.chooseOneAccount(accountsOfanUser);
            bankSystem.controlAccount(account);
            flag = bankSystem.continueToManage();
        }
    }

    private boolean continueToManage() throws IOException {
        System.out.println(&quot;would you like to return to select user? (y/n)&quot;);
        String value = br.readLine().toLowerCase();
        if (value.equals(&quot;n&quot;)) {
            System.out.println(&quot;would you like to go back selecting account menu ? (y/n) : &quot;);
            value = br.readLine().toLowerCase();
            if(value.equals(&quot;n&quot;)) {
                System.out.println(&quot;would you like to go back first step? (y/n) : n will shut down program) : &quot;);
                value = br.readLine().toLowerCase();
                if(value.equals(&quot;n&quot;)) {
                    System.out.println(&quot;okay. program will be shut down.&quot;);
                    br.close();
                } else {
                    System.out.println(&quot;Welcome back to account registration.&quot;);
                    bankSystem.run();
                }
            } else {
                bankSystem.manageAccount();
            }
            return false;
        }
        return true;
    }

    private BankAccount chooseOneAccount(List&amp;lt;BankAccount&amp;gt; accountsOfanUser) throws IOException {
        System.out.println(&quot;which account's balance do you want to change?&quot;);
        System.out.print(&quot;please choose number in [], not account number : &quot;);
        int accountId = parseToInt(br.readLine()) - 1;
        return accountsOfanUser.get(accountId);
    }

    private void printUserAccount(List&amp;lt;BankAccount&amp;gt; accountsOfanUser) {
        System.out.println(&quot;The user has those accounts: &quot;);
        for (int i = 1; i &amp;lt;= accountsOfanUser.size(); i++) {
            System.out.println(&quot;[&quot; + i + &quot;] &quot; + accountsOfanUser.get(i - 1));
        }
    }

    private String chooseUserAccount() throws IOException {
        String name;
        do {
            System.out.println(&quot;::: user account list :::&quot;);
            Set&amp;lt;String&amp;gt; key = accountsMap.keySet();
            for (String o : key) {
                System.out.print(o + &quot; &quot;);
            }
            System.out.println(&quot;\nwhich users account do you want manage? : &quot;);
            name = br.readLine();
        } while (!bankSystem.validateRegisteredUser(name));
        return name;
    }

    private boolean validateRegisteredUser(String name) {
        if (!accountsMap.containsKey(name)) {
            System.out.println(&quot;this user seems not registered yet.&quot;);
            return false;
        }
        return true;
    }

    private void controlAccount(BankAccount account) throws IOException {
        boolean changeMoneyProcess = true;
        int chooseNum;
        while (changeMoneyProcess) {
            System.out.println(&quot;what would you want to do? choose number please.&quot;);
            System.out.println(&quot;[1] deposit [2] withdraw [3] show money balance&quot;);
            chooseNum = parseToInt(br.readLine());
            switch (chooseNum) {
                case 1: {
                    System.out.println(&quot;how much money do you want to deposit ?&quot;);
                    account.depositMoney(parseToDouble(br.readLine()));
                    break;
                }
                case 2: {
                    System.out.println(&quot;how much money do you want to withdraw ?&quot;);
                    account.withdrawMoney(parseToDouble(br.readLine()));
                    break;
                }
                case 3:
                    break;
                default:
                    System.out.println(&quot;not service this number yet.&quot;);
            }
            System.out.printf(&quot;money balance : %5.2f\n&quot;, account.getMoney());
            changeMoneyProcess = wantToContinueChangeMoney();
        }
    }

    private boolean wantToContinueChangeMoney() throws IOException {
        System.out.println(&quot;would you want to continue changing money balance ? (y/n)&quot;);
        return !(br.readLine()).equals(&quot;n&quot;);
    }

    private static Integer parseToInt(String text) throws IOException {
        boolean isAbleToParseInt = false;
        int parsedInt = 0;
        while (!isAbleToParseInt) {
            try {
                parsedInt = Integer.parseInt(text);
                isAbleToParseInt = true;
            } catch (NumberFormatException nfe) {
                System.out.println(&quot;it seems not number! please check again.&quot;);
                text = br.readLine();
            }
        }
        return parsedInt;
    }

    private static Double parseToDouble(String text) throws IOException {
        boolean isAbleToParseDouble = false;
        double parsedDouble = 0;
        while (!isAbleToParseDouble) {
            try {
                parsedDouble = Double.parseDouble(text);
                isAbleToParseDouble = true;
            } catch (NumberFormatException nfe) {
                System.out.println(&quot;it seems not number! please check again.&quot;);
                text = br.readLine();
            }
        }
        return parsedDouble;
    }
}

class BankUser {
    private final String username;
    private final List&amp;lt;BankAccount&amp;gt; accountList = new ArrayList&amp;lt;&amp;gt;();

    public BankUser(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void addAccount(BankAccount account) {
        accountList.add(account);
    }

    public List&amp;lt;BankAccount&amp;gt; getAccountList() {
        return accountList;
    }

    @Override
    public String toString() {
        return &quot;BankUser{&quot; +
                &quot;username='&quot; + username + '\'' +
                &quot;, accountList=&quot; + accountList +
                '}';
    }
}

class BankAccount {
    private final long accountId;
    private final String accountNumber;
    private final LocalDateTime regDate;
    private double money;
    public BankAccount(long accountId, String accountNumber) {
        this.accountId = accountId;
        this.accountNumber = accountNumber;
        this.regDate = LocalDateTime.now();
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof BankAccount)) return false;
        BankAccount that = (BankAccount) o;
        return accountId == that.accountId &amp;amp;&amp;amp;
                Double.compare(that.money, money) == 0 &amp;amp;&amp;amp;
                Objects.equals(accountNumber, that.accountNumber);
    }

    @Override
    public int hashCode() {
        return Objects.hash(accountId, accountNumber, money);
    }

    @Override
    public String toString() {
        return  &quot;accountNumber: &quot; + accountNumber +
                &quot;\n\tmoney: &quot; + money +
                &quot;\n\tregDate: &quot; + regDate.format(DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd HH:mm:ss&quot;)) + &quot;\n&quot;;
    }

    public double getMoney() {
        return money;
    }

    public void depositMoney(double money) {
        this.money += money;
    }

    public void withdrawMoney(double money) {
        double temp = this.money -= money;
        if (temp &amp;lt; 0) {
            throw new Error(&quot;you can't withdraw that money.&quot;);
        }
        this.money = temp;
    }
}

// http://colorscripter.com/s/rcw1z3L
// http://colorscripter.com/s/rcw1z3L
// http://colorscripter.com/s/rcw1z3L&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Java/Java</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/27</guid>
      <comments>https://3colored.tistory.com/27#entry27comment</comments>
      <pubDate>Thu, 3 Sep 2020 19:25:43 +0900</pubDate>
    </item>
    <item>
      <title>간단한 은행 계좌 관리 프로그램</title>
      <link>https://3colored.tistory.com/26</link>
      <description>&lt;pre id=&quot;code_1598758048092&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * @author : Charlie Lee
 * @date   : 2020-08-31
 * @email  : find1086@gmail.com
 * @conf   : openJDK 11.0.2
 *
 * @comment: simple national bank account management program.
 *           UUID.randomUUID() logically equals account number in this program.
 * @to-do  : save data to RDB or some place.
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

enum BankList {
    AMERICA, INDIA, SINGAPORE, CHINA, KOREA
}

public class BankService {
    private final static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private final static Map&amp;lt;String, List&amp;lt;Account&amp;gt;&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
    private final static List&amp;lt;User&amp;gt; users = new ArrayList&amp;lt;&amp;gt;();
    private static final BankService bankService = getInstance();
    private BankService() {}
    public static BankService getInstance() {
        if(bankService == null) return new BankService();
        return bankService;
    }

    private static Long accountId = 0L;

    public static void main(String[] args) throws IOException {
        runBankService();
    }

    public static void runBankService() throws IOException {
        createUsers();
        createAccounts();
        printInformation();
        manageAccount();
    }

    private static void createUsers() throws IOException {
        System.out.print(&quot;how many user you want to create? : &quot;);
        int n = parseToInt(br.readLine());
        for (int i = 0; i &amp;lt; n; i++) {
            createUser();
        }
    }

    private static void createAccounts() throws IOException {
        System.out.print(&quot;how many account you want to create? : &quot;);
        int m = parseToInt(br.readLine());
        for (User user : users) {
            for (int j = 0; j &amp;lt; m; j++) {
                createAccount(user);
            }
            System.out.println(&quot;complete creating account.&quot;);
        }
    }

    private static void createUser() throws IOException {
        System.out.print(&quot;type username to create: &quot;);
        String username = br.readLine();
        users.add(new User(username));
    }

    private static void createAccount(User user) throws IOException {
        System.out.println(&quot;Which bank account would you like to create?&quot;);
        printBanksList();
        chooseBankName(user);
    }

    private static void printBanksList() {
        System.out.print(&quot;[ &quot;);
        String banks = Arrays.stream(BankList.values())
                             .map(String::valueOf)
                             .collect(Collectors.joining(&quot;, &quot;));
        System.out.print(banks);
        System.out.println(&quot; ]&quot;);
    }

    private static void chooseBankName(User user) throws IOException {
        System.out.print(&quot;choose bankname you want to create: &quot;);
        String src = (br.readLine()).toUpperCase();
        boolean isValidBankName = checkValidBankName(src);
        if (isValidBankName) {
            Account account = new Account(++accountId, src, String.valueOf(UUID.randomUUID()));
            checkDuplicateAccount(user, account);
            user.addAccount(account);
            map.put(user.getUsername(), user.getAccountList());
        } else {
            throw new Error(&quot;sorry. could not find bank in the list. please try later.&quot;);
        }
    }

    private static boolean checkValidBankName(String src) {
        for (BankList bank : BankList.values()) {
            if (src.equals(bank.toString())) return true;
        }
        return false;
    }

    private static void checkDuplicateAccount(User user, Account account) {
        if (map.isEmpty()) return;
        if (map.get(user.getUsername()) == null || map.get(user.getUsername()).size() &amp;lt;= 0) return;
        boolean check = findDuplicatedAccount(user, account);
        if (check) throw new Error(&quot;this account already exists. please check right account registration.&quot;);
    }

    private static boolean findDuplicatedAccount(User user, Account account) {
       return map.get(user.getUsername())
                 .stream()
                 .anyMatch(acc -&amp;gt; acc.equals(account));
    }

    private static void printInformation() {
        Set&amp;lt;String&amp;gt; key = map.keySet();
        for (User u : users) {
            for (Iterator&amp;lt;String&amp;gt; iterator = key.iterator(); iterator.hasNext(); ) {
                System.out.println(&quot;username: &quot; + iterator.next() + &quot;, account: &quot; + map.get(u.getUsername()));
            }
        }
    }

    private static boolean validateRegisteredUser(String name) {
        if (!map.containsKey(name)) {
            System.out.println(&quot;this user seems not registered yet. check your query right please.&quot;);
            return false;
        }
        return true;
    }

    private static void manageAccount() throws IOException {
        boolean flag = true;
        while (flag) {
            String name = chooseUserAccount();
            List&amp;lt;Account&amp;gt; accountsOfanUser = map.get(name);
            printUserAccount(accountsOfanUser);
            // 4-1. specify which account state change.
            Account account = chooseOneAccount(accountsOfanUser);
            controlAccount(account);
            flag = continueToManage();
        }
    }

    private static boolean continueToManage() throws IOException {
        System.out.println(&quot;would you like to continue to manage account? (y/n)&quot;);
        String value = br.readLine();
        if (value.equals(&quot;n&quot;)) {
            System.out.println(&quot;okay. program will be shut down.&quot;);
            return false;
        }
        return true;
    }

    private static Account chooseOneAccount(List&amp;lt;Account&amp;gt; accountsOfanUser) throws IOException {
        System.out.println(&quot;which account's balance do you want to change?&quot;);
        System.out.print(&quot;please choose number in [], not account id : &quot;);
        int accountId = parseToInt(br.readLine()) - 1;
        return accountsOfanUser.get(accountId);
    }

    private static void printUserAccount(List&amp;lt;Account&amp;gt; accountsOfanUser) {
        System.out.println(&quot;The user has : &quot;);
        for (int i = 1; i &amp;lt;= accountsOfanUser.size(); i++) {
            System.out.println(&quot;[&quot; + i + &quot;] &quot; + accountsOfanUser.get(i - 1));
        }
    }

    private static String chooseUserAccount() throws IOException {
        String name;
        do {
            System.out.println(&quot;::: user account list :::&quot;);
            Set&amp;lt;String&amp;gt; key = map.keySet();
            for (String o : key) {
                System.out.print(o + &quot; &quot;);
            }
            System.out.println(&quot;\nwhich users account do you want manage? : &quot;);
            name = br.readLine();
        } while (!validateRegisteredUser(name));
        return name;
    }

    private static void controlAccount(Account account) throws IOException {
        boolean changeMoneyProcess = true;
        int chooseNum;
        while (changeMoneyProcess) {
            System.out.println(&quot;what would you want to do? choose number please.&quot;);
            System.out.println(&quot;[1] deposit [2] withdraw [3] show money balance&quot;);
            chooseNum = parseToInt(br.readLine());
            switch (chooseNum) {
                case 1: {
                    System.out.println(&quot;how much money do you want to deposit ?&quot;);
                    account.depositMoney(parseToDouble(br.readLine()));
                    break;
                }
                case 2: {
                    System.out.println(&quot;how much money do you want to withdraw ?&quot;);
                    account.withdrawMoney(parseToDouble(br.readLine()));
                    break;
                }
                case 3:
                    break;
                default:
                    System.out.println(&quot;not service this number yet.&quot;);
            }
            System.out.printf(&quot;money balance : %5.2f\n&quot;, account.getMoney());
            changeMoneyProcess = wantToContinueChangeMoney();
        }
    }

    private static Integer parseToInt(String text) throws IOException {
        boolean isAbleToParseInt = false;
        int parsedInt = 0;
        while (!isAbleToParseInt) {
            try {
                parsedInt = Integer.parseInt(text);
                isAbleToParseInt = true;
            } catch (NumberFormatException nfe) {
                System.out.println(&quot;it seems not number! please check again.&quot;);
                System.out.print(&quot;how many user you want to create? : &quot;);
                text = br.readLine();
            }
        }
        return parsedInt;
    }

    private static Double parseToDouble(String text) throws IOException {
        boolean isAbleToParseDouble = false;
        double parsedDouble = 0;
        while (!isAbleToParseDouble) {
            try {
                parsedDouble = Double.parseDouble(text);
                isAbleToParseDouble = true;
            } catch (NumberFormatException nfe) {
                System.out.println(&quot;it seems not number! please check again.&quot;);
                System.out.print(&quot;how many user you want to create? : &quot;);
                text = br.readLine();
            }
        }
        return parsedDouble;
    }

    private static boolean wantToContinueChangeMoney() throws IOException {
        System.out.println(&quot;would you want to continue changing money balance ? (y/n)&quot;);
        return !(br.readLine()).equals(&quot;n&quot;);
    }
}

class User {
    private final String username;
    private final List&amp;lt;Account&amp;gt; accountList;

    public User(String username) {
        this.username = username;
        accountList = new ArrayList&amp;lt;&amp;gt;();
    }

    public String getUsername() {
        return username;
    }

    public void addAccount(Account account) {
        accountList.add(account);
    }

    public List&amp;lt;Account&amp;gt; getAccountList() {
        return accountList;
    }

    @Override
    public String toString() {
        return &quot;User{&quot; +
                &quot;username='&quot; + username + '\'' +
                &quot;, accountList=&quot; + accountList +
                '}';
    }
}

class Account {
    private final Long id;
    private final String bankName;
    private final String accountNumber;
    private double money;

    public Account(Long id, String bankName, String accountNumber) {
        this.id = id;
        this.bankName = bankName;
        this.accountNumber = accountNumber;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Account)) return false;
        Account account = (Account) o;
        return Objects.equals(id, account.id) &amp;amp;&amp;amp;
                Objects.equals(bankName, account.bankName) &amp;amp;&amp;amp;
                Objects.equals(accountNumber, account.accountNumber);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, bankName, accountNumber);
    }

    @Override
    public String toString() {
        return &quot;Account{&quot; +
                &quot;id=&quot; + id +
                &quot;, bankName='&quot; + bankName + '\'' +
                &quot;, accountNumber='&quot; + accountNumber + '\'' +
                '}';
    }

    public double getMoney() {
        return money;
    }

    public void depositMoney(double money) {
        this.money += money;
    }

    public void withdrawMoney(double money) {
        if ((this.money -= money) &amp;lt; 0) {
            throw new Error(&quot;you can't withdraw that money.&quot;);
        }
        this.money -= money;
    }
}

//  http://colorscripter.com/s/YX09IfQ&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Java/Java</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/26</guid>
      <comments>https://3colored.tistory.com/26#entry26comment</comments>
      <pubDate>Sun, 30 Aug 2020 12:05:19 +0900</pubDate>
    </item>
    <item>
      <title>Java enum 활용법</title>
      <link>https://3colored.tistory.com/25</link>
      <description>&lt;pre id=&quot;code_1595969941577&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;설명하기에 앞서..

이 포스팅은 본래 enum의 주 사용목적인

열거형 제한을 걸어 개발자의 실수를 막는다거나
인스턴스 생성 및 상속을 방지하여
상수값의 타입안정성 보장 등을
하기 위한 목적으로 작성된 것이 아님을 알려드립니다.

JAVA enum을 사용하여 코드가 단순해짐에 따라
가독성이 상승하는 효과만을 위해 쓰여졌습니다

따라서 이 글에서 언급될 코드들은
enum 사용없이 구현해도 상관없습니다. 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자바의 enum은 다른 언어와 다르게 클래스 취급을 받기 때문에 생성자 선언을 통해 다양한 일을 할 수 있습니다.&lt;br /&gt;이를테면 아래의 코드처럼 enum의 각 요소들의 생성자에 특정한 수학 공식을 미리 기입해둠으로 메서드처럼* 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(실사용 코드는 글 맨 아래에 있습니다.)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1595962360810&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//JAVA 8
public enum Calculator {

    POWER(n -&amp;gt; n * n), // n제곱
    GAUSE(n -&amp;gt; (1 + n) * (n / 2)), // 1부터 n까지 합산한 결과
    PYTHAGORAS((n, m) -&amp;gt; Math.sqrt(POWER.calculate(n) + POWER.calculate(m)));

    private Function&amp;lt;Long, Long&amp;gt; expression;
    private BiFunction&amp;lt;Long, Long, Double&amp;gt; pyhagoras;
    private Calculator(Function&amp;lt;Long, Long&amp;gt; expression) {
        this.expression = expression;
    }
    private Calculator(BiFunction&amp;lt;Long, Long, Double&amp;gt; pyhagoras) {
        this.pyhagoras = pyhagoras;
    }
    public long calculate(long value) {
        return expression.apply(value);
    }
    public double calculate(long a, long b) {
        return pyhagoras.apply(a, b);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;JAVA 8 미만의 버전에서는 람다 기능을 지원하지 않기 때문에&lt;/p&gt;
&lt;p&gt;생성자(ABC(n, m) 등)내에서 유동적인 값의 계산이 불가능합니다.&lt;br /&gt;예를 들어 POWER(3, 4) 는 요소로 선언가능하지만, POWER(n, m)는 요소로 올 수 없습니다.&lt;br /&gt;아래의 코드를 참고하세요.&lt;/p&gt;
&lt;pre id=&quot;code_1595967804221&quot; class=&quot;java&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum EnumPossible {
    ABC(3, 4);  // 선언 가능.
    EnumPossible(int n, int m) {} 
}

enum EnumImpossible {
    ABC(n, m); // 선언 불가능
    EnumImpossible(int n, int m) {}
} 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;따라서 JAVA 8 방식에서 사용된 방식과 동일하게 사용하려면 아래와 같이 작성할 수 있습니다.&lt;/p&gt;
&lt;p&gt;그러나 코드에서도 알 수 있듯 각 enum 요소에서 구현되는 추상 메소드들에 대한 오버로딩이 사용될 경우&lt;/p&gt;
&lt;p&gt;불필요한 메소드조차 강제로 구현해야하는 단점이 존재합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1595966856463&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//JAVA 7
enum Calculator7 {
    POWER7 {
        long calculate(long n) { return n * n; }
        double calculate(long value, long value2) { return 0; } // 불필요한 코드 구현을 강제당함
    },
    GAUSE7 {
        long calculate(long n) { return (1 + n) * (n / 2); }
        double calculate(long value, long value2) { return 0; } // // 불필요한 코드 구현을 강제당함
    },
    PYTHAGORAS7 {
        long calculate(long value) { return 0; } // 불필요한 코드 구현을 강제당함
        double calculate(long n, long m) {
            return Math.sqrt(POWER7.calculate(n) + POWER7.calculate(m));
        }
    };
    abstract long calculate(long value);
    abstract double calculate(long n, long m);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;개발자의 실수를 유발할 수 있는 &lt;span style=&quot;color: #333333;&quot;&gt;이런&lt;/span&gt; 치명적인 단점 때문에 enum에서의 추상메소드 사용기법이 추천되지 않았으나&lt;br /&gt;JAVA 8부터 함수형 프로그래밍이 가능해짐에 따라 역량에 따라 활용도를 높일 수 있을 것입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;JAVA8, JAVA7 enum 사용 코드&lt;/p&gt;
&lt;pre id=&quot;code_1595966875932&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class RunCalculator {
    public static void main(String[] args) {
        System.out.println(&quot;------------JAVA 8-------------&quot;);
        Calculator gause = Calculator.GAUSE;
        System.out.println(gause.calculate(100));

        Calculator pyhagoras = Calculator.PYTHAGORAS;
        System.out.println(pyhagoras.calculate(3, 4));

        System.out.println(&quot;------------JAVA 7-------------&quot;);

        Calculator7 gause7 = Calculator7.GAUSE7;
        System.out.println(gause7.calculate(100));
        Calculator7 pytagoras7 = Calculator7.PYTHAGORAS7;
        System.out.println(pytagoras7.calculate(3, 4));

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;JAVA8 방식이든 JAVA7 방식이든 의도에 맞게 사용한다면&lt;br /&gt;결과값은 아래와 같이 서로 동일하게 출력됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bccRI7/btqF4ziihO1/Qx4ZIlplGkq8fi1hIPwQ80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bccRI7/btqF4ziihO1/Qx4ZIlplGkq8fi1hIPwQ80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bccRI7/btqF4ziihO1/Qx4ZIlplGkq8fi1hIPwQ80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbccRI7%2FbtqF4ziihO1%2FQx4ZIlplGkq8fi1hIPwQ80%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[전체코드]&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;java.util.function.&lt;/span&gt;&lt;span&gt;BiFunction&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;java.util.function.&lt;/span&gt;&lt;span&gt;Function&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;//JAVA 8&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public &lt;/span&gt;&lt;span&gt;enum &lt;/span&gt;&lt;span&gt;Calculator &lt;/span&gt;&lt;span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POWER&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;-&amp;gt; &lt;span&gt;n &lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;// n&lt;/span&gt;&lt;span&gt;제곱&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GAUSE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;-&amp;gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;1 &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) * (&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span&gt;/ &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)), &lt;/span&gt;&lt;span&gt;// 1&lt;/span&gt;&lt;span&gt;부터&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span&gt;까지 합산한 결과&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PYTHAGORAS&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;-&amp;gt; &lt;span&gt;Math&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sqrt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;POWER&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) + &lt;/span&gt;&lt;span&gt;POWER&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;)));&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;private &lt;/span&gt;&lt;span&gt;Function&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;expression&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;private &lt;/span&gt;&lt;span&gt;BiFunction&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Double&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;pyhagoras&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;private &lt;/span&gt;&lt;span&gt;Calculator&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Function&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;expression&lt;/span&gt;&lt;span&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;expression &lt;span&gt;= &lt;/span&gt;&lt;span&gt;expression&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;private &lt;/span&gt;&lt;span&gt;Calculator&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BiFunction&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Double&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;pyhagoras&lt;/span&gt;&lt;span&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;pyhagoras &lt;span&gt;= &lt;/span&gt;&lt;span&gt;pyhagoras&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;public &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;return &lt;/span&gt;expression&lt;span&gt;.&lt;/span&gt;&lt;span&gt;apply&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span&gt; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;public &lt;/span&gt;&lt;span&gt;double &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;return &lt;/span&gt;pyhagoras&lt;span&gt;.&lt;/span&gt;&lt;span&gt;apply&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span&gt; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;//JAVA 7&lt;br /&gt;&lt;/span&gt;&lt;span&gt;enum &lt;/span&gt;&lt;span&gt;Calculator7 &lt;/span&gt;&lt;span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POWER7 &lt;/span&gt;&lt;span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span&gt;return &lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;double &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;value2&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span&gt;return &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; } &lt;/span&gt;&lt;span&gt;// &lt;/span&gt;&lt;span&gt;불필요한 코드 구현을 강제당함&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GAUSE7 &lt;/span&gt;&lt;span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span&gt;return &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1 &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) * (&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span&gt;/ &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;); }&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;double &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;value2&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span&gt;return &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; } &lt;/span&gt;&lt;span&gt;// // &lt;/span&gt;&lt;span&gt;불필요한 코드 구현을 강제당함&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PYTHAGORAS7 &lt;/span&gt;&lt;span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;) { &lt;/span&gt;&lt;span&gt;return &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; } &lt;/span&gt;&lt;span&gt;// &lt;/span&gt;&lt;span&gt;불필요한 코드 구현을 강제당함&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;double &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;return &lt;/span&gt;&lt;span&gt;Math&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sqrt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;POWER7&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) + &lt;/span&gt;&lt;span&gt;POWER7&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span&gt; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt; };&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;abstract long &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;abstract double &lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;long &lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;class &lt;/span&gt;&lt;span&gt;RunCalculator &lt;/span&gt;&lt;span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;public &lt;/span&gt;&lt;span&gt;static void &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;------------JAVA 8-------------&quot;&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Calculator &lt;/span&gt;gause &lt;span&gt;= &lt;/span&gt;&lt;span&gt;Calculator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GAUSE&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;gause&lt;span&gt;.&lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Calculator &lt;/span&gt;pyhagoras &lt;span&gt;= &lt;/span&gt;&lt;span&gt;Calculator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PYTHAGORAS&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;pyhagoras&lt;span&gt;.&lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;------------JAVA 7-------------&quot;&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Calculator7 &lt;/span&gt;gause7 &lt;span&gt;= &lt;/span&gt;&lt;span&gt;Calculator7&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GAUSE7&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;gause7&lt;span&gt;.&lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Calculator7 &lt;/span&gt;pytagoras7 &lt;span&gt;= &lt;/span&gt;&lt;span&gt;Calculator7&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PYTHAGORAS7&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;pytagoras7&lt;span&gt;.&lt;/span&gt;&lt;span&gt;calculate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/Java</category>
      <category>enum</category>
      <category>java7 enum</category>
      <category>java8 enum</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/25</guid>
      <comments>https://3colored.tistory.com/25#entry25comment</comments>
      <pubDate>Wed, 29 Jul 2020 05:36:25 +0900</pubDate>
    </item>
    <item>
      <title>SQLD 1일차 연습 문제(데이터 모델의 이해, 엔터티)</title>
      <link>https://3colored.tistory.com/24</link>
      <description>&lt;p style=&quot;text-align: left;&quot;&gt;DBGuide의 SQL 개발자 학습내용을 공부하며 &lt;span style=&quot;color: #333333;&quot;&gt;개인적으로&lt;/span&gt; 정리한 문제들입니다.&lt;br /&gt;&lt;br /&gt;출처: &lt;a href=&quot;http://www.dbguide.net/db.db?cmd=view&amp;amp;boardUid=148179&amp;amp;boardConfigUid=9&amp;amp;categoryUid=216&amp;amp;boardIdx=132&amp;amp;boardStep=1&quot;&gt;http://www.dbguide.net/db.dbcmd=view&amp;amp;boardUid=148179&amp;amp;boardConfigUid=9&amp;amp;categoryUid=216&amp;amp;boardIdx=132&amp;amp;boardStep=1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595960774497&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;데이터 전문가 지식포털 DBGuide.net&quot; data-og-description=&quot;엔터티 속성 관계 식별자 데이터 모델의 이해 1. 엔터티의 개념 데이터 모델을 이해할 때 가장 명확하게 이해해야 하는 개념 중에 하나가 바로 엔터티(Entity)이다. 이것은 우리말로 실체, 객체라��&quot; data-og-host=&quot;www.dbguide.net&quot; data-og-source-url=&quot;http://www.dbguide.net/db.db?cmd=view&amp;amp;boardUid=148179&amp;amp;boardConfigUid=9&amp;amp;categoryUid=216&amp;amp;boardIdx=132&amp;amp;boardStep=1&quot; data-og-url=&quot;http://www.dbguide.net/db.db?cmd=view&amp;amp;boardUid=148179&amp;amp;boardConfigUid=9&amp;amp;categoryUid=216&amp;amp;boardIdx=132&amp;amp;boardStep=1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qqIK9/hyGWirakka/ZzKbNVxHdLQx9KyKVnUDkk/img.jpg?width=535&amp;amp;height=354&amp;amp;face=0_0_535_354,https://scrap.kakaocdn.net/dn/hRYuS/hyGWdQVYpa/yZcXdthxx4EWnqHMzR2VhK/img.jpg?width=561&amp;amp;height=266&amp;amp;face=0_0_561_266,https://scrap.kakaocdn.net/dn/hCMLB/hyGWhFM1dq/AOKVfFWKwchCxoQFufE8x0/img.jpg?width=512&amp;amp;height=271&amp;amp;face=0_0_512_271&quot;&gt;&lt;a href=&quot;http://www.dbguide.net/db.db?cmd=view&amp;amp;boardUid=148179&amp;amp;boardConfigUid=9&amp;amp;categoryUid=216&amp;amp;boardIdx=132&amp;amp;boardStep=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.dbguide.net/db.db?cmd=view&amp;amp;boardUid=148179&amp;amp;boardConfigUid=9&amp;amp;categoryUid=216&amp;amp;boardIdx=132&amp;amp;boardStep=1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qqIK9/hyGWirakka/ZzKbNVxHdLQx9KyKVnUDkk/img.jpg?width=535&amp;amp;height=354&amp;amp;face=0_0_535_354,https://scrap.kakaocdn.net/dn/hRYuS/hyGWdQVYpa/yZcXdthxx4EWnqHMzR2VhK/img.jpg?width=561&amp;amp;height=266&amp;amp;face=0_0_561_266,https://scrap.kakaocdn.net/dn/hCMLB/hyGWhFM1dq/AOKVfFWKwchCxoQFufE8x0/img.jpg?width=512&amp;amp;height=271&amp;amp;face=0_0_512_271');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;데이터 전문가 지식포털 DBGuide.net&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;엔터티 속성 관계 식별자 데이터 모델의 이해 1. 엔터티의 개념 데이터 모델을 이해할 때 가장 명확하게 이해해야 하는 개념 중에 하나가 바로 엔터티(Entity)이다. 이것은 우리말로 실체, 객체라��&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.dbguide.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;장 데이터 모델의 이해&lt;span&gt;, &lt;/span&gt;엔터티&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. 데이터 모델링에 대해 잘못 설명한 것을 고르세요.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;① &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;정보시스템을 구축하기 위한 데이터 관점의 업무 분석 기법&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;② &lt;/span&gt;현실 세계의 데이터에 대해 약속된 표기법에 의해 표현하는 과정&lt;span&gt;&lt;br /&gt;③ &lt;/span&gt;데이터베이스를 구축하기 위한 분석&lt;span&gt;/&lt;/span&gt;설계의 과정&lt;span&gt;&lt;br /&gt;④ &lt;/span&gt;단순한 현실 세계를 복잡화된 설계도로 표현하는 과정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. 데이터 모델링의 올바른 순서를 고르세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;① &lt;/span&gt;개념적&lt;span&gt; - &lt;/span&gt;논리적 &lt;span&gt;&amp;ndash; &lt;/span&gt;물리적&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;② &lt;/span&gt;개념적&lt;span&gt; - &lt;/span&gt;물리적&lt;span&gt; - &lt;/span&gt;논리적&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;③ &lt;/span&gt;논리적&lt;span&gt; - &lt;/span&gt;개념적 &lt;span&gt;&amp;ndash; &lt;/span&gt;물리적&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;④ &lt;/span&gt;물리적&lt;span&gt; - &lt;/span&gt;개념적 &lt;span&gt;&amp;ndash; &lt;/span&gt;논리적&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;⑤ &lt;/span&gt;논리적&lt;span&gt; - &lt;/span&gt;물리적&lt;span&gt; - &lt;/span&gt;개념적&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3. 엔터티에 대해 잘못 설명한 것을 고르세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;① &lt;/span&gt;&lt;span&gt;사람&lt;span&gt;, &lt;/span&gt;장소&lt;span&gt;, &lt;/span&gt;물건&lt;span&gt;, &lt;/span&gt;사건&lt;span&gt;, &lt;/span&gt;개념 등의 명사에 해당된다&lt;span&gt;.&lt;br /&gt;② &lt;/span&gt;정보를 저장할 수 있는 어떤 것&lt;span&gt;&lt;br /&gt;③ &lt;/span&gt;업무상 관리가 필요한 관심사들을 일컫는다&lt;span&gt;.&lt;br /&gt;④ &lt;/span&gt;인스턴스&lt;span&gt;, &lt;/span&gt;혹은 객체라고도 한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;4.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;엔터티의 특징 중 잘못된 것을 고르세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;① &lt;/span&gt;&lt;span&gt;반드시 해당 업무에서 필요하고 관리하고자 하는 정보여야 합니다&lt;span&gt;.&lt;br /&gt;② &lt;/span&gt;반드시 속성&lt;span&gt;(attribute)&lt;/span&gt;이 있어야 합니다&lt;span&gt;.&lt;br /&gt;③ &lt;/span&gt;다른 엔터티와 최소 한 개 이상의 관계가 있어야 합니다&lt;span&gt;.&lt;br /&gt;④ &lt;/span&gt;유일한 식별자에 의해 식별이 가능해야 합니다&lt;span&gt;.&lt;br /&gt;⑤ &lt;/span&gt;반드시 인스턴스의 집합일 필요는 없습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;5.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;스키마에 대한 내용 중 잘못된 것을 두 개 고르세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;① &lt;/span&gt;&lt;span&gt;외부 스키마는 모든 사용자 관점을 통합한 전체적인 하나의 관점으로 구성되어 있다&lt;span&gt;.&lt;br /&gt;② &lt;/span&gt;개념 스키마는&lt;span&gt; View &lt;/span&gt;단계 여러 개의 사용자 관점으로 구성되며&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 개개 사용자 단계로서 &lt;/span&gt;&lt;span&gt;개개 사용자나 응용프로그래머가 접근하는&lt;span&gt; DB &lt;/span&gt;정의이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;③ &lt;/span&gt;&lt;span&gt;내부스키마는&lt;span&gt; DB&lt;/span&gt;가 물리적으로 저장된 형식을 말한다&lt;span&gt;.&lt;br /&gt;④ &lt;/span&gt;외부스키마는 사용자 관점이며&lt;span&gt;, &lt;/span&gt;접근하는 특성에 따른 스키마로 구성되어 있다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[정답표]&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;1번: 정답 4&lt;br /&gt;2번: 정답 1&lt;br /&gt;3번: 정답 4&lt;br /&gt;4번: 정답 5&lt;br /&gt;5번: 정답 1, 2&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/SQLD</category>
      <category>SQLD</category>
      <category>SQLD 연습문제</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/24</guid>
      <comments>https://3colored.tistory.com/24#entry24comment</comments>
      <pubDate>Wed, 29 Jul 2020 03:42:08 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 mysql 7day-SQL 있었는데요 없었습니다</title>
      <link>https://3colored.tistory.com/21</link>
      <description>&lt;pre id=&quot;code_1567786608212&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT a.ANIMAL_ID, a.NAME
FROM ANIMAL_INS a JOIN ANIMAL_OUTS b
ON a.ANIMAL_ID = b.ANIMAL_ID
WHERE a.DATETIME &amp;gt; ANY (SELECT b.DATETIME
                        FROM ANIMAL_OUTS
                       ) 
ORDER BY a.DATETIME&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/59043&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/59043&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1567786618922&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/59043&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/59043&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JvB4R/hyCKHO53CJ/G4gPeejkBkwy3JA5IKadsk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;코딩테스트 연습 - 있었는데요 없었습니다 | 프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다. NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALS&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/events/7day-sql&quot;&gt;https://programmers.co.kr/events/7day-sql&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1567786620803&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/events/7day-sql&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://programmers.co.kr/events/7day-sql&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBhVa7/hyCITi3O0P/cFWaNXkmukAoopSIhwTD6K/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/bBUTkI/hyCIMYxQk0/3Rm73fK81qA7LmjCISioFK/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/bBs3GV/hyCKOAqVPt/pl5uzJUEbMvzj1uUpBlkW1/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;7daySQL 챌린지 | 프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;코딩테스트에 SQL문제 비중이 해마다 증가하는데, 어떻게 준비하면 좋을까요? 이제 프로그래머스에서 SQL 쿼리도 연습하세요!&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/SQL</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/21</guid>
      <comments>https://3colored.tistory.com/21#entry21comment</comments>
      <pubDate>Sat, 7 Sep 2019 01:17:02 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 mysql 7day-SQL 없어진 기록 찾기</title>
      <link>https://3colored.tistory.com/20</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1567786549156&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT b.ANIMAL_ID, b.NAME
FROM ANIMAL_INS a
RIGHT OUTER JOIN ANIMAL_OUTS AS b 
ON a.ANIMAL_ID = b.ANIMAL_ID
WHERE a.ANIMAL_ID IS NULL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/59042&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/59042&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1567786552473&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/59042&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/59042&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dq4KlD/hyCKQL2Nc9/XJ2mprqQjTR5KP54PV0jA0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;코딩테스트 연습 - 없어진 기록 찾기 | 프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다. NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALS&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/events/7day-sql&quot;&gt;https://programmers.co.kr/events/7day-sql&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1567786555610&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/events/7day-sql&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://programmers.co.kr/events/7day-sql&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBhVa7/hyCITi3O0P/cFWaNXkmukAoopSIhwTD6K/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/bBUTkI/hyCIMYxQk0/3Rm73fK81qA7LmjCISioFK/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256,https://scrap.kakaocdn.net/dn/bBs3GV/hyCKOAqVPt/pl5uzJUEbMvzj1uUpBlkW1/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;7daySQL 챌린지 | 프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;코딩테스트에 SQL문제 비중이 해마다 증가하는데, 어떻게 준비하면 좋을까요? 이제 프로그래머스에서 SQL 쿼리도 연습하세요!&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/SQL</category>
      <author>3COLORED</author>
      <guid isPermaLink="true">https://3colored.tistory.com/20</guid>
      <comments>https://3colored.tistory.com/20#entry20comment</comments>
      <pubDate>Sat, 7 Sep 2019 01:16:15 +0900</pubDate>
    </item>
  </channel>
</rss>