<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mac-10.log</title>
        <link>https://velog.io/</link>
        <description>성장하는 개발자가 되자.</description>
        <lastBuildDate>Mon, 07 Mar 2022 11:02:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>mac-10.log</title>
            <url>https://images.velog.io/images/mac-10/profile/0acfd1a3-4aa9-415a-9c9b-b08932512a52/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. mac-10.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/mac-10" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[BJ11055 가장 큰 증가 부분 수열]]></title>
            <link>https://velog.io/@mac-10/BJ11055-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%A6%9D%EA%B0%80-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4</link>
            <guid>https://velog.io/@mac-10/BJ11055-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%A6%9D%EA%B0%80-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4</guid>
            <pubDate>Mon, 07 Mar 2022 11:02:32 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/11055">https://www.acmicpc.net/problem/11055</a>
사용한 알고리즘 : DP
난이도 : 실버 2</p>
<h3 id="문제">문제</h3>
<p>주어진 순열에서 임의의로 뽑아낸 수들이 오름차순으로 배열되어 있다면 이 수열을 증가 부분 수열이라고 부른다.</p>
<p>주어진 수열의 증가 부분 수열 중에서 합이 가장 큰 증가 부분 수열의 합을 구하시오.</p>
<h3 id="문제-접근-방법">문제 접근 방법</h3>
<p>DP 알고리즘으로 문제를 해결하기 위해서는 다음의 2 조건을 만족해야한다.</p>
<ol>
<li>큰 문제를 같은 구조의 작은 문제로 분해할 수 있다.</li>
<li>작은 문제의 최적의 해를 이용해서 큰 문제의 최적의 해를 구할 수 있다.</li>
</ol>
<p>위의 두 경우를 만족하면 문제를 점화식의 형태로 만들어 풀 수 있다.</p>
<p>점화식</p>
<p>주어진 순열에서
1번부터 N번까지의 수열에서 합이 가장 큰 증가 부분 수열의 합을 구하는 경우</p>
<ul>
<li>1번부터 N-1번까지의 증가 부분 수열중에서 마지막 값이 수열 N번의 값보다 작은 증가 부분 수열을 찾는다. ...(1)</li>
<li>(1)에서 찾은 증가 부분 수열중에 합이 가장 큰 증가 부분 수열에 수열 N번의 값을 붙여 증가 부분 수열을 구한다.</li>
</ul>
<h3 id="코드">코드</h3>
<pre><code>package Java.Y22.M03.D07;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ11055_BiggestIncreaseSequence {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 0; i &lt; N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int[] dp = new int[N];
        for(int i = 0; i &lt; N; i++) {
            int tmp = 0;
            for(int j = 0; j &lt; i; j++) {
                if(arr[j] &gt;= arr[i]) continue;

                tmp = Integer.max(tmp, dp[j]);

            }
            dp[i] = tmp + arr[i];
        }

        int answer = 0;
        for(int i = 0; i &lt; N; i++) {
            answer  = Integer.max(answer, dp[i]);
        }
        System.out.println(answer);

    }

}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[BJ1699 제곱수의 합]]></title>
            <link>https://velog.io/@mac-10/BJ1699-%EC%A0%9C%EA%B3%B1%EC%88%98%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@mac-10/BJ1699-%EC%A0%9C%EA%B3%B1%EC%88%98%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Sun, 06 Mar 2022 13:17:36 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1699">https://www.acmicpc.net/problem/1699</a>
사용한 알고리즘 : DP
난이도 : 실버 3</p>
<h3 id="문제">문제</h3>
<p>어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. </p>
<p>주어진 자연수 N을 이렇게 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 구하는 프로그램을 작성하시오.</p>
<h3 id="문제-접근-방법">문제 접근 방법</h3>
<p>DP 알고리즘으로 문제를 해결하기 위해서는 다음의 2 조건을 만족해야한다.</p>
<ol>
<li>큰 문제를 같은 구조의 작은 문제로 분해할 수 있다.</li>
<li>작은 문제의 최적의 해를 이용해서 큰 문제의 최적의 해를 구할 수 있다.</li>
</ol>
<p>위의 두 경우를 만족하면 문제를 점화식의 형태로 만들어 풀 수 있다.</p>
<p>점화식</p>
<ul>
<li>자연수 N의 제곱수의 합을 구하는 경우<ul>
<li>0보다 크고 N보다 작은 제곱수 j에 대해서<ul>
<li>j와 자연수(N - j)의 제곱수의 합중에서 가장 수가 적을때가 N의 제곱수이다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="코드">코드</h3>
<pre><code>package Java.Y22.M03.D06;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BJ1699_SumOfSquare {

    public static void main(String[] args) throws NumberFormatException, IOException {
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int[] dp = new int[N + 1];
        for(int i = 1; i &lt;= N; i++) {
            dp[i] = i;

            for(int j = 1; i - (j * j) &gt;= 0; j++) {
                if(dp[i] &gt; dp[i - (j * j)] + 1) dp[i] = dp[i - j * j] + 1;

            }
        }
        System.out.println(dp[N]);
    }

}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스와 쓰레드 개념 이론]]></title>
            <link>https://velog.io/@mac-10/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%93%B0%EB%A0%88%EB%93%9C-%EA%B0%9C%EB%85%90-%EC%9D%B4%EB%A1%A0</link>
            <guid>https://velog.io/@mac-10/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%93%B0%EB%A0%88%EB%93%9C-%EA%B0%9C%EB%85%90-%EC%9D%B4%EB%A1%A0</guid>
            <pubDate>Sat, 05 Mar 2022 14:37:33 GMT</pubDate>
            <description><![CDATA[<h3 id="프로세스와-쓰레드의-관계">프로세스와 쓰레드의 관계</h3>
<p>쓰레드와 프로세스는 동시성 프로그래밍의 가장 기본적인 실행 단위이다. 자바에서 동시성 프로그래밍은 대체로 쓰레드와 관련되어 있다. 하지만 프로세스 또한 중요하다.</p>
<p>보통 컴퓨터에는 많은 프로세스와 쓰레드들이 실행중이다. 심지어 코어가 하나뿐이어도 많은 프로세스와 쓰레드들이 실행중에 있으며, 최소한 하나의 쓰레드가 언제나 실행되고 있다.  싱글 코어의 처리되는 시간들은 많은 프로세스와 쓰레드들에 의해 공유되며, 이러한 운영체제의 기능을 타임 슬라이싱이라고 부른다.</p>
<p>점점 하나의 시스템에 더 많은 프로세서와 코어들이 들어가고 있으며, 이는 시스템이 한번에 감당할 수 있는 쓰레드와 프로세스의 양의 증가를 의미한다. 하지만 멀티코어나 많은 프로세서가 없는 간단한 시스템이어도 동시성 프로그램을 수행할 수 있다.</p>
<h3 id="프로세스">프로세스</h3>
<p>하나의 프로세스는 자신만의 실행 환경을 가지고 있다. 하나의 프로세스는 대체로 프로그램 실행을 자원을 모두 갖추고 있으며 이 자원들을 공유하지 않는다. 또한,  이를 위해서프로세스는 각각 메모리 공간을 할당 받는다.</p>
<p>프로세스는 자주 프로그램의 동의어 취급을 받는다. 하지만 때때로 하나로 보이는 프로그램이 여러 프로세스의 협업의 결과물일 수 있다  프로세스들간의 통신을 위해서 대부분의 운영체제들은 파이프나 소켓과 같은 IPC(Intel Process Communication)를 지원한다. 또한 IPC는 다른 시스템 간의 통신에 사용되기도 한다.</p>
<p>대부분의 JVM들은 단일 프로세스로 작동된다. 자바 어플리케이션은 ProcessBuilder를 이용해서 추가적인 프로세스를 만들어 낼 수 있다.</p>
<h2 id="threads"><strong>Threads</strong></h2>
<p>쓰레드는 때때로 경량 프로세스로 불리기도 한다. 프로세스와 쓰레드 모두 (프로그램을 위한) 실행 환견을 제공하지만, 쓰레드는 프로세스보다 적은 자원을 필요로한다.</p>
<p>쓰레드들은 하나의 프로세스 안에 존재한다. 다른 말로 모든 프로세스들은 적어도 하나의 쓰레드를 가지고 있다. 쓰레드들은 메모리와 파일들을 포함해서 프로세스의 자원들을 공유한다. 이는 효율적이지만 동시에 통신 문제를 일으킬 수 있다.</p>
<p>멀티 쓰레드는 자바 플랫폼의 중요한 기능이다. 어플리케이션 프로그래머의 입장에서 메모리 관리와 같은 시스템 쓰레드를 제외한다면, 모든 어플리케이션은 적어도 하나의 쓰레드를 가진다. 이 쓰레드가 메인 쓰레드이며, 메인 쓰레드는 추가적인 쓰레드를 만들어 낼 수 있다.</p>
<p><img src="https://images.velog.io/images/mac-10/post/fdcc8817-366f-428f-87af-07d74da5d4dd/Untitled.png" alt=""></p>
<h3 id="cs-스터디--노션-주소">CS 스터디 : <a href="https://www.notion.so/Template-388881be233c4d66a106ed21d2f8d854">노션 주소</a></h3>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://docs.oracle.com/javase/tutorial/essential/concurrency/procthread.html">Processes and Threads (The Java™ Tutorials &gt; Essential Java Classes &gt; Concurrency) (oracle.com)</a></li>
<li><a href="https://lazymankook.tistory.com/32">Multi Thread Programming (tistory.com)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[BJ1965 상자 넣기]]></title>
            <link>https://velog.io/@mac-10/BJ1965-%EC%83%81%EC%9E%90-%EB%84%A3%EA%B8%B0</link>
            <guid>https://velog.io/@mac-10/BJ1965-%EC%83%81%EC%9E%90-%EB%84%A3%EA%B8%B0</guid>
            <pubDate>Fri, 04 Mar 2022 14:59:33 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1965">https://www.acmicpc.net/problem/1965</a>
사용한 알고리즘 : DP
난이도 : 실버 2</p>
<h3 id="문제">문제</h3>
<p>앞의 상자의 크기가 뒤의 상자의 크기보다 작을 때, 앞의 상자를 뒤에 상자 안에 넣을 수 있다.</p>
<p>상자의 순서와 갯수가 주어질때, 한 번에 넣을 수 있는 최대의 상자 개수를 구하시오.</p>
<h3 id="문제-접근-방법">문제 접근 방법</h3>
<p>DP 알고리즘으로 문제를 해결하기 위해서는 다음의 2 조건을 만족해야한다.</p>
<ol>
<li>큰 문제를 같은 구조의 작은 문제로 분해할 수 있다.</li>
<li>작은 문제의 최적의 해를 이용해서 큰 문제의 최적의 해를 구할 수 있다.</li>
</ol>
<p>위의 두 경우를 만족하면 문제를 점화식의 형태로 만들어 풀 수 있다.</p>
<p>점화식</p>
<ul>
<li>N번에 위치한 상자에 담는 경우<ul>
<li>1번부터 N-1까지의 상자중에서 N번보다 크기가 작고 가장 많은 상자를 담은 상자를 N번 상자에 담는다.</li>
</ul>
</li>
</ul>
<h3 id="코드">코드</h3>
<pre><code>package Java.Y22.M03.D04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ1965_BoxInBox {

    public static void main(String[] args) throws NumberFormatException, IOException {
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];
        int[] dp = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 0; i &lt; N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            dp[i] = 0;
        }

        int answer = 0;
        for(int i = 1; i &lt; N; i++) {
            for(int j = 0; j &lt; i; j++) {
                if(arr[i] &lt;= arr[j]) continue;
                if(dp[i] &lt; dp[j] + 1) {
                    dp[i] = dp[j] + 1;
                }
            }

            if(dp[i] &gt; answer) answer = dp[i];
        }

        System.out.println(answer + 1);

    }

}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[BJ2579 계단 오르기]]></title>
            <link>https://velog.io/@mac-10/BJ2579-%EA%B3%84%EB%8B%A8-%EC%98%A4%EB%A5%B4%EA%B8%B0</link>
            <guid>https://velog.io/@mac-10/BJ2579-%EA%B3%84%EB%8B%A8-%EC%98%A4%EB%A5%B4%EA%B8%B0</guid>
            <pubDate>Fri, 04 Mar 2022 14:40:54 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/2579">https://www.acmicpc.net/problem/2579</a></p>
<p>사용한 알고리즘 : DP
난이도 : 실버 3</p>
<h3 id="문제">문제</h3>
<p>계단을 1개 밟을때 마다 계단에 적힌 숫자만큼 점수를 얻는다.
계단은 1칸 또는 2칸을 갈 수 있으며, 1칸은 연속해서 갈 수 없다.
마지막 계단은 꼭 밟아야한다.</p>
<p>이때 얻을 수 있는 최고 점수를 구하시오.</p>
<h3 id="문제-접근-방법">문제 접근 방법</h3>
<p>DP 알고리즘으로 문제를 해결하기 위해서는 다음의 2 조건을 만족해야한다.</p>
<ol>
<li>큰 문제를 같은 구조의 작은 문제로 분해할 수 있다.</li>
<li>작은 문제의 최적의 해를 이용해서 큰 문제의 최적의 해를 구할 수 있다.</li>
</ol>
<p>위의 두 경우를 만족하면 문제를 점화식의 형태로 만들어 풀 수 있다.</p>
<p>점화식</p>
<ol>
<li>2칸 건너서 N번 계단을 밟는 경우<ul>
<li>1칸 건너서 N-2번 계단을 밟는 경우 -- (0)</li>
<li>2칸 건너서 N-2번 계단을 밟는 경우 -- (1)</li>
<li>(0)과 (1) 둘중에서 더 큰 점수에 N번 계단의 점수를 더한 값</li>
</ul>
</li>
<li>1칸 건너서 N번 계단을 밟는 경우<ul>
<li>2칸 건너서 N-1 계단을 밟는 경우 -- (2)</li>
<li>(2)번 점수에 N번 계단의 점수를 더한 값</li>
</ul>
</li>
</ol>
<h3 id="코드">코드</h3>
<pre><code>package Java.Y22.M03.D04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BJ2579_StepUp {

    public static void main(String[] args) throws NumberFormatException, IOException {
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] step = new int[N + 1];
        int[][] dp = new int[N + 1][2];
        for(int i = 1; i &lt; N + 1; i++) {
            step[i] = Integer.parseInt(br.readLine());
        }

        int[][] next = new int[2][];
        next[0] = new int[]{0,1};
        next[1] = new int[]{0};

        int[] gap = {2, 1};

        dp[1][1] = step[1];

        if(N == 1) {
            System.out.println(step[1]);
            return;
        }

        dp[2][1] = dp[1][1] + step[2];
        dp[2][0] = step[2];

        for(int i = 1; i &lt; N; i++) {
            for(int j = 0; j &lt; 2; j++) {
                for(int nj : next[j]) {
                    if(i + gap[nj] &gt; N) continue;

                    if(dp[i + gap[nj]][nj] &lt; dp[i][j] + step[i + gap[nj]]) {
                        dp[i + gap[nj]][nj] = dp[i][j] + step[i + gap[nj]];
                    }
                }
            }
        }

        System.out.println(Integer.max(dp[N][0], dp[N][1]));

    }

}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[TIL]]></title>
            <link>https://velog.io/@mac-10/TIL-havjaybo</link>
            <guid>https://velog.io/@mac-10/TIL-havjaybo</guid>
            <pubDate>Thu, 03 Mar 2022 14:24:04 GMT</pubDate>
            <description><![CDATA[<h3 id="unity">Unity</h3>
<ul>
<li>AudioSource를 이용하면 인게임에서 오디오 파일을 실행할 수 있다.</li>
<li>AudioSource는 일종의 스피커 역할을 한다,</li>
</ul>
<h3 id="함수형-프로그래밍">함수형 프로그래밍</h3>
<ul>
<li>함수형 프로그래밍은 병렬처리에서 매우 효율적이다.</li>
<li>왜냐하면 함수형 프로그래밍은 순수함수라는 성질을 가지고 있기 때문이다.</li>
<li>병렬 처리시 주의해야 할 문제는 같은 자원에 여러 개의 접근이 동시에 일어나는 동시성 문제이다.</li>
<li>하지만  함수내부의 결과가 함수 외부에 영향을 주지 않기 때문에 같은 자원에 동시에 접근하는 동시성 문제를 해결할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래밍_전산_기타]]></title>
            <link>https://velog.io/@mac-10/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%A0%84%EC%82%B0%EA%B8%B0%ED%83%80</link>
            <guid>https://velog.io/@mac-10/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%A0%84%EC%82%B0%EA%B8%B0%ED%83%80</guid>
            <pubDate>Wed, 02 Mar 2022 13:21:10 GMT</pubDate>
            <description><![CDATA[<h3 id="데이터-타입과-변수의-차이는-무엇인가요">데이터 타입과 변수의 차이는 무엇인가요?</h3>
<p>변수란 값이 위치하고 있는 메모리 주소(Memory address)에 접근하기 위해 사람이 이해할 수 있는 언어로 명명한 식별자(identifier)</p>
<p>메모리에 값을 저장하기 위해서는 먼저 메모리 공간을 확보해야 할 메모리의 크기(<a href="https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8">byte</a>
)를 알아야한다. 이는 값의 종류에 따라 확보해야 할 메모리의 크기가 다르기 때문이다. 이때 값의 종류, 즉 데이터의 종류를 데이터 타입(Data Type)이라 한다.</p>
<h3 id="함수형-프로그래밍에-대해서-설명해-주세요">함수형 프로그래밍에 대해서 설명해 주세요.</h3>
<p>함수형 프로그래밍은 선언형 프로그래밍의 한 종류로 순수 함수들을 조합하여 프로그램을 만들어가는 방식입니다.</p>
<p>#순수함수 </p>
<ol>
<li>동일한 입력에 대해서 항상 같은 값을 반환할것</li>
<li>함수의 실행이 함수 외부에 영향을 미치지 않을것</li>
</ol>
<p>불변성</p>
<ol>
<li>원본 데이터를 변경하지 않고, 필요한 경우 복사본을 이용한는 성질</li>
</ol>
<p>함수형 프로그래밍의 장단점</p>
<p>장점 </p>
<ol>
<li>높은 수준의 추상화</li>
<li>함수 단위의 재사용이 수월하다</li>
<li>불변성을 지향하기 때문에 동작을 예측하기 쉽다.</li>
</ol>
<p>단점</p>
<ol>
<li>순수함수를 구현하기 위해서는 코드의 가독성이 떨어질 수 있다.</li>
<li>반복문을 위해서 재귀문을 사용하기 때문에 무한 루프에 빠지기 쉽다.</li>
<li>순수함수의 사용은 쉽지만 조합은 어렵다.</li>
</ol>
<h3 id="aop란-무엇인가요">AOP란 무엇인가요?</h3>
<p>Aspect Oriented Programming의 약자로  Spring에서는 다음과 같이 설명하고 있다.</p>
<blockquote>
<p>AOP는 프로그램 구조에 대해서 새로운 시점을 제시하여 OOP를 보완한다. 
...
Aspect 개념을 통해서 트랜잭션 관리와 같이 여러 타입과 객체들에 퍼져있는 기능들을 모듈화할 수 있다.</p>
</blockquote>
<p>AOP를 통해서 공통된 기능들을 모듈화 하고 재사용 및 유지보수를 향상시킬 수 있다.</p>
<h3 id="컴파일러와-인터프리터의-차이는-무엇인가요">컴파일러와 인터프리터의 차이는 무엇인가요?</h3>
<p>인터프리터는 코드를 명령어 단위로  기계어로 변환하고 실행합니다. 그래서 컴파일러보다 디버깅이 쉽습니다.</p>
<p>컴파일러는 기계어를 실행하기 전에 모든 코드를 기계어로 변환합니다.  컴파일로 만들어진 프로그램은 인터프리터보다 비교적 빠르게 작동합니다.</p>
<h3 id="1급-객체에-대해서-설명해-주세요">1급 객체에 대해서 설명해 주세요.</h3>
<p>1급 객체란 사용에 있어서 제한이 없는 객체를 의미한다. 1급 객체는 다음과 같은 권한과 자유를 가진다.</p>
<ul>
<li>변수에 저장 가능하다.</li>
<li>매개변수로 전달이 가능하다.</li>
<li>리턴 값으로 반환이 가능하다.</li>
<li>데이터 구조체에 포함될 수 있다.</li>
</ul>
<h2 id="면접-질문-참고">면접 질문 참고</h2>
<p><a href="https://velog.io/@hygoogi/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%AA%A8%EC%9D%8C">기술 면접 질문 모음 by hygoogi</a></p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://stackoverflow.com/questions/245192/what-are-first-class-objects">python - What are &quot;first-class&quot; objects? - Stack Overflow</a> answered by <a href="https://stackoverflow.com/users/18770/federico-a-ramponi">Federico A. Ramponi</a></li>
<li><a href="https://velog.io/@kyusung/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9A%94%EC%95%BD">함수형 프로그래밍 요약 (velog.io)</a></li>
<li><a href="https://jongminfire.dev/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80">함수형 프로그래밍이란? | JONGMINFIRE.DEV</a></li>
<li><a href="https://docs.spring.io/spring-framework/docs/2.5.x/reference/aop.html">Chapter 6. Aspect Oriented Programming with Spring</a></li>
<li><a href="https://poiemaweb.com/js-data-type-variable">Data type &amp; Variable | PoiemaWeb</a></li>
<li><a href="https://www.bbc.co.uk/bitesize/guides/zgmpr82/revision/2">Assemblers, compilers and interpreters - Programming software and the IDE - GCSE Computer Science Revision - BBC Bitesize</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL ]]></title>
            <link>https://velog.io/@mac-10/TIL</link>
            <guid>https://velog.io/@mac-10/TIL</guid>
            <pubDate>Wed, 02 Mar 2022 11:14:33 GMT</pubDate>
            <description><![CDATA[<h2 id="unity">Unity</h2>
<h3 id="ui--unityengineui">UI : UnityEngine.UI</h3>
<ol>
<li>UI객체는 캔버스 객체 안에 위치한다.</li>
<li>UI는 Transform대신에 Rect Transform을 사용한다.</li>
<li>Rect Transform을 사용하여 화면에 상대적으로 UI 객체를 위치시킬 수 있다.</li>
<li>UI를 배치시키는 기준은 Anchor이며 앵커의 min, max 값을 수정하여 점, 선, 면의 형태로 지정해 줄 수 있다.</li>
<li>Button을 클릭하면 OnClick에 지정된 함수가 실행된다.</li>
<li>Button 객체에 함수를 지정하기 위해서는 <ol>
<li>클릭시 실행할 함수를 담고 있는 객체와 스크립트를 만든다.</li>
<li>해당 객체를 버튼의 OnClick 안에 넣는다.</li>
<li>버튼의 OnClick안에서 추가한 스크립트.함수를 선택한다.</li>
</ol>
</li>
</ol>
<h3 id="collider와-충돌">Collider와 충돌</h3>
<ol>
<li>Collider는 게임 인스턴스간의  충돌 경계를 나눈다.</li>
<li>Collision은 다른 Collider와 충돌시 물리 법칙이 적용되며, OnCollision 함수를 호출한다.</li>
<li>Trigger는 다른 Collider와 출동해도 물리 법칙이 적용되지 않으며, OnTrigger 함수를 호출한다.</li>
</ol>
<h3 id="scenemanager--unityenginescenemanagement">SceneManager : UnityEngine.SceneManagement</h3>
<ol>
<li>SceneManager.LoadScene()을 통해서 다른 씬으로 넘어갈 수 있다.</li>
<li>LoadScene()에 넘어갈 씬의 이름 또는 씬의 순서를 매개변수로 넘겨주어야한다.</li>
<li>LoadScene에서 사용할 씬은 BuildandRun에 미리 추가해두어야 한다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체지향 정리]]></title>
            <link>https://velog.io/@mac-10/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@mac-10/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 28 Feb 2022 13:32:49 GMT</pubDate>
            <description><![CDATA[<h3 id="객체지향이-무엇인가요-절차지향과의-차이점은-뭐죠">객체지향이 무엇인가요? 절차지향과의 차이점은 뭐죠?</h3>
<p>오라클에서는 객체지향 프로그래밍에 대해서 다음과 같이 정의하고 있다.</p>
<blockquote>
<p>객체지향 프로그래밍은 클래스간의 구조와 상호작용하고 잘 정의된 객체들을 기반으로하는 프로그래밍 도구이다.</p>
</blockquote>
<p>또한 클래스와 객체에 대해서는 다음과 같이 정의하고 있다.</p>
<blockquote>
<p>클래스는 데이터와 데이터를 처리하는 메소드들을 정의한 구조체이다.</p>
</blockquote>
<blockquote>
<p>객체는 클래스의 실행가능한 복제품이다.</p>
</blockquote>
<p>지원하는 기능과 특징의 차이점</p>
<ol>
<li>캡슐화,다형성,클래스 상속을 지원하는가?</li>
<li>데이터 접근 제한을 걸 수 있는가?</li>
</ol>
<aside>
💡 객체지향은 코드의 재사용성이 높고, 유지보수가 용이하다는 점이 이점이다.

</aside>

<p>객체지향 프로그래밍은 절차적 프로그래밍의 한 종류이다. 객체지향 프로그래밍과 절차적 프로그래밍의 차이점은 데이터와 함수의 결합도를 정하는 것에 있다.</p>
<ul>
<li>순수한 절차적 프로그래밍의 경우 모든 데이터와 함수 사이의 결합도를 가능한 낮은 상태로 유지하는 방식이다.</li>
<li>반면에 객체 지향 프로그래밍의 경우 데이터가 관련된 함수들의 모음을 가지는 방식이다.</li>
</ul>
<p>가령 문제 해결을 위해서 사용하는 자료구조가 리스트나 트리의 형태를 가진다면, 절차적 프로그래밍이 적합하다.  왜냐하면 데이터와 함수의 결합도가 낮을 수록 함수를 재사용하기 편하기 때문이다.</p>
<p>반면에 다루는 데이터가 구조화되어 있다면(그래서 높은 결합도를 가지고 있다면) 객체 지향 프로그래밍이 좀 더 적합하다. 왜냐하면 각각의 구조화된 데이터에 맞는 메소드를 구현하고, 외부에서 데이터에 직접 접근하는 대신에 메소드를 통해 간접적으로 접근하여, 외부와 구조화된 데이터 사이의 결합도를 낮출 수 있다.(캡슐화)</p>
<h3 id="객체지향-solid-원칙에-대해서-설명해-주세요">객체지향 SOLID 원칙에 대해서 설명해 주세요.</h3>
<p>SOLID 원칙은 객체지향 프로그래밍에서 클래스를 디자인하기 위한 5가지 원칙이다.  2000년에 Robert J. Martin에 의해서 처음으로 제시되었으며, SOLID 원칙의 내용은 다음과 같다.</p>
<ol>
<li>Single responsibility principle (단일 책임 원칙) : 하나의 클래스는 하나의 기능을 가져야 한다. 결합도(Coupling)은 낮추고 응집도(Cohesion)은 높여야 한다.</li>
<li>Open-closed principle (개발 폐쇄 원칙) : 클래스는 수정없이 확장할 수 있어야 한다. </li>
<li>Liskov substitution principle (리스코프 치환 원칙) : 자식 클래스는 내려받은 부모클래스의 기능을 그대로 수행할 수 있어야한다.</li>
<li>Interface Segregation principle (인터페이스 분리 원칙) : 다양한 기능을 가지는 다목적 인터페이스보다 특정 기능만 가지는 인터페이스가 좋으며, 클래스에 필요한 인터페이스만 implement해야한다.</li>
<li>Dependency Inversion principle (의존 역전 원칙) : 클래스는 다른 클래스에 직접 의존하기 보다, 인터페이스나 추상 클래스에 의존해야한다. 
ex ) (X) class A = object, (O) interface A = object</li>
</ol>
<p>2번 원칙이 객체지향의 목표라면, 5번 원칙은 2번을 위한 가장 중요한 기능이다.</p>
<h3 id="객체지향-4가지-특징에-대해서-설명해-주세요">객체지향 4가지 특징에 대해서 설명해 주세요.</h3>
<p>객체지향의 4가지 특징은 다음과 같습니다.</p>
<ol>
<li>캡슐화 : 캡슐화(encapsulation)는 사용자들에게 해당 객체의 기능(서비스)과 사용법만 제공하고 내부는 감추어(변경할 수 없게 함) 쉽게 사용할 수 있게 하는 개념.  데이터 무결성,  결합도를 낮츠고 응집도를 높힌다,  재사용하기 좋다.</li>
<li>상속: 클래스 간의 관계를 계층화하고 분류하는데 이런 개념. 코드의 가독성을 높힌다. 재사용성이 커진다. 확장이 용이하다. 유지보수에 좋다.</li>
<li>다형성: 동일한 메서드 이름을 사용하지만 메서드에 대해 클래스마다 모두 다르게 구현되는 개념. 오버라이딩과 오버로딩</li>
<li>추상화: 객체들의 공통점을 뽑아 클래스, 인터페이스라는 이름을 붙여놓은 것.</li>
</ol>
<h3 id="대표적인-객체지향-언어에는-어떤-것들이-있나요">대표적인 객체지향 언어에는 어떤 것들이 있나요?</h3>
<p>가장 많이 사용하는 언어로 파이썬과 자바, C++이 있습니다.</p>
<h2 id="면접-질문-참고">면접 질문 참고</h2>
<p><a href="https://velog.io/@hygoogi/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%AA%A8%EC%9D%8C">https://velog.io/@hygoogi/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%AA%A8%EC%9D%8C</a></p>
<h2 id="reference">Reference</h2>
<ol>
<li><a href="https://www.oracle.com/java/technologies/oop.html">Lesson 8: Object-Oriented Programming (oracle.com)</a></li>
<li><a href="https://stackoverflow.com/questions/552336/oop-vs-functional-programming-vs-procedural?noredirect=1&amp;lq=1">OOP vs Functional Programming vs Procedural - Stack Overflow</a></li>
<li><a href="https://www.freecodecamp.org/news/solid-principles-explained-in-plain-english/">The SOLID Principles of Object-Oriented Programming Explained in Plain English (freecodecamp.org)</a></li>
<li><a href="https://terms.naver.com/list.naver?cid=58528&amp;categoryId=58528&amp;so=st4.asc">쉽게 배우는 소프트웨어 공학 : 네이버 지식백과 (naver.com)</a></li>
<li>자바의 정석</li>
<li><a href="https://ktae23.tistory.com/163">https://ktae23.tistory.com/163</a></li>
<li><a href="https://namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D#s-3.1">https://namu.wiki/w/객체 지향 프로그래밍#s-3.1</a></li>
</ol>
]]></description>
        </item>
    </channel>
</rss>