초급
1. 포인터란?
- 어떠한 값의 주소를 저장하는 변수
- 4바이트의 주소만 가지기 때문에 복사가 일어나지 않아 속도가 빠르다.
- 주소를 컨트롤 하기 때문에 원본에 대한 값의 변경이 쉽다.
- but 주소를 직접 변경하기 때문에 예외처리를 확실하게 하지않으면 의도치 않게 원본 값이 수정 될 수 있다.
int *p = NULL;
int num = 15;
p = #
2. 컴파일 언어와 인터프리터 언어의 차이점
2-1. 컴파일 언어
- 원시코드->기계어로 변환 후 -> 기계 -> 기계어 코드로 실행
- 소스코드를 기계어로 번역하는 과정에서 인터프리터 언어에 비해 시간이 소요 되지만 런타임 상황에서는 빠르게 실행 할 수 있다.
ex) C, C++
2-2. 인터프리터 언어
- 기계어로 변환하는 과정 없이 한줄씩 해석하여 바로 명령어를 실행하는 언어
- 바로 실행으로 컴파일 언어에 비해 빠르다.
ex) python
3. 컴퓨터의 문자열 처리 방법
표준화된 코드 체계를 사용하여 컴퓨터, 프로그램 간에 데이터를 저장하고 교환할 수 있게 됐다.
-컴퓨터의 기본 저장 단위는 바이트(byte)이다.
-1byte = 8bit
-1byte(8bit) -> 256개의 고유값을 저장 할 수 있다.
3-1. 아스키 코드(ASCII)
- 각 문자를 나타내는 7비트와 통신 에러 검출을 확인하기 위한 오류 검사비트 1개를 붙여 총 8비트로 구성
- 128개의 문자를 나타낼 수 있다.
3-2. 유니코드(Uni code)
- 16비트로 구성되어 최대 65,536개까지 표현 할 수 있다.
4.Call by value 와 Call by reference의 차이점
1.Call by value(값에 의한 호출)
- 인자로 받은 값을 복사하여 처리한다.
-장점 : 복사하여 처리하기 때문에 원본 값이 안전하다.
-단점 : 복사하기 때문에 메모리 사용량이 늘어난다.
2.Call by reference(참조에 의한 호출)
- 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다.
-장점 : 복사하지 않고 참조하기 때문에 빠르다.
-단점 : 참조하기 때문에 원본 값이 영향을 받는다.
5. 예외처리란?
-에러(error) : 발생 시 수습할 수 없는 심각한 오류
-예외(exception) : 예외 처리를 통해 수습할 수 있는 덜 심각한 오류
프로그램 실행 시 발생할 수 있는 예외에 대비하는 것으로 프로그램 비정상종료를 막고 실행 상태를 유지하는 것
try:
...
except 발생 오류1 as [오류 별칭]:
...
except 발생 오류2 as [오류 별칭]:
...
finally:
...
6. 재귀 함수란?
함수 안에서 함수 자기자신을 호출하는 방식
function factorial(n){
if(n==1){ // 이 조건으로 멈출 수 있다.
return 1;
}
return n * factorial(n-1); //함수 자기 자신을 다시 호출한다.
}
console.log(factorial(5));
7. 클래스와 객체, 인스턴스의 차이점
- 클래스 : 객체를 만들어 내기 위한 설계도 혹은 툴, 연관되어 있는 변수와 메서드의 집합
- 객체 : 클래스를 사용하여 클래스 타입의 객체를 선언
- 인스턴트 : 객체가 메모리에 할당되어 실제 사용될 때
o 붕어빵 틀 = Class o 붕어빵 = 객체(Object)
o 붕어빵을 굽다 = 인스턴스(Instance)화 하다
o 만들어진 각각의 붕어빵 = Instance
/* 클래스 */
public class Animal {
...
}
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // '객체'
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
중급
1. 메모리 구조에서 스택과 힙의 차이점
1.스택(Stack)
- 매개 변수, 지역 변수, 함수(메서드)들이 할당되는 LIFO(Lasr in First Out)방식으로 메모리 사용이 끝나면 바로 소멸되며 컴파일 시메모리에 할당 된다.
- CPU가 스택 메모리를 효율적으로 관리하기 때문에 스택 변수를 읽고 쓰는 속도가 빠르다.
2. 힙(Heap)
- new 연산자를 통한 동적 할당된 객체들이 저장되며, 가비지 컬렉션에 의해 메모리가 관리 되어진다.
- 호출이 끝나도 사라지지 않으며 프로그램 실행시 동적으로 할당된다.
- 힙 메모리는 포인터를 사용하여 힙의 메모리 영역에 접근하기 때문에 읽고 쓰는 속도가 조금 느리다.
2. SW 설계시 의존성 주입, 제어의 역전이란?
1. IoC (Inversion of Control, 제어의 역전)
개발자가 프로그램의 흐름(애플리케이션 코드)을 제어하는 주체였었다. 객체의 생성~ 생명주기 관리를 컨테이너가 도맡아서 하게 된 것이다.
즉, 제어권이 컨테이너로 넘어가게 되고, 이것을 제어권의 흐름이 바뀌었다고 하여 IoC(Inversion of Control : 제어의 역전)이라고 하게 된다.
제어권이 컨테이너로 넘어옴으로써 DI(의존성 주입), AOP(관점 지향 프로그래밍)등이 가능하게 된다.
2. DI (Dependency Injection, 의존성 주입)
각 클래스간의 의존관계를 빈 설정 (Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것
빈 설정을 개발자가 XML, annotation 방식으로 설정을 하면 컨테이너가 빈의 설정 정보를 읽어서 컨테이너가 자동으로 시켜준다.
3. 다형성이란?
- 여러 가지 데이터를 다룰 수 있는 특성을 뜻 한다.
- 부모클래스의 인스턴스를 이용하여 자식 타입의 클래스를 다룬다거나, 메서드 오버로딩을 통하여 동일 이름의 메서드를 이용하여 다양한 형태의 파라미터를 다루는 것을 뜻한다.
4. 프로세스와 쓰레드의 차이점
1. 프로세스
- 실행중인 프로그램을 나타낸다. CPU가 실행되고 있는 프로세스에 대해 메모리 자원을 안정되게 배분해줘야 하며 운영체제의 성능에 따라 성능이 결정된다.
2. 쓰레드
- 이 프로세스 내에서 실행되는 각각의 일. 프로세스 내에서 실행되는 세부 작업 단위로 여러 개의 스레드가 하나의 프로세스를 이루게 되는 것이다. 스레드는 각자의 스택 메모리영역을 가지고 있으며 동일한 프로세스 내의 다른 스레드들과 전역 메모리를 공유한다. 따라서 CPU로부터 새로운 자원을 할당받지 않아도 되기 때문에 프로세스보다 실행 속도가 빠르다는 장점을 가지고 있다.
5. 자료 구조란?
- 자료(Data)의 집합이며 각 원소들이 논리적으로 정의된 규칙에 의해 나열되며 자료에 대한 처리를 효율적으로 수행할 수 있도록 자료를 구분하여 표현한 것이다. 자료구조를 잘 선택하는 것으로 실행시간을 단축시켜주거나 메모리 용량의 절약등을 이끌어 낼 수 있다.
- 자료구조는 선형구조와 비선형 구조로 나눠져있다.
선형 구조 : 배열, 링크드리스트, 스택, 큐가 있다.
비선형 구조: 트리, 그래프가 있다.
6. 코드 형상 관리란?
- 코드 형상 관리란 변경사항을 체계적으로 관리하고 제어하기 위한 활동이다. 소스를 버전별로 관리할 수 있어서 개발할 때 실수로 코드를 삭제하거나, 수정하기 이전으로 돌아가야되는 경우 유용하게 사용되며 팀 프로젝트에서 누가 무엇을 어떻게 수정했는지도 알 수 있기 때문에 코드를 병합하거나 수정된 소스를 추적하는 데에도 쓰인다.
형상관리 툴의 종류로는 SVN, CVS, Perforce, ClearCase, TFS, Git 등이 있다.
7. ORM(Object-Relational Mapping)이란?
- ORM은 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것이다.
객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용하는데 이를 맞춰줘서 더 직관적인 코드로 데이터를 조작 및 개발 할수있고 코드의 길이가 줄어든다.
개발하는데 많은 편리성과 이점을 제공하지만 프로젝트의 복잡성이 커지거나 DBMS의 고유 기능을 이용해야될 경우 ORM으로만 서비스를 구현하기가 쉽지않다는 단점이 있다.
book 이라는 객체에서 저자의 이름이 ychaen 인 책 목록을 가져오고 싶을 때,
SQL 쿼리문을 사용할 경우, sql 쿼리문을 작성하고, 데이터를 가져오는 일련의 모든 과정들을 코드에 적어야 한다
book_list = new list();
sql = "SELECT book FROM library WHERE author = 'ychaen'";
data = query(sql);
while (row = data.next()){
book = new Book();
book.setAuthor(row.get('author'));
book_list.add(book);
}
반면 ORM을 사용하면, 간단하게 표현할 수 있다
book_list = BookTable.query(author="ychaen")
고급
1. 알고리즘의 시간복잡도
- 알고리즘의 성능은 시간복잡도와 공간 복잡도로 표현한다.
- 시간복잡도 : 입력밧의 개수와 알고리즘의 처리시간의 상관관계를 표현한 말이다.(입력한 데이터의 양이 많아 짐에 따라 처리 속도가 어떻게 변하는지를 수학의 기호를 빌려 표현하는 방식이다.
-공간복잡도 : 시간복잡도와 동일하나 처리시간 대신 메모리 사용량의 변화를 비교하는 것이 다르다.
- 알고리즘의 성능은 빅오(big-O)표기법 = O(n)표기법으로 표현한다.
2. 임계영역이란?
- 공유되는 자원에서 문제가 발생하지 않도록 독점을 보장해주는 영역이다.
-상호 배제를 통해 다른 프로세스 또는 쓰레드를 대기시켜 문제를 해결할 수 있다
예시) 은행 통장
3. 프로그래밍에서 동기와 비동기, 블로킹과 논블로킹의 차이점
"처리시간 차이"
- 동기 : 동시에 일어난다는 뜻, 요청과 그 결과가 동시에 일어난다는 약속, 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어진다.
- 장점 : 셀계가 매우 간단하고 직관적이다.
- 단점 : 결과가 주어질 때까지 아무것도 하지 못하고 대기해야한다는 단점
- 비동기 : 동시에 일어나지 않는다는 뜻, 요청과 결과가 동시에 일어나지 않을 것이라는 약속.
- 장점 : 결과가 주어지는데 시간이 걸리더라도 그 시간동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있다.
- 단점 : 설계가 동기보다 복잡하다.
https://webclub.tistory.com/605
예시
블로킹 / 논블로킹
자신의 작업을 하다가 다른 작업 주체가 하는 작업의 시작부터 끝까지 기다렸다 다시 자신의 작업을 시작한다면 블로킹이고 다른 주체의 작업과 관계없이 자신의 작업을 계속한다면 논블로킹이다.
"제어권 차이"
블로깅 : 호출된 함수가 호출한 함수에 제어권을 반환하지 않음
논블로깅: 호출한 함수가 호출된 함수의 제어권을 반환함
4. 디자인 패턴이란?
많은 실무 프로그래머들이 인정한 효율적인 코딩 방법 or 구조
효율적인 코딩이란?
-
코드가 단순하고 명확하다.
-
모듈은 한 가지 기능만 하도록 세분화한다.
-
재사용성이 높다.
-
유지보수가 쉽다.
-
리소스(컴퓨터밥)의 낭비가 없거나, 최소화 되어야 한다.
패턴의 분류
목적에 따른 구분 : '생성 패턴', '구조 패턴', '행동 패턴'으로 나눌 수 있다.
-
생성 패턴 : 객체의 생성과정에 관여하는 패턴(싱글톤, 추상팩토리 패턴 외)
-
구조 패턴 : 클래스나 객체의 합성에 관한 패턴(적용자 , 브리지 패턴 외)
-
행동 패턴 : 클래스나 객체들이 상호 작용하는 방법과 책임을 분산하는 방법을 정의하는 패턴(커맨드, 인터프리터 패턴 외)
5. 좋은 로그 설계 기법이란?
로그 설계 프로세스
-
목표 정의
-
관계자들과 의견을 종합하여 로그를 설계
-
로그 추가 또는 변경 작업
-
테스트 / QA
-
배포
-
로그 설계 방식에 대하여 미리 합의된 최소한의 규약이 필요하다.
-
처음부터 모든 것을 충족 할 수 없으므로, 점진적 개선이 필요하다.
-
잘못 남겨진 로그는 이후 생산성을 크게 저하시키기 때문에 충분한 테스트와 QA 과정이 필요하다.
6.소프트웨어 개발 프로세스란?
작업 순서의 집합 + 제약 조건을 포함하는 일련의 활동이다. 이를 효율적으로 관리하기 위해 정해진 프로세스를 따라 개발을 진행한다.
사용되는 SW개발 프로세스 모델의 종류는 아래와 같다.
1. 폭포수 모델
2. 프로토타이핑 모델
3. 나선형 모델
4. 애자일 모델
7. 테스트 주도 개발 방법론(TDD)이란?
- 소프트웨어 개발방법론 중 하나 이며, 테스트를 염두에 둔 프로그램 개발 방법
-테스트 코드 작성 -> 구현 코드 작성 -> 리팩토링 단계
- 장단점
TDD방법론의 가장큰 장점은 코드를 안정적이게 개발할 수 있다는 점이 있습니다. 각각의 코드의 기능에 맞는 테스트케이스가 존재하므로, 코드가 수정되거나 리펙토링을 할 때에 버그 또는 오류의 가능성을 낮춰주게 됩니다.
그리고 실패 된 테스트케이스에서 기능을 구현하여, 테스트 케이스가 통과 될 경우 개발을 더욱 재밌게 할 수 있습니다.
하지만 TDD 방법론의 가장 큰 단점은 테스트 케이스 개발에 소요되는 시간으로 개발 시간이 늘어난 다는 점입니다.
':: IT > 기술면접' 카테고리의 다른 글
[기술면접] 데브옵스 (0) | 2020.07.31 |
---|---|
[기술면접] 운영체제 (0) | 2020.07.31 |
[기술면접] 네트워크 (0) | 2020.07.30 |
[데브옵스] 데브옵스란? (0) | 2020.07.30 |
[운영체제] 운영체제란? (0) | 2020.07.30 |