<div><br></div> <div>회사에서 공짜 음료수 자판기를 설치 하기로 했다.</div> <div>설치할 수 있는 자판기 종류는 무엇이 있을까?</div> <div>콜라전용 또는 사이다전용 그리고 둘 중 아무거나 나오는 음료수 자판기를 설치 할 수 있겠다.</div> <div><br></div> <div style="background:#f0f0f0;overflow:auto;width:auto;border-style:solid;border-color:#808080;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin:0px;line-height:125%;"><span style="color:#007020;font-weight:bold;">class</span> <span>음료 {}</span><br><span style="color:#007020;font-weight:bold;">class</span> <span>콜라 </span><span style="color:#0e84b5;font-weight:bold;">extends</span> <span>음료</span> <span style="color:#666666;">{}</span><br><span style="color:#007020;font-weight:bold;">class</span> <span>사이다 </span><span style="color:#0e84b5;font-weight:bold;">extends</span> <span>음료</span> <span style="color:#666666;">{}</span><br><br><span style="color:#007020;font-weight:bold;">class</span> <span style="color:#0e84b5;font-weight:bold;">CovarianceTest</span> <span style="color:#666666;">{</span><br> <span style="color:#007020;font-weight:bold;">public</span> <span style="color:#007020;font-weight:bold;">static</span> <span style="color:#902000;">void</span> <span style="color:#06287e;">main</span><span style="color:#666666;">(</span>String<span style="color:#666666;">[]</span> args<span style="color:#666666;">)</span> <span style="color:#666666;">{</span><br> <br> <span>자판기</span><span style="color:#666666;"><</span><span>콜라</span><span style="color:#666666;">></span> <span>콜라자판기</span> <span style="color:#666666;">=</span> <span style="color:#007020;font-weight:bold;">new</span> <span>자판기</span><span style="color:#666666;"><>();</span> <br> <span>자판기</span><span style="color:#666666;"><</span><span>사이다</span><span style="color:#666666;">></span> <span>사이다자판기</span> <span style="color:#666666;">=</span> <span style="color:#007020;font-weight:bold;">new</span> <span>자판기</span><span style="color:#666666;"><>();</span> <br> <span>자판기</span><span style="color:#666666;"><</span><span>음료</span><span style="color:#666666;">></span> <span>랜덤음료자판기</span> <span style="color:#666666;">=</span> <span style="color:#007020;font-weight:bold;">new</span> <span>자판기</span><span style="color:#666666;"><>();</span> <br><br> <span>콜라자판기</span><span style="color:#666666;">.</span><span>음료추가</span><span style="color:#666666;">(</span><span style="color:#007020;font-weight:bold;">new</span> <span>콜라</span><span style="color:#666666;">());</span><br> <span>사이다자판기</span><span style="color:#666666;">.</span><span>음료추가</span><span style="color:#666666;">(</span><span style="color:#007020;font-weight:bold;">new</span> <span>사이다</span><span style="color:#666666;">());</span><br><br> <span>랜덤음료자판기</span><span style="color:#666666;">.</span><span>음료추가</span><span style="color:#666666;">(</span><span style="color:#007020;font-weight:bold;">new</span> <span>콜라</span><span style="color:#666666;">());</span><br> <span>랜덤음료자판기</span><span style="color:#666666;">.</span><span>음료추가</span><span style="color:#666666;">(</span><span style="color:#007020;font-weight:bold;">new</span> <span>사이다</span><span style="color:#666666;">());</span><br><br> <span>판매하기</span><span style="color:#666666;">(</span><span>콜라자판기</span><span style="color:#666666;">);</span><br> <span>판매하기</span><span style="color:#666666;">(</span><span>사이다자판기</span><span style="color:#666666;">);</span><br> <span>판매하기</span><span style="color:#666666;">(</span><span>랜덤음료자판기</span><span style="color:#666666;">);</span><br> <span style="color:#666666;">}</span><br><br> <span style="color:#007020;font-weight:bold;">public</span> <span style="color:#007020;font-weight:bold;">static</span> <span>음료</span> <span>판매하기</span><span style="color:#666666;">(</span><span>자판기</span><span style="color:#666666;"><?</span> <span style="color:#007020;font-weight:bold;">extends</span> <span>음료</span><span style="color:#666666;">></span> <span>기계</span><span style="color:#666666;">)</span> <span style="color:#666666;">{</span><br> <span style="color:#007020;font-weight:bold;">return</span> <span>기계</span><span style="color:#666666;">.</span><span>음료반환</span><span style="color:#666666;">();</span><br> <span style="color:#666666;">}</span><br><span style="color:#666666;">}</span></pre></div> <div><br></div> <div> <div><br></div> <div>직원들이 공짜 음료를 너무 많이 마시는 바람에 캔 수거함이 필요 했다.</div> <div>회사는 수거함을 <span style="font-size:9pt;">어떻게 </span><span style="font-size:9pt;">구입해야 할까?</span></div> <div>콜라캔 수거함만 구입하면 사이다캔은 처리 할 곳이 없고 사이다캔만이면 콜라캔이 문제다.</div> <div>따라서 전용수거함을 따로 구입 하거나 각 캔을 동시에 처리 할 수 있는 수거함을 구입 할 수도 있고</div></div> <div>물론 콜라전용과 동시용, 사이다전용과 동시용으로 구입 할 수도 있겠다.</div> <div><br></div> <div style="background:#f0f0f0;overflow:auto;width:auto;border-style:solid;border-color:#808080;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin:0px;line-height:125%;"><span style="color:#007020;font-weight:bold;">class</span> <span>캔 {}</span> <br><span style="color:#007020;font-weight:bold;">class</span> <span>콜라캔 </span><span style="color:#0e84b5;font-weight:bold;">extends</span> <span>캔</span> <span style="color:#666666;">{}</span> <br><span style="color:#007020;font-weight:bold;">class</span> <span>사이다캔 </span><span style="color:#0e84b5;font-weight:bold;">extends</span> <span>캔</span> <span style="color:#666666;">{}</span> <br><br><span style="color:#007020;font-weight:bold;">class</span> <span style="color:#0e84b5;font-weight:bold;">ContraVarianceTest</span> <span style="color:#666666;">{</span> <br> <span style="color:#007020;font-weight:bold;">public</span> <span style="color:#007020;font-weight:bold;">static</span> <span style="color:#902000;">void</span> <span style="color:#06287e;">main</span><span style="color:#666666;">(</span>String<span style="color:#666666;">[]</span> args<span style="color:#666666;">)</span> <span style="color:#666666;">{</span> <br><br> <span>수거함</span><span style="color:#666666;"><</span><span>콜라캔</span><span style="color:#666666;">></span> <span>콜라캔수거함</span> <span style="color:#666666;">=</span> <span style="color:#007020;font-weight:bold;">new</span> <span>수거함</span><span style="color:#666666;"><>();</span> <br> <span>수거함</span><span style="color:#666666;"><</span><span>사이다캔</span><span style="color:#666666;">></span> <span>사이다캔수거함</span> <span style="color:#666666;">=</span> <span style="color:#007020;font-weight:bold;">new</span> <span>수거함</span><span style="color:#666666;"><>();</span> <br> <span>수거함</span><span style="color:#666666;"><</span><span>캔</span><span style="color:#666666;">></span> <span>캔수거함</span> <span style="color:#666666;">=</span> <span style="color:#007020;font-weight:bold;">new</span> <span>수거함</span><span style="color:#666666;"><>();</span> <br><br> <span>콜라캔수거하기</span><span style="color:#666666;">(</span><span>캔수거함</span><span style="color:#666666;">,</span> <span style="color:#007020;font-weight:bold;">new</span> <span>콜라캔</span><span style="color:#666666;">());</span> <br> <span>콜라캔수거하기</span><span style="color:#666666;">(</span><span>콜라캔수거함</span><span style="color:#666666;">,</span> <span style="color:#007020;font-weight:bold;">new</span> <span>콜라캔</span><span style="color:#666666;">());</span> <br><br> <span>사이다캔수거하기</span><span style="color:#666666;">(</span><span>캔수거함</span><span style="color:#666666;">,</span> <span style="color:#007020;font-weight:bold;">new</span> <span>사이다캔</span><span style="color:#666666;">());</span> <br> <span>사이다캔수거하기</span><span style="color:#666666;">(</span><span>사이다캔수거함</span><span style="color:#666666;">,</span> <span style="color:#007020;font-weight:bold;">new</span> <span>사이다캔</span><span style="color:#666666;">());</span> <br><br> <span>캔수거하기</span><span style="color:#666666;">(</span><span>캔수거함</span><span style="color:#666666;">,</span> <span style="color:#007020;font-weight:bold;">new</span> <span>콜라캔</span><span style="color:#666666;">());</span> <br> <span>캔수거하기</span><span style="color:#666666;">(</span><span>캔수거함</span><span style="color:#666666;">,</span> <span style="color:#007020;font-weight:bold;">new</span> <span>사이다캔</span><span style="color:#666666;">());</span> <br><br> <span style="color:#60a0b0;font-style:italic;">//불법캔투기(콜라캔수거함, new 사이다캔());</span> <br> <span style="color:#60a0b0;font-style:italic;">//불법캔투기(사이다캔수거함, new 콜라캔());</span> <br> <span style="color:#666666;">}</span> <br><br> <span style="color:#007020;font-weight:bold;">public</span> <span style="color:#007020;font-weight:bold;">static</span> <span style="color:#902000;">void</span> <span>콜라캔수거하기</span><span style="color:#666666;">(</span><span>수거함</span><span style="color:#666666;"><?</span> <span style="color:#007020;font-weight:bold;">super</span> <span>콜라캔</span><span style="color:#666666;">></span> <span>통</span><span style="color:#666666;">,</span> <span>콜라캔</span> <span>버릴캔</span><span style="color:#666666;">)</span> <span style="color:#666666;">{</span> <br> <span>통</span><span style="color:#666666;">.</span><span>캔넣기</span><span style="color:#666666;">(</span><span>버릴캔</span><span style="color:#666666;">);</span> <br> <span style="color:#666666;">}</span> <br><br> <span style="color:#007020;font-weight:bold;">public</span> <span style="color:#007020;font-weight:bold;">static</span> <span style="color:#902000;">void</span> <span>사이다캔수거하기</span><span style="color:#666666;">(</span><span>수거함</span><span style="color:#666666;"><?</span> <span style="color:#007020;font-weight:bold;">super</span> <span>사이다캔</span><span style="color:#666666;">></span> <span>통</span><span style="color:#666666;">,</span> <span>사이다캔</span> <span>버릴캔</span><span style="color:#666666;">)</span> <span style="color:#666666;">{</span> <br> <span>통</span><span style="color:#666666;">.</span><span>캔넣기</span><span style="color:#666666;">(</span><span>버릴캔</span><span style="color:#666666;">);</span> <br> <span style="color:#666666;">}</span> <br><br> <span style="color:#007020;font-weight:bold;">public</span> <span style="color:#007020;font-weight:bold;">static</span> <span style="color:#902000;">void</span> <span>캔수거하기</span><span style="color:#666666;">(</span><span>수거함</span><span style="color:#666666;"><</span><span>캔</span><span style="color:#666666;">></span> <span>통</span><span style="color:#666666;">,</span> <span>캔</span> <span>버릴캔</span><span style="color:#666666;">)</span> <span style="color:#666666;">{</span><br> <span>통</span><span style="color:#666666;">.</span><span>캔넣기</span><span style="color:#666666;">(</span><span>버릴캔</span><span style="color:#666666;">);</span> <br> <span style="color:#666666;">}</span> <br><br> <span style="color:#60a0b0;font-style:italic;">/*public static void 불법캔투기(수거함<? extends 캔> 넣을수거함, 캔 버릴캔) {</span> <br><span style="color:#60a0b0;font-style:italic;"> 넣을수거함.캔넣기(버릴캔);</span> <br><span style="color:#60a0b0;font-style:italic;"> }*/</span> <br><span style="color:#666666;">}</span> <br></pre></div>
Inspired by Erik Meijer's talk
<a href="https://www.infoq.com/presentations/covariance-contravariance-joy-of-coding-2014">https://www.infoq.com/presentations/covariance-contravariance-joy-of-coding-2014</a>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.