본문으로 바로가기


C언어와 C++언어의 차이점에 대해 설명해보아라
데니스리치가 개발한 언어로 인간의 명령어를 컴퓨터가 이해할 수 있도록 기계어로 변환해주는 역할을 하는 프로그램이다.
C++은 C언어를 확장시킨 언어이며 C는 절차지향 패턴을 따르는 반면 C++은 객체지향 패턴을 따르고 있다.
C언어에서는 같은 이름을 가진 함수가 존재할 수 없지만, C++에서는 가능하다.(오버로딩, 오버라이딩)
C언어에서는 변수, 함수를 초기에 작성해야 하지만, C++에서는 중간에 어디서든 선언이 가능하다.

자신이 알고 있는 언어에 대해서 모두 얘기해보아라
저급어 : C
중급어 : C++
고급어 : C#, Java
기타 : Python, NodeJS

클래스와 구조체의 차이점
구조체는 하나의 구조로 묶일수 있는 데이터, 즉 변수들의 집합
클래스는 변수 뿐만 아니라 함수(메서드)까지 포함시킬 수 있다는 점.
하지만 C에서도 함수포인터를 이용해 구조체를 클래스화 시킬수 있다.

OOP(객체지향)에 대해서 설명하고 절차지향 프로그래밍과의 차이점에 대해서 설명해보아라
절차지향,구조적 프로그래밍(C) : 초창기에 많이 사용한 방법으로 순차적 프로그래밍이라고도 한다. 해야할 작업을 순서대로 코딩을 한다. 구조적 프로그래밍에서는 함수 단위로 구성되며 기능별로 묶어놓은 특징이 있다.
객체지향 프로그래밍(Java, C++, C#) : 주 구성요소는 클래스와 객체이다. 그리고 상속과 다형성을 특징으로 들 수 있다. 클래스를 활용하여 각각의 기능별로 구성이 가능하며, 이를 나중에 하나로 합쳐서 프로그램의 완성이 가능하다. 객체 별로 개발이 가능하기에 팀 프로젝트를 하기에도 유리한 장점을 가지고 있다. 또한 코드의 재사용이 가능하며, 오류 발생 가능성이 적고 안정성이 높다.
예를 들면 물건을 파는 판매자와 사는 구매자가 있다고 하자. 그렇다면 “판매자”와 “구매자”는 서로 다른 객체인 것이다. 즉, 객체지향에서의 클래스는 어떠한 ‘행동’을 하는 사람이라고 생각하며 구현해야한다. 이래도 이해가 되지 않는다면 객체는 작은 프로그램이라고 생각해도 된다. 즉, 프로그램에서 필요한 행위들을일반화 시켜서 객체로 만들고 이 객체를 사용하는 형태로 프로그래밍을 하는 것.

스크립트 언어와 컴파일 언어를 나열하고 차이점을 설명해보아라
스크립트 언어 : JavaScript, Python, Ruby...
컴파일 언어 : C, C++, C#, Java...
차이점 : 컴파일러의 존재 여부
컴파일 언어의 경우 컴파일러를 통해서 한번 컴파일 된 후에는 코드 수정 후 재 컴파일을 하기 전까지는 같은 결과를 나타내지만, 스크립트 언어의 경우 실행될 때 바로 해석하므로 코드 변경시 실행 할 때마다 결과가 바뀌게 된다.

프로세스와 스레드의 차이를 설명해보아라
프로세스 : 실행중인 프로그램을 나타낸다. 이는 CPU가 실행되고 있는 프로세스에 대해서 메모리 자원을 안정되게 분배해줘야 하며 이는 운영체제의 성능에 따라 결정된다.
스레드 : 하나의 프로세스 내에서 할당 받은 자원을 공유하며 실행되는 독립적인 작업단위이다. 즉, 스레드는 각자의 스택 메모리영역을 가지고 있으며 동일한 프로세스 내의 다른 스레드들과 전역 메모리를 공유한다. 따라서 CPU로부터 새로운 자원을 할당받지 않아도 되기 때문에 프로세스보다 실행 속도가 빠르다는 장점을 가지고 있다.

프로세스와 스레드의 차이를 설명해보아라
프로세스 : 실행중인 프로그램을 나타낸다. 이는 CPU가 실행되고 있는 프로세스에 대해서 메모리 자원을 안정되게 분배해줘야 하며 이는 운영체제의 성능에 따라 결정된다.
스레드 : 하나의 프로세스 내에서 할당 받은 자원을 공유하며 실행되는 독립적인 작업단위이다. 즉, 스레드는 각자의 스택 메모리영역을 가지고 있으며 동일한 프로세스 내의 다른 스레드들과 전역 메모리를 공유한다. 따라서 CPU로부터 새로운 자원을 할당받지 않아도 되기 때문에 프로세스보다 실행 속도가 빠르다는 장점을 가지고 있다.

스레드를 생성하는 방법과 스레드의 장/단점에 대해 설명해보아라
생성방법 : Runnable(인터페이스)로 선언되어 있는 클래스를 상속받거나 Thread 클래스를 상속받아 run()메서드를 구현해주면 된다.
장점 : 빠른 프로세스 생성, 적은 메모리 사용, 쉬운 정보 공유
단점 : 교착 상태에 빠질 수 있다.
 교착 상태(膠着狀態, 영어: deadlock)란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 가리킨다. 
 예를 들어 하나의 사다리가 있고, 두 명의 사람이 각각 사다리의 위쪽과 아래쪽에 있다고 가정한다. 이때 아래에 있는 사람은 위로 올라 가려고 하고, 위에 있는 사람은 아래로 내려오려고 한다면, 두 사람은 서로 상대방이 사다리에서 비켜줄 때까지 하염없이 기다리고 있을 것이고 결과적으로 아무도 사다리를 내려오거나 올라가지 못하게 되듯이, 전산학에서 교착 상태란 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다. 이 문제를 해결하는 일반적인 방법은 아직 없는 상태이다.

동기화란 무엇이며 어떠한 경우에 사용하는가?
다중 스레드에서 하나의 자료에 접근할 때 사용한다(static으로 선언되어 있거나 배열에 접근하는 경우)
예를 들면, 은행계좌에 있는 돈에 대하여 동시에 출금 요청(접근)이 가능하다면 한 쪽에서 출금 처리가 완료되기 전에 다른 쪽에서 출금을 요청하면 출금이 될 수 있기 때문에 반드시 동기화 처리를 해서 작업이 일어나는 중에는 다른 쪽에서의 접근을 막아주어야 한다.

포인터의 개념에 대해 설명하고 이해할 수 있도록 풀어서 설명해보아라
포인터란 메모리 주소를 저장하는 변수이다.
예를 들면 주소를 지칭하고 있는 곳이다. 엘리베이터에서 포인터는 해당 층을 표시하는 버튼이며, 10층 버튼을 누르면 10층으로 이동하듯이 해당 위치를 가리키고 있는 변수이다.
포인터를 사용할 때 주의할 점은 어떠한 주소를 가리키고 있어야 사용이 가능하다.

변수들이 메모리에 저장되는 영역에 대해서 설명해보아라
영역 1
Code 영역 : 함수, 제어문, 상수 등등 함수에 대한 기계어 코드가 들어감
Data 영역 : 초기값 있는 전역변수, 배열, static으로 선언된 변수가 들어감
Bss 영역 : 초기값 없는 전역변수, 배열, static으로 선언된 변수가 들어감, Compile time에 크기가 결정되고 이후로 변동되지 않는다.
영역 2
Heap 영역 : 동적할당(malloc)으로 할당된 변수가 들어감. 프로그래머 영역.
Stack 영역 : 지역변수, 블록내에서 할당된 변수가 들어감. 블록을 벗어나면 사라짐
Run time에 Bss와 Heap사이를 기준으로 해서 Heap은 아래로 순차적으로 메모리를 사용하고 Stack은 위쪽으로 순차적으로 메모리를 사용한다

포인터의 개념에 대해 설명하고 이해할 수 있도록 풀어서 설명해보아라
포인터란 메모리 주소를 저장하는 변수이다.
예를 들면 주소를 지칭하고 있는 곳이다. 엘리베이터에서 포인터는 해당 층을 표시하는 버튼이며, 10층 버튼을 누르면 10층으로 이동하듯이 해당 위치를 가리키고 있는 변수이다.
포인터를 사용할 때 주의할 점은 어떠한 주소를 가리키고 있어야 사용이 가능하다.

Call by reference와 Call by value 방식의 차이점에 대해 설명하시오
Call by reference : 매개변수로 원래 주소 값을 전달하는 방식, 자바에서는 객체를 매개변수로 전달하였을 경우에 해당한다.
Call by value : 매개변수로 기본 데이터 형을 사용한다. 주어진 값을 복사하여 처리하는 방식으로 함수 내의 처리결과는 함수 밖의 변수에는 영향을 미치지 않는다.(예 : C언어의 Swap())

Overloading과 Overriding의 차이점에 대해 설명하시오
Overloading : 같은 이름의 메서드를 여러개 정의하는 것. 단, 매개변수의 타입이 다르거나, 갯수가 달라야한다. 리턴 타입이나 접근 제어자는 영향을 주지 않는다.
Overriding : 상속에서 나온 개념. 클래스를 메서드의 하위 클래스에서 재정의 하는 것을 의미한다.

상속에 대해 설명하시오
상속은 기존의 클래스를 토대로 해서 새로운 클래스를 만드는 방법이라고 할 수 있다.
클래스 A가 클래스 B를 상속받게 만들면 클래스 B는 “부모 클래스”가 되고, 클래스 A는 “자식 클래스”가 된다.
is-a 관계가 성립되어야한다(~은 ~이다.) 예를 들어 사람과 학생의 관계를 생각해보자(Person-Student)
Person is a student : “사람”은 “학생”이다. 이것은 성립이 X. 모든 사람이 학생일수는 X.
Student is a person : “학생”은 “사람”이다. 이것은 성립이 O. 그래서 우리가 상속 클래스를 만들 때, Student 클래스는 자식클래스로 Person 클래스를 상속할 수 있는 것이다.
부모 클래스는 자식 클래스에게 자신의 모든 멤버 변수와 함수를 물려준다. 물론 OOP에서는 물질적인 것 뿐만 아니라, 어떤 기본적인 사람의 특성들도 상속의 특성이 될 수 있다.
상속받는 클래스를 만들기 위해서 class Student : public [상속할 클래스 이름] 이런식으로 상속이라는 문법을 사용할 수 있다. 상속을 사용한 프로그램은 메모리 공간 할당 -> 부모 클래스의 생성자 실행 -> 자식 클래스의 생성자 실행이라는 순서를 가지게 된다.

Abstract Class(추상 클래스)에 대해 설명하시오
추상메서드를 하나 이상 가진 클래스이다.
자신의 생성자로 객체 생성이 불가능하다. 그 이유는 몸체도 정의되어 있지 않은 추상  클래스의 객체를 만든다는 것은 아무런 의미가 없기 때문. 하지만 추상 클래스의 포인터는 선언이 가능하다.
순수가상함수가 하나라도 선언되어있다면 그 클래스는 추상 클래스.
하위 클래스를 참조하여 상위 클래스의 객체를 생성한다.
하위 클래스를 제어하기 위해 사용한다.

Interface(인터페이스)에 대해 설명하시오
일종의 추상 클래스이다.
오직 추상메서드와 상수만을 멤버로 갖는다.
상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있도록 한다.

다형성에 대해 설명하시오
서로 다른 객체가 동일한 메시지에 대하여 서로 다른 방법으로 응답할 수 있는 기능. 즉, 같은 메서드 호출에 대해 서로 다른 방법으로 응답을 하게 되는 것. (상속에서 효과를 발휘함)
예를 들면 Figure 클래스를 상속하는 Triangle, Square, Circle 클래스가 있다. Figure 클래스는 하위 클래스에서 모형을 그리는데 사용하는 draw 메서드를 가지고 있지만 실제 도형을 그리는 함수 구현 부분을 정의할 수가 없다. 그 이유는 Figure의 하위 클래스인 Triangle, Square, Circle 클래스마다 그리는 방법이 다르기 때문이다. 객체지향에서는 이러한 경우 Figure 클래스를 추상 클래스로 정의 하고 draw 함수 역시 추상 메서드라 정의하여 상속받은 자식클래스에서 새롭게 정의를 내린다.

가상함수와 순수가상함수의 차이점 (virtual void func(); 와 virtual void func() = 0;)
객체포인터 변수에 부모클래스와 자식클래스를 담았을 때 오버라이딩된 함수를 실행하게되면 무조건 부모함수를 실행하게된다. 자식클래스에서 재정의한 의미가 없어짐. 그렇기 때문에 virtual이라는 키워드를 사용하여 가상함수로 만들게 된다면 객체포인터 변수에서 각각 해당하는 클래스의 함수를 호출하게 됨.
만약 부모클래스에서 재정의 할 함수 앞에 virtual 키워드를 사용하면 자식클래스는 키워드를 적지 않아도 컴파일러에서 자동으로 가상 함수로 정의가 된다. 하지만 소스 코드의 이해를 돕기 위해 자식클래스에서도virtual 키워드를 적는 것이 관례.
순수가상함수는 가상함수와 달리 함수의 선언만 있고 정의는 없는것으로, 자식 클래스에서 반드시 재정의하여야만 한다. 재정의 하지 않는다면 오류 발생. 예를 들면 동물은 먹는다, 잔다, 울다 등의 행동을 가지고 있기 때문에 동물 클래스를 상속받는 자식클래스들은 항상 이 행위들을 가지고 있어야 한다. 개는 멍멍, 고양이는 야옹 등등

Virtual table (가상 테이블)에 대해서 설명하시오
클래스 안에 가상함수가 포함되어 있을시 객체를 생성할 때 가상함수를 가리키는 포인터가 생성된다.
이 포인터는 가상테이블의 시작주소를 가리키는 포인터고, 각 클래스마다 하나의 고유 가상테이블이 생성되게 됩니다.
고유의 가상테이블은 가상함수를 가리키는 함수포인터배열로 되어있다. 즉, 가상 함수를 실행하려면 vptr-> vtable -> func() 를 호출하게 되는 것

재귀함수에 대해 설명하시오
재귀함수란 함수 내에서 자기 자신을 다시 호출하는 형태
장점 : 소스코드의 간결화가 가능하다.
단점 : 연산 시간이 오래 걸린다. 또한, 잘못 작성시 프로그램이 무한루프에 빠질 수 있다.

디자인패턴을 사용하는 이유에 대해서 설명하시오
디자인패턴이라 여러 프로그래머들의 경험과 지혜를 모아서 공통적인 소프트웨어 디자인 문제를 해결하는데 도움이 될수 있게 만들어 놓은 것
가장 대표적인 디자인패턴으로는 싱글톤이 존재. 싱글톤이란 전체 프로그램에서 단 1개의 객체를 생성하고 공유하는데 사용하는 패턴이다. 주로 Android에서 소켓 객체를 사용할 때 사용한다.

UML이란?
Unified Modeling Language의 약자로 ‘객체 모델링 언어’ 또는 ‘통합 모델링 언어’를 뜻한다.
시스템 설계, 요구분석, 시스템 구현 등의 과정에서 사용되는 모델링 언어로 표기법의 표준화를 목적으로 한다.
시스템에 대해 동일한 의미를 공유할 수 있게 하여 언어를 가시화 시킬 수 있고 시스템 구조와 모든 상세 내역에 대해 문서화하여 모델링하는 기능들을 제공하며, 다양한 모델링 도구로서의 다이어그램들로 이루어져 있다.

UML Diagram의 종류에 대해 나열하고 설명해보아라
클래스 다이어그램 : 클래스 별로 연관관계를 나타내는 다이어그램
유즈케이스 다이어그램 : 행위자(Actor)와 UseCase로 구분되어 그려진다.
상태 다이어그램 : 현재 상태를 나타내는 다이어그램
시퀀스 다이어그램 : 시간의 흐름에 따라서 나타내는 다이어그램
액티비티 다이어그램 : 처리과정, 수행되는 동안 일어나는 일을 나타낸다.

프로젝트 관리 모형 종류에 대해 나열하고 설명해보아라
폭포수 : 각 단계를 확실히 매듭 짓고 그 결과를 철저하게 검토 후 승인, 이전 단계로 돌아가기 어려움으로 확실하게 검토해야 함
프로토타입 : 사용자의 요구 사항을 정확히 파악하고 결과물을 예측하여 만들어내는 모형물, 사용자에게 미리 보여줄 수 있지만 결과물과 조금 다를 수도 있고 단기간에 만들어야 한다.
나선형 모델 : 가장 현실적인 모형으로 비교적 최신형태이다. 점진적으로 개발 과정이 순환하며 진행된다.

아키텍처란?
소프트웨어의 관점에서 본 하드웨어의 논리 규격을 나타낸다. 기능적 물리적 구조를 표현한다.

프레임워크란?
특정 형태의 소프트웨어 문제를 해결하기 위해 상호 협력하는 클래스 프레임과 인터페이스 프레임의 집합
특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성되며, 컴포턴트들은 재사용이 가능하다.
스켈레톤 코드라고도 불리는데, 특정한 틀을 만들어놓고 거기에 살을 붙여 놓음으로써 프로그램을 만들어 작업 시간을 줄여주는 것이다.
장점 : 개발 시간을 줄일 수 있고, 오류로부터 자유로울 수 있다.
단점 : 프레임워크에 너무 의존하면 개발 능력이 떨어져서 프레임워크 없이 개발하는 것이 불가능해질 수 있다.

Java의 특징
자바가상머신(JVM)만 설치하면 컴퓨터의 운영체제에 상관없이 작동한다. 즉, 플랫폼에 독립적이다.
기본 자료형을 제외한 모든 요소들이 객체로 표현 가능하다.
객체지향개념의 특징인 캡슐화, 상속, 다형성이 잘 적용되어 있는 언어이다.
Garbage Collecot가 메모리를 알아서 관리해준다. (Garbage Collection을 수행)
멀티쓰레드를 지원한다.


계속 수정 및 추가 중입니다.


<추가 예정> 
예시 소스