<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>junbeom-01.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 12 Nov 2024 02:21:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>junbeom-01.log</title>
            <url>https://velog.velcdn.com/images/junbeom-01/profile/0f016c7c-ecbd-4e21-9ba6-e3bac1af27f0/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. junbeom-01.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/junbeom-01" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[3D 메쉬의 Triangulating Facets 프로세스 최적화: 멀티 스레드 충돌 문제 해결]]></title>
            <link>https://velog.io/@junbeom-01/Mesh-%EC%83%9D%EC%84%B1-%EC%8B%9C-Triangulating-facets-process%EC%97%90%EC%84%9C-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4-%EC%9C%84%ED%97%98%ED%95%9C-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@junbeom-01/Mesh-%EC%83%9D%EC%84%B1-%EC%8B%9C-Triangulating-facets-process%EC%97%90%EC%84%9C-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4-%EC%9C%84%ED%97%98%ED%95%9C-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Tue, 12 Nov 2024 02:21:04 GMT</pubDate>
            <description><![CDATA[<h4 id="1-프로젝트-배경-및-목표">1. <strong>프로젝트 배경 및 목표</strong></h4>
<p>3D 메쉬 생성 과정에서 Triangulating Facets 프로세스는 해상도가 높아질수록 복잡해집니다. 특히 <strong>RefineToPolygonalFacet()</strong> 메소드에서 발생하는 멀티스레드 충돌 문제로 인해 특정 쓰레드에서 &quot;Key를 찾을 수 없음&quot; 에러가 빈번히 발생했습니다. 이는 프로그램 성능 저하뿐 아니라 데이터 일관성 문제로 이어지며, 이 문제를 해결하여 고해상도 환경에서도 안정적인 메쉬 생성을 보장하는 것이 목표입니다.
<img src="https://velog.velcdn.com/images/junbeom-01/post/b2354181-ad63-4b49-916e-e9dc9ae713f0/image.png" alt=""></p>
<hr>
<h4 id="2-문제-분석-및-해결-방안">2. <strong>문제 분석 및 해결 방안</strong></h4>
<p><strong>문제 분석</strong>:</p>
<ul>
<li><strong>RefineToPolygonalFacet()</strong> 메소드의 멀티 스레딩 처리 중, 점 삭제 및 수정 작업으로 인해 여러 쓰레드가 동시에 동일한 메모리에 접근하게 됩니다.</li>
<li>이 메소드는 <strong>Polygons</strong>라는 전역 변수를 사용하며, 스레드가 이 변수를 참조하는 동안 다른 스레드가 점을 삭제하거나 수정할 경우, 해당 자원이 누락되어 <strong>Key Error</strong>가 발생하는 구조였습니다.
<img src="https://velog.velcdn.com/images/junbeom-01/post/7fe3ce8e-afc0-48ea-b93a-f34e9fbe419d/image.png" alt="">
각각의 쓰레드가 자원을 참조하고 있을 때
<img src="https://velog.velcdn.com/images/junbeom-01/post/84530e6f-8949-4469-8ac1-b947e47f1c89/image.png" alt="">
Thread_1이 하나의 포인트를 삭제(소실)했을 때
<img src="https://velog.velcdn.com/images/junbeom-01/post/e80095d2-2a00-4bf5-91d2-109b69831d62/image.png" alt=""></li>
</ul>
<p><strong>문제 해결 방안</strong>:</p>
<ul>
<li><strong>스레드 안전성 확보</strong>: 전역 변수 <strong>Polygons</strong>의 공유 접근을 방지하기 위해 쓰레드 동기화 전략을 도입합니다.</li>
<li><strong>데이터 수정 방식 변경</strong>: 메모리 공유를 최소화하여 독립적인 데이터 처리를 보장합니다. 이를 위해 로컬 변수로 데이터를 복제한 후, 개별 스레드에서 필요한 작업을 수행하도록 변경하였습니다.</li>
</ul>
<hr>
<h4 id="3-구현-과정과-기술-스택">3. <strong>구현 과정과 기술 스택</strong></h4>
<ul>
<li><strong>락(lock) 기법 적용</strong>: 각 스레드가 데이터를 수정할 때 락을 사용해 한 번에 하나의 스레드만 자원에 접근하도록 설정했습니다. 이를 통해 다른 스레드에서 점이 소실되는 현상을 방지할 수 있었습니다.</li>
<li><strong>데이터 복제 방식 채택</strong>: 각 스레드에서 <strong>Polygons</strong>를 참조하지 않고 개별 복제본을 생성하여 작업하도록 설계함으로써 스레드 간 데이터 충돌을 방지했습니다.</li>
<li><strong>에러 재현 및 검증</strong>: 문제를 정확히 이해하기 위해 다양한 해상도에서 테스트를 거치며 에러 상황을 재현하고, 이후 해결 방안 적용 후의 안정성을 검증하였습니다.</li>
</ul>
<hr>
<h4 id="4-성과-및-지표">4. <strong>성과 및 지표</strong></h4>
<ul>
<li><strong>프로그램 안정성 향상</strong>: 멀티 스레드 작업 시 데이터 충돌 문제가 완화되면서 고해상도 메쉬 생성 시에도 안정성이 크게 개선되었습니다.</li>
<li><strong>처리 속도 최적화</strong>: 동기화로 인한 약간의 속도 저하는 있었지만, 전체 프로세스의 안정성이 향상되어 큰 문제 없이 고해상도 처리까지 가능해졌습니다.</li>
<li><strong>메모리 사용 최적화</strong>: 데이터 복제를 통해 필요 이상의 메모리 사용을 줄이고, 데이터 접근 시간을 줄여 성능을 유지했습니다.</li>
</ul>
<hr>
<h4 id="5-향후-계획-및-비전">5. <strong>향후 계획 및 비전</strong></h4>
<p>멀티 스레드 작업 시 전역 변수 사용은 불가피하게 안정성 문제를 야기할 수 있습니다. 앞으로는 스레드 안전성을 보장할 수 있는 디자인 패턴을 활용해 데이터 충돌을 방지하고, 고해상도에서도 높은 성능을 유지할 수 있는 프로그램을 설계하겠습니다. 지속적인 테스트와 최적화를 통해 더욱 효율적인 3D 메쉬 생성 프로세스를 완성할 계획입니다.</p>
<hr>
<h3 id="마무리">마무리</h3>
<p>&quot;이번 개선은 고해상도 3D 메쉬 작업에서의 멀티 스레드 충돌 문제를 해결하여, 높은 해상도에서도 안정적이고 효율적인 성능을 제공할 수 있도록 한 중요한 전환점이었습니다. 앞으로도 기술적 문제를 체계적으로 분석하고 개선하여 최적의 성능과 확장성을 목표로 프로그램을 발전시키겠습니다.&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[확장성을 고려한 프로그램 개선: 전극 타입별 객체 생성 최적화(3D Mesh 생성 Builder Pattern)]]></title>
            <link>https://velog.io/@junbeom-01/3D-Mesh-%EC%83%9D%EC%84%B1-Builder-Pattern</link>
            <guid>https://velog.io/@junbeom-01/3D-Mesh-%EC%83%9D%EC%84%B1-Builder-Pattern</guid>
            <pubDate>Tue, 12 Nov 2024 01:59:20 GMT</pubDate>
            <description><![CDATA[<h4 id="1-프로젝트-배경-및-목표">1. <strong>프로젝트 배경 및 목표</strong></h4>
<p>초기 코드에서 전극의 타입별로 여러 생성자를 오버로딩하고 각 객체를 생성하는 방식으로 설계가 이루어졌습니다. 초반에는 명확한 요구 사항과 정해진 규격에 맞춰 기능이 안정적으로 작동했지만, 프로그램이 점차 업데이트되면서 새로운 요구 사항이 추가됨에 따라 기존 설계의 한계가 명확해졌습니다. 확장성과 유지보수성을 보장하는 설계가 필수적이라 판단하여, 근본적인 코드 개선을 검토하게 되었습니다.</p>
<p><em>초기코드(아래)</em>
<img src="https://velog.velcdn.com/images/junbeom-01/post/5acb1189-cf15-44a6-8757-4e5fc775ae9a/image.png" alt=""></p>
<hr>
<h4 id="2-문제-분석-및-해결-방안">2. <strong>문제 분석 및 해결 방안</strong></h4>
<p>초기 코드에서 발견된 주요 문제점은 다음과 같습니다:</p>
<ol>
<li><p><strong>객체 관리 문제</strong>: 전극의 모양별로 객체 관리를 위한 구조가 부족하여, 각 타입의 전극 객체를 효율적으로 관리하기 어려웠습니다.</p>
</li>
<li><p><strong>과도한 생성자</strong>: 생성자가 많아지면서 코드의 가독성이 떨어졌으며, 코드 유지보수에도 부담이 생겼습니다.
<img src="https://velog.velcdn.com/images/junbeom-01/post/2a2bbe64-c4d5-4f06-b588-d938408c7fc3/image.png" alt=""></p>
</li>
<li><p><strong>복잡한 메소드 호출</strong>: 메소드 호출 케이스가 너무 다양하게 분산되어 있어 코드의 흐름을 한눈에 파악하기 어려웠습니다.
<img src="https://velog.velcdn.com/images/junbeom-01/post/e43321d3-09ad-4d4c-9000-6b2acff9f83c/image.png" alt=""></p>
</li>
<li><p><strong>확장성 부족</strong>: 프로그램이 점점 확장되면서 요구사항 변경 시 코드 수정이 불가피해졌습니다.</p>
</li>
</ol>
<p>이러한 문제를 해결하기 위해 <strong>빌더 패턴</strong>을 도입하여 각 단점을 보완하고 프로그램의 확장성을 확보했습니다.</p>
<hr>
<h4 id="3-구현-과정과-기술-스택">3. <strong>구현 과정과 기술 스택</strong></h4>
<ul>
<li><strong>빌더 패턴 적용</strong>: 빌더 패턴을 사용해 전극 객체 생성을 체계화하였습니다. 이를 통해 객체 생성을 더 명확하게 하고, 각 전극 타입에 맞는 생성 옵션을 유연하게 처리할 수 있도록 개선했습니다.
<img src="https://velog.velcdn.com/images/junbeom-01/post/b05aa8ba-8b29-4bc8-98e3-699f6beacd56/image.png" alt=""></li>
<li><strong>코드 설계 리뷰</strong>: 초기 코드를 통해 소장님과 협의한 결과, “프로그램 확장성이 부족해, 향후 요구사항에 따라 코드 수정이 불가피할 것”이라는 점을 피드백했습니다. 이에 따라 빌더 패턴을 적용한 개선안을 제안하고 검토를 거쳐 적용하게 되었습니다.</li>
<li><strong>단순화된 생성 구조</strong>: 생성자 오버로딩의 필요성을 줄이고 각 전극 타입별 특성을 반영한 객체 생성이 가능하도록 설계를 단순화했습니다.
<img src="https://velog.velcdn.com/images/junbeom-01/post/b643ae5a-b5f8-4035-b70b-1edeebad55ea/image.png" alt=""></li>
</ul>
<hr>
<h4 id="4-성과-및-지표">4. <strong>성과 및 지표</strong></h4>
<p>코드 개선 후 얻어진 주요 성과는 다음과 같습니다:</p>
<ul>
<li><strong>유지보수성 향상</strong>: 기존에 비해 객체 생성 방식을 일관되게 통제할 수 있어 코드의 가독성과 유지보수성이 크게 개선되었습니다.</li>
<li><strong>확장성 확보</strong>: 요구사항이 추가되더라도 기존 코드 구조를 변경할 필요 없이 확장이 가능해졌습니다.</li>
<li><strong>효율적인 객체 관리</strong>: 전극의 모양에 따라 객체가 체계적으로 생성되어 관리가 용이해졌습니다.</li>
<li><strong>코드 복잡도 감소</strong>: 메소드 호출이 단순화되어, 코드 흐름이 명확해졌습니다.
(전)
<img src="https://velog.velcdn.com/images/junbeom-01/post/5acb1189-cf15-44a6-8757-4e5fc775ae9a/image.png" alt="">
(후)
<img src="https://velog.velcdn.com/images/junbeom-01/post/b643ae5a-b5f8-4035-b70b-1edeebad55ea/image.png" alt=""></li>
</ul>
<hr>
<h4 id="5-향후-계획-및-비전">5. <strong>향후 계획 및 비전</strong></h4>
<p>이번 개선을 통해 전극 타입별 객체 생성 구조가 확장성을 고려한 형태로 전환되었습니다. 앞으로도 빌더 패턴과 같은 디자인 패턴을 적용하여 코드의 유지보수성과 확장성을 지속적으로 개선할 예정입니다. 향후 새로운 전극 타입이나 요구사항이 추가되더라도 코드 수정 없이 효율적으로 대응할 수 있는 시스템을 구축해 나가겠습니다.</p>
<hr>
<h3 id="마무리">마무리</h3>
<p>&quot;이번 코드 개선은 단순한 기능 확장이 아닌, 프로그램 전반의 확장성과 유지보수성을 고려한 근본적인 접근이었습니다. 앞으로도 기술적 혁신을 바탕으로 한 사용자 중심의 개선을 통해 더욱 강력하고 유연한 프로그램을 제공하겠습니다.&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Patient Dashboard UX/UI]]></title>
            <link>https://velog.io/@junbeom-01/Patient-Dashboard-UXUI</link>
            <guid>https://velog.io/@junbeom-01/Patient-Dashboard-UXUI</guid>
            <pubDate>Sat, 02 Nov 2024 07:13:40 GMT</pubDate>
            <description><![CDATA[<h1 id="dicom-정보를-한-눈에">DICOM 정보를 한 눈에</h1>
<p>DICOM정보를 가져온 후 병원 관계자 (의사 혹은 의학물리학자, 방사선사)가 쉽게 정보를 파악할 수 있는 UI를 대학원에서 연구하면서 생각했다.</p>
<p><img src="https://velog.velcdn.com/images/junbeom-01/post/1e4664c2-b3ab-48c1-bd9d-428185ba8ad0/image.png" alt=""></p>
<p>이런 컨샙으로 Study에 관련된 DICOM Tag들을 우선적으로 보여주어 직관적으로 알아볼 수 있게 구상했다.</p>
<p><img src="https://velog.velcdn.com/images/junbeom-01/post/12724b14-4048-400d-8ef4-fc9f977f24d4/image.png" alt=""></p>
<p>IOS 디자인을 참고하여 날짜별로 환자를 관리하거나 DICOM 데이터들의 정보를 축약하여 볼 수 있게 만들었다. (역시 IOS 디자인은 최고다)</p>
<p><img src="https://velog.velcdn.com/images/junbeom-01/post/dd9ee5d8-51a0-45dc-bd21-7bc2c95c94a3/image.png" alt=""></p>
<p>천체적인 구조는 이렇게 됩니다.
환자 리스트, 날짜별 이벤트, 데이터 관리, 서버 연결, User관리 등등 모든 기능을 함축적으로 나타내기위해 디자인했는데 조금 어수선한 느낌이 있네요.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[PACS에 대하여(SCU / SCP)]]></title>
            <link>https://velog.io/@junbeom-01/PACS%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACSCU-SCP</link>
            <guid>https://velog.io/@junbeom-01/PACS%EC%97%90-%EB%8C%80%ED%95%98%EC%97%ACSCU-SCP</guid>
            <pubDate>Wed, 30 Oct 2024 06:59:22 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/junbeom-01/post/0d1f886a-c2ae-41e2-8ad1-d4e91fc67009/image.png" alt=""></p>
<h1 id="목차">목차</h1>
<h2 id="용어">용어</h2>
<ul>
<li><strong>SCP :</strong> Server Class Provider <strong>, Server 역할</strong></li>
<li><strong>SCU</strong> : Server Class User<strong>,  Client 역할</strong></li>
<li><strong>AE :</strong> Application Entity<strong>, Network내에 특정 Application</strong></li>
<li><strong>IOD :</strong> Information Object Definition<strong>, 데이터를 이루는 정보(IOD종류)</strong></li>
<li><strong>SOP :</strong> Service-Object Pair<strong>, Service는 주로 Command를 의미 Object는 IOD를 의미</strong><ul>
<li>DIMSE Service-IOD,</li>
<li>(명령어-정보) 조합</li>
</ul>
</li>
<li><strong>DIMSE :</strong> DICOM DICOM Message Service Element<strong>, AE 간의 메시지 교환을 위한 메커니즘</strong></li>
<li><strong>DIMSE-C :</strong>  Those services application to Composite SOP Instances<strong>,  DIMSE 메세지 교환 메커니즘 중 하나를 의미</strong></li>
</ul>
<h2 id="dimse-c-services"><strong>DIMSE-C Services</strong></h2>
<ul>
<li><p><strong>C-STORE: 영상이나 문서 같은 DICOM 객체들을 저장하기 위한 서비스</strong>입니다.</p>
<p>  <a href="https://www.notion.so/C-STORE-Services-fbaa0861b7084164bf2d548d3d152b1b?pvs=21"><strong>C-STORE Services</strong></a></p>
</li>
<li><p><strong>C-GET:</strong> 서버로부터 <strong>DICOM 객체를 직접 요청하고 전송받기 위한 서비스</strong>입니다. 서버는 C-GET 요청을 받은 후 요청한 객체들을 클라이언트에게 직접 전송합니다.</p>
<p>  <a href="https://www.notion.so/C-GET-Services-b04df70ae9d64af2a87586dcb6bf4ec9?pvs=21"><strong>C-GET  Services</strong></a></p>
</li>
<li><p><strong>C-MOVE:</strong> 지정된 <strong>DICOM 객체들을 서버로부터 다른 대상(AE)으로 전송하도록 요청하는 서비스</strong>입니다. 여기서는 요청 받은 서버가 대상 AE로 객체를 전송합니다.</p>
<p>  <a href="https://www.notion.so/C-MOVE-Services-5d075e5b467b498186736bd6df3c5afa?pvs=21"><strong>C-MOVE Services</strong></a></p>
</li>
<li><p><strong>C-FIND: 부합하는 조건의 DICOM 객체를 찾기 위한 요청을 하는 서비스</strong>입니다. 예를 들어, 특정 환자의 의료 기록이나 영상을 검색할 때 사용할 수 있습니다.</p>
<p>  <a href="https://www.notion.so/C-FIND-Services-ce36d032ffa94fd9ba96d1853e0d0de8?pvs=21"><strong>C-FIND Services</strong></a></p>
</li>
<li><p><strong>C-ECHO: 연결 상태를 확인</strong>하는 테스트용 서비스입니다.</p>
<p>  <a href="https://www.notion.so/C-ECHO-Services-2bf36814c2b1423e902f7ebd1d7eb077?pvs=21"><strong>C-ECHO Services</strong></a></p>
</li>
</ul>
<h2 id="c-get-vs-c-move">C-GET vs C-MOVE</h2>
<h3 id="c-move와-c-get의-차이점"><strong>C-MOVE와 C-GET의 차이점</strong></h3>
<ul>
<li>C-MOVE와 C-GET은 모두 Query/Retrieve 서비스입니다만, 주된 차이점은 데이터의 전송 대상에 있습니다. C-GET은 데이터를 요청한 클라이언트에게 직접 전송하는 반면, C-MOVE는 요청한 클라이언트가 지정한 다른 AE로 데이터를 전송합니다.</li>
<li><strong>결론적으로 C-MOVE는 C-GET에 비해 데이터 전송을 더 효율적으로 관리할 수 있으므로 대체로 더 많이 사용되는 프로토콜입니다.</strong></li>
</ul>
<h2 id="c-get과-c-store의-차이">C-GET과 C-Store의 차이</h2>
<h3 id="c-get-서비스란"><strong>C-GET 서비스란?</strong></h3>
<ul>
<li>C-GET 서비스는 DICOM Query/Retrieve 프로토콜의 일환으로, 클라이언트가 서버에게 특정 조건에 맞는 데이터를 요청하고, 해당 데이터를 직접적으로 받는 과정에서 사용됩니다. 즉, C-GET 명령을 통해 데이터를 요청하면, 서버는 따로 다른 노드(node)에 데이터를 보내는 대신, 요청한 클라이언트에게 직접 데이터를 전송합니다.</li>
</ul>
<h3 id="c-store-서비스란"><strong>C-STORE 서비스란?</strong></h3>
<ul>
<li>C-STORE 서비스는 단일 DICOM 객체를 목적지 AE로 전송하고 저장하도록 요청하는 서비스입니다. 이는 일반적으로 &#39;DICOM Push&#39;라고도 불리며, 의료 이미지나 기타 DICOM 객체를 PACS나 다른 DICOM 장비로 보낼 때 사용됩니다.</li>
</ul>
<h3 id="c-get과-c-store의-핵심-차이점"><strong>C-GET과 C-STORE의 핵심 차이점</strong></h3>
<ul>
<li><strong>데이터 전송 방식:</strong> C-GET은 요청자에게 직접 데이터를 전송하는 반면, C-STORE는 목적지 AE에 데이터를 &quot;푸시(push)&quot;하는 방식입니다.</li>
<li><strong>데이터 흐름:</strong> C-GET의 경우 데이터 흐름은 클라이언트와 서버 간 양방향이 되며, C-STORE는 일방향으로 데이터가 전송됩니다.</li>
<li><strong>네트워크 사용:</strong> C-GET은 네트워크 사용이 더 복잡할 수 있으나, 서버가 요청자 측의 구성을 몰라도 됩니다. C-STORE는 네트워크 사용이 상대적으로 간단하지만, 응답자가 클라이언트의 데이터를 받을 준비가 되어 있어야 합니다.</li>
</ul>
</aside>

<h2 id="참고-문헌">참고 문헌</h2>
<p><a href="https://dicom.nema.org/dicom/2013/output/chtml/part07/sect_7.5.html">7.5 DIMSE Services</a></p>
<p><a href="https://dicomis.tistory.com/m/29">DICOM Viewer 와 PACS</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체지향 3요소]]></title>
            <link>https://velog.io/@junbeom-01/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-3%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@junbeom-01/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-3%EC%9A%94%EC%86%8C</guid>
            <pubDate>Mon, 27 Mar 2023 02:03:54 GMT</pubDate>
            <description><![CDATA[<p><strong>캡슐화</strong></p>
<ul>
<li><strong>내부적으로 기능을 어떻게 구현하는지 감추는 것</strong></li>
<li>캡슐화를 통해 객체간의 의존성을 관리할 수 있고 이를 통해 결합도가 낮은 객체를 만들 수 있습니다.</li>
<li>그 결과 유지보수가 쉬운 코드를 만들 수 있습니다.</li>
<li>(객체를 수정할 일이 있을때 다른 객체에 영향을 주지 않으니 그것만 변경하면 되서 쉬운 유지보수가 가능한것입니다.)</li>
<li>대표적인 예로 private 과 같은 접근제어자를 활용해 접근을 제한하는 방법이 있습니다.</li>
</ul>
<p><strong>상속</strong></p>
<ul>
<li><strong>부모 클래스의 변수와 메소드를 자식 클래스가 물려 받아서 쓸 수 있는 것.</strong></li>
<li>기능을 쉽게 가져다 쓸 수 있고 불필요한 코드를 줄일 수 있어 보다 효율적인 코딩이 가능합니다.</li>
</ul>
<p><strong>다형성</strong></p>
<ul>
<li><strong>같은 코드가 다른 행위를 하는 것을 말한다.</strong></li>
</ul>
<p>( 다형성은 개념이 좀 모호한 것 같습니다. 예시를 통해 먼저 알아보겠습니다.)</p>
<p>예시1)</p>
<ul>
<li>탱크 게임이 있습니다. 거기에는 tank 라는 객체가 있고 이를 상속받는 주인공tank와 적tank 객체가 있습니다.</li>
<li>이들은 모두 tank 객체의 attack()이라는 메서드를 상속받아서 구현하는데 서로 다르게 구현합니다 주인공tank의 attack()은 전의 위치를 입력하면 일정 데미지를 주는 로직이고 적tank는 주인공 tank가 일정 범위에 들어왔을때 일정 시간 간격으로 특정 데미지를 주는 형식입니다.</li>
</ul>
<p>예시2)</p>
<ul>
<li>계산기 기능 중 plus()라는 더하기 메서드가 있습니다. plus(1,2)처럼 두 개의 매개변수가 들어가서 계산을 수행할 수도 있고 plus(1,2,3) 처럼 3가지 매개변수가 들어가서 계산을 수행할 수도 있습니다.</li>
</ul>
<p>첫번째 예시는 <strong>Overriding</strong>의 개념입니다.</p>
<p>상속받은 메소드 내의 로직을 새롭게 정의하는 것을 말합니다. 이처럼 같은 이름이지만 구현하는 클래스마다 다른 역할을 하는 것입니다.</p>
<p>두번째 예시는 <strong>Overloading</strong>의 개녑입니다.</p>
<p>오버로딩은 하나의 클래스에서 같은 이름의 메소드를을 여러 개 가질 수 있게 하는 것이지요.</p>
<p>다양한 매개변수를 처리할 수 있게 해주기 위함입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[대학 LMS강의 스케쥴앱 만들어보기(과제,퀴즈,강의 선택 페이지)]]></title>
            <link>https://velog.io/@junbeom-01/%EB%8C%80%ED%95%99-LMS%EA%B0%95%EC%9D%98-%EC%8A%A4%EC%BC%80%EC%A5%B4%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0%EA%B3%BC%EC%A0%9C%ED%80%B4%EC%A6%88%EA%B0%95%EC%9D%98-%EC%84%A0%ED%83%9D-%ED%8E%98%EC%9D%B4%EC%A7%80</link>
            <guid>https://velog.io/@junbeom-01/%EB%8C%80%ED%95%99-LMS%EA%B0%95%EC%9D%98-%EC%8A%A4%EC%BC%80%EC%A5%B4%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0%EA%B3%BC%EC%A0%9C%ED%80%B4%EC%A6%88%EA%B0%95%EC%9D%98-%EC%84%A0%ED%83%9D-%ED%8E%98%EC%9D%B4%EC%A7%80</guid>
            <pubDate>Wed, 29 Sep 2021 08:15:25 GMT</pubDate>
            <description><![CDATA[<p>과제,퀴즈,강의 선택페이지는 애플의 앱스토어를 모티브로 만들어봤습니다.
이미지를 잘 활용하여 사용자입장에서 눈이 즐거운 앱 개발이라는 목표에 한 발 가까워진 것 같습니다.</p>
<p>&lt;처음 앱의 구성입니다.&gt;
<img src="https://images.velog.io/images/junbeom-01/post/1234081a-103d-4527-9db8-a04572710368/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-09-29%20%EC%98%A4%ED%9B%84%205.11.04.png" alt="">
이미지를 최대한 활용하였습니다.</p>
<p><img src="https://images.velog.io/images/junbeom-01/post/5d2cf190-fff0-43cb-ba39-3ef3477ac7bd/image.png" alt="">&lt;구현된 페이지&gt;
이미지는 저작권이 없는 무료 이미지를 사용하였습니다.
<img src="https://images.velog.io/images/junbeom-01/post/f5c0b404-8fa5-405d-9f7b-22a6c5cc523a/Simulator%20Screen%20Shot%20-%20iPhone%2012%20Pro%20Max%20-%202021-09-29%20at%2017.09.29.png" alt="">
제가 원하던 이미지가 없어서 이미지 부분이 많이 아쉬웠습니다.</p>
<p><img src="https://images.velog.io/images/junbeom-01/post/56b52dd8-a404-4782-8212-ba71c9be6caa/Simulator%20Screen%20Shot%20-%20iPhone%2012%20Pro%20Max%20-%202021-09-29%20at%2017.09.31.png" alt=""></p>
<p>&lt;실제 구현 코드입니다.&gt;</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;
import &#39;package:grade_protector/screen/Quiz.dart&#39;;
import &#39;package:grade_protector/screen/Task.dart&#39;;

import &#39;Lec.dart&#39;;

class Scroll_Page extends StatefulWidget {
  @override
  _Scroll_PageState createState() =&gt; _Scroll_PageState();
}

class _Scroll_PageState extends State&lt;Scroll_Page&gt; {
  final img= [
    &quot;image/lec1.png&quot;,
    &quot;image/quize1.png&quot;,
    &quot;image/task1.png&quot;,
  ];
  final texts=[&quot;강의&quot;,&quot;퀴즈&quot;,&quot;과제&quot;];
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Container(
        decoration: new BoxDecoration(
            image: new DecorationImage(
                image: new AssetImage(&quot;image/pexels-moose-photos-1037995.jpg&quot;),
                fit: BoxFit.cover
            )
        ),
        child: Scaffold(
          backgroundColor: Colors.transparent,
          extendBodyBehindAppBar: true,
          appBar: AppBar(
            backgroundColor: Colors.transparent,
            elevation: 0,
            leading: IconButton(
              color: Colors.black,
              icon: Icon(Icons.arrow_back_ios),
              onPressed: (){
                Navigator.of(context).pop();
              },
            ),
          ),
          body: ListView.separated(
              separatorBuilder:(BuildContext context,int index){
                return SizedBox(
                  height: 80,
                );
              },
              padding: EdgeInsets.only(top: 70,left: 10,right: 10),
              itemCount: 3,
              itemBuilder: (BuildContext context, int index){
                return Hero(
                  tag: texts[index],
                  child: FlatButton(
                    onPressed: (){
                     Navigator.push(context, MaterialPageRoute(builder: (_){
                       return index==0?Lec(img[index]):index==1?Quize(img[index]):Task(img[index]);
                     }));
                    },
                    child: Stack(
                      children: [
                        Container(
                          height: MediaQuery.of(context).size.height*0.43,
                          padding: EdgeInsets.only(top: 30,bottom: 30),
                          decoration: BoxDecoration(
                              image: DecorationImage(
                                  image: AssetImage(
                                      img[index]
                                  ),
                                  fit: BoxFit.fill
                              ),
                              color: Colors.lightBlue,
                              borderRadius: BorderRadius.all(Radius.circular(60))
                          ),
                        ),
                        Positioned(
                            top: 30,
                            right: 70,
                            child: Text(texts[index],
                              style: TextStyle(
                                  fontWeight: FontWeight.w600,
                                  color: Colors.black,
                                  fontSize: 45
                              ),))
                      ],
                    ),
                  ),
                );
              }),
        ),
      ),
    );
  }
}

</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[대학 LMS강의 스케쥴앱 만들어보기(과목 선택 페이지)]]></title>
            <link>https://velog.io/@junbeom-01/%EB%8C%80%ED%95%99-LMS%EA%B0%95%EC%9D%98-%EC%8A%A4%EC%BC%80%EC%A5%B4-%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0%EA%B3%BC%EB%AA%A9-%EC%84%A0%ED%83%9D-%ED%8E%98%EC%9D%B4%EC%A7%80</link>
            <guid>https://velog.io/@junbeom-01/%EB%8C%80%ED%95%99-LMS%EA%B0%95%EC%9D%98-%EC%8A%A4%EC%BC%80%EC%A5%B4-%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0%EA%B3%BC%EB%AA%A9-%EC%84%A0%ED%83%9D-%ED%8E%98%EC%9D%B4%EC%A7%80</guid>
            <pubDate>Wed, 29 Sep 2021 07:46:12 GMT</pubDate>
            <description><![CDATA[<p>앱 구성은 페이지 상단에 학생 이미지를 넣고
스크롤를 통해 과목을 선택할 수 있게 구성하였습니다.
<img src="https://images.velog.io/images/junbeom-01/post/f73f6ea8-c769-4440-8d2e-824a6e63d50c/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-09-29%20%EC%98%A4%ED%9B%84%204.40.04.png" alt=""></p>
<p>&lt;실제 구현&gt;
<img src="https://images.velog.io/images/junbeom-01/post/44049b2f-d770-4afc-a426-b1e48ab64fb4/Simulator%20Screen%20Shot%20-%20iPhone%2012%20Pro%20Max%20-%202021-09-29%20at%2016.37.21.png" alt=""></p>
<p>아직 백이 준비가 안됐기 때문에 이미지와 제목은 공백으로 남겨 두었습니다.
앱의 대표 컬러는 민트와 화이트레드이기때문에 투톤에 맞는 디자인을 짜보았습니다.</p>
<p>&lt;구현 코드입니다.(flutter)&gt;</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;
import &#39;package:grade_protector/APi/Api.dart&#39;;
import &#39;package:grade_protector/Color/colors.dart&#39;;
import &#39;package:grade_protector/screen/scroll_page.dart&#39;;

class Home_page extends StatefulWidget {
  @override
  _Home_pageState createState() =&gt; _Home_pageState();
}

class _Home_pageState extends State&lt;Home_page&gt; {
  Color mint=Use_Colors().get_mint_colors();
  Color r_color = Use_Colors().get_R_colors();
  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return MaterialApp(
      home:  Scaffold(
        backgroundColor: r_color,
        appBar: AppBar(
          backgroundColor: mint,
          elevation: 0,
          leading: IconButton(
            color: Colors.black,
            icon: Icon(Icons.arrow_back_ios),
            onPressed: (){
              Navigator.of(context).pop();
            },
          ),
        ),
        body: Column(
          children: [
            Container(
              height: size.height*0.26,
                color: r_color,
                child: Stack(
                  children: [
                    Container(
                      height: size.height *0.2-10,
                      decoration: BoxDecoration(
                        color: mint,
                        borderRadius: BorderRadius.only(
                          bottomLeft: Radius.circular(123),
                        )
                      ),
                    ),
                    Positioned(
                      bottom: 20,
                        left: size.width*0.36,
                        child: Container(
                          height: 130,
                          width: 130,
                          decoration: BoxDecoration(
                             color: Colors.white,
                            borderRadius: BorderRadius.circular(360)
                          ),
                        ))
                  ],
                )),
            Flexible(
                flex: 6,
                child: ListView.separated(
                  padding: EdgeInsets.only(right: 20,left: 20,),
                    itemCount: 6,
                    itemBuilder: (BuildContext context,int? index){
                      return Container(
                        height: 100,
                        color: Colors.white,
                        child: Row(
                          children: [
                            Flexible(
                                flex:3,
                                child: Container(
                                  color: r_color,
                                  child: Stack(
                                    children: [
                                      Container(
                                        height: 100,
                                        width: 100,
                                        decoration: BoxDecoration(
                                          color: Colors.white,
                                          borderRadius: BorderRadius.all(Radius.circular(360))
                                        ),
                                      )
                                    ],
                                  ),
                                  // decoration: BoxDecoration(
                                  //   borderRadius: BorderRadius.all(Radius.circular(360))
                                  // ),
                                )),
                            Flexible(
                                flex:6,
                                child: Container(
                                  //padding: EdgeInsets.only(left: 10),
                                )),
                            Flexible(
                                flex:3,
                                child: Container(
                                  padding: EdgeInsets.only(left: 40),
                                  child: IconButton(
                                    iconSize: 40,
                                    icon: Icon(Icons.arrow_downward,color: r_color,),
                                    onPressed: (){
                                      Navigator.push(
                                        context,
                                        MaterialPageRoute(builder: (context) =&gt; Scroll_Page()),
                                      );
                                    },
                                  ),
                                )),
                          ],
                        ),
                      );
                    },
                  separatorBuilder: (BuildContext context, int index)=&gt; const Divider(),
                )),

          ],
        ),
      ),
    );
  }
}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[대학 LMS강의 스케쥴앱 만들어보기(로그인 화면)]]></title>
            <link>https://velog.io/@junbeom-01/%EB%8C%80%ED%95%99-LMS%EC%8A%A4%EC%BC%80%EC%A5%B4%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%99%94%EB%A9%B4</link>
            <guid>https://velog.io/@junbeom-01/%EB%8C%80%ED%95%99-LMS%EC%8A%A4%EC%BC%80%EC%A5%B4%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%99%94%EB%A9%B4</guid>
            <pubDate>Sat, 18 Sep 2021 12:44:59 GMT</pubDate>
            <description><![CDATA[<p>(배경화면은 무료로 배포된 배경화면입니다.)
처음 구상한 로그인페이지와는 다르게 구현했습니다. 왜냐하면 로그인에 모션을 주고 싶고 이미지와 어울리는 심플함이 필요하여 이렇게 구현하게 되었습니다.
앱을 클릭하면 바로 배경화면이 나오고 2초 뒤에 로그인 페이지로 넘어갑니다.
<img src="https://images.velog.io/images/junbeom-01/post/780b2688-27b1-4016-b094-5f7f55c0cc92/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-09-18%20%EC%98%A4%ED%9B%84%209.40.43.png" alt=""></p>
<p>시작하기는 텍스트버튼을 이용하여 버튼을 클릭할 경우 로그인창이 나오게 만들었습니다.
<img src="https://images.velog.io/images/junbeom-01/post/ccc6af39-25b3-418e-936d-e92af248d98b/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-09-18%20%EC%98%A4%ED%9B%84%209.40.55.png" alt=""></p>
<p>시작하기버튼을 누르면 로그인 창이 나옵니다.
<img src="https://images.velog.io/images/junbeom-01/post/74094860-9d4b-4436-b429-3d7e84b603ff/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-09-18%20%EC%98%A4%ED%9B%84%209.41.16.png" alt=""></p>
<p>(동영상 넣는 방법을 몰라서 올리질 못 하네요 ㅠ)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[대학교 LMS강의 스케쥴앱 만들어보기(구성)]]></title>
            <link>https://velog.io/@junbeom-01/%EB%8C%80%ED%95%99%EA%B5%90-LMS%EA%B0%95%EC%9D%98-%EC%8A%A4%EC%BC%80%EC%A5%B4%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@junbeom-01/%EB%8C%80%ED%95%99%EA%B5%90-LMS%EA%B0%95%EC%9D%98-%EC%8A%A4%EC%BC%80%EC%A5%B4%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Sat, 18 Sep 2021 12:07:15 GMT</pubDate>
            <description><![CDATA[<p>코로나 상황이라 모든 대학은 온라인 강의를 반강제적으로 진행되고 있다.사실 이 앱을 만든 목적은 강의를 제대로 들었는지 과제를 제출했는지 여부를 가끔가다 까먹기 때문에 만들었다.</p>
<p>웹 사이트에서 접속하여 강의를 확인하면 되지만 늘 노트북을 들고 다닐 수 없고 너무 불편하다. 또한 LMS앱은 과제와 퀴즈 완료 여부를 지원하지 않아 너무 불편했다.</p>
<p>(그림을 잘 못 그리니 이해부탁합니다,,,)</p>
<p><img src="https://images.velog.io/images/junbeom-01/post/5ba2f4c2-b59f-4d21-9d5e-58c7a89a1e29/image.png" alt=""></p>
<p>유연한 곡선을 사용하면 좋을 것 같다.
사실 이미지를 활용하여 로그인 화면을 구상하고 싶어 그려보았다.</p>
<p><img src="https://images.velog.io/images/junbeom-01/post/834e724b-234f-46fd-a388-024ee262792c/image.png" alt=""></p>
<p>로그인 후 메인페이지는 과목을 선택할 수 있고 과목을 선택할 경우 애플마켓처럼 이미지와 액션을 자연스럽게 녹여 구상했다.</p>
<p><img src="https://images.velog.io/images/junbeom-01/post/d73a8bf1-0524-457b-b938-91f24e956bf6/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/junbeom-01/post/7a392e23-1bbe-47cb-8ce7-157d9819034d/image.png" alt=""></p>
<p>이 앱의 컨셉은 이미지를 활용한 액션이다.눈이 즐거운 앱이 더 사용하고 싶게 만들기 때문이다.</p>
]]></description>
        </item>
    </channel>
</rss>