본문 바로가기

Android

👋Android 인터뷰를 위한 간단 정리

728x90

1️⃣ Android

Q) 안드로이드란 무엇일까?

안드로이드란 구글에서 제작한 스마트폰 모바일 운영체제로 운영체제, *미들웨어, 사용자 인터페이스, Web 브라우저 / 이메일 클라이언트 / SMS 등의 응용 프로그램을 하나로 묶어 제공하는 소프트웨어입니다.

 

*미들웨어 : 운영체제와 해당 운영체제에서 실행되는 응용 프로그램 사이에서 운영체제가 제공하는 서비스 외 추가적인 서비스를 제공하는 소프트웨어(DB, WAS 등)


 

Q) Android SDK란 무엇일까?

개발자들이 모바일 어플리케이션을 제작할 수 있도록 안드로이드 API, Debugger, Emulator, IDE, 라이브러리, 샘플 코드, 관련 문서 등을 제공하는 소프트웨어입니다.


 

Q) Android APK란 무엇일까?

리소스 파일, 인증서, 매니페스트 파일 및 기타 코드 등 Android 어플리케이션의 모든 컨텐츠가 포함되어 있으며 어플리케이션 설치에 사용되는 안드로이드 앱의 확장자입니다.

 

*리소스(Resource) : 프로그램의 흐름이나 동작과 직접적인 상관이 없는 ​이미지 파일, 문자열, 음악 파일, 동영상 파일 등 화면을 그리는데 필요한 요소들을 의미


Q) Context란 무엇일까?

시스템이 관리하는 어플리케이션의 현재 상태에 대한 정보에 접근할 수 있는 추상 클래스로 액티비티와 어플리케이션에 대한 정보를 얻거나 안드로이드 시스템 서비스에서 제공하는 API를 호출할 때 사용합니다.

 

Context를 잘못 사용하면 메모리 누수가 발생할 수 있기 때문에 Activity Context와 Application Context를 잘 이해하고 목적에 맞게 사용해야 합니다.

 

*자세히 : https://goni95.tistory.com/177


 

Q) Android 4대 컴포넌트란 무엇일까?

Android 4대 컴포넌트에는 Activity, Service, Content Provider, Broadcast Receiver가 있습니다.

 

액티비티는 UI 화면을 담당하는 컴포넌트로 액티비티가 기본적으로 가지는 생명주기 메서드를 재정의하여 원하는 기능을 구현할 수 있고 어플리케이션은 반드시 하나의 액티비티를 가져야하며 두 개의 액티비티를 동시에 띄울 수 없습니다.

 

서비스는 UI가 존재하지 않고 사용자와 상호작용 하지않아도 백그라운드에서 동작할 수 있는 별도의 생명주기를 갖는 컴포넌트로 메인스레드에서 실행되기 때문에 메인 스레드가 차단되는 상황에 발생하는 ANR을 피하기 위한 수단으로 사용하는 것이 아닌 안드로이드 시스템에게 백그라운드에서 처리해야할 작업이 존재함을 알리는 수단으로 생각하고 사용해야 합니다.

 

콘텐트 프로바이더는 데이터를 관리하고 외부 어플리케이션이 데이터에 접근할 수 있게 도와주는 컴포넌트로 어플리케이션에서 컨텐트 리졸브 객체를 이용해 다른 앱의 콘텐트 프로바이더에게 데이터를 요청하면 데이터를 꺼내어 다시 컨텐트 리졸브에게 전달합니다.

 

브로드캐스트 리시버는 디바이스에서 발생하는 다양한 이벤트에 반응하는 컴포넌트로 화면 ON/OFF나 재부팅 등의 특정 이벤트가 발생되면 Intent를 통해 해당 이벤트가 발송되고 브로드캐스트 리시버가 수신해 원하는 작업을 수행합니다.


 

Q) Activity와 Fragment란 무엇일까?

액티비티는 View를 가질 수 있으면서 독립적으로 활용 가능한 큰 틀이라고 볼 수 있고 프래그먼트는 액티비티와 View의 특성을 가지고 있는 액티비티에 종속적인 소형 틀이라고 볼 수 있습니다.

프래그먼트는 액티비티와 프래그먼트를 이어주는 역할을 하는 FragmentManager를 이용해 Transaction을 통한 추가, 삭제, 교체 작업을 요청해야 합니다.


 

Q) Activity와 Fragment의 생명주기는 무엇일까?

사용자가 어플리케이션과 상호작용하면서 액티비티 또는 프래그먼트의 상태가 변경되면 안드로이드 시스템이 상태 변경을 알기위해서 콜백 함수를 호출하는데 이 콜백 함수가 생명주기 메소드라고 합니다.

 

onCreate(), onStart(), onRestart(), onResume(), onPause(), onStop(), onDestroy()

 

onAttach(), onCreate(), onCreateView(), onViewCreated(), onStart(), onResume(), onPause(), onStop(), onDestroyView(), onDestroy(), onDetach()

 

1. 최초 생성 시 add(), add(backStack), replace(), replace(backStack)과 상관없이 아래와 같이 진행

액티비티가 onCreate()되면 프래그먼트가 onAttach() ~ onStart()되면 액티비티가 onStart(), onResume()되고 프래그먼트가 onResume()이 됩니다.

 

2. 기존 프래그먼트는 그대로 두고 새 프래그먼트를 생성할 경우 아래와 같이 진행

replace()

기존 프래그먼트 onPause(), onStop()이 되고 새 프래그먼트가 onAttach() ~ onStart()되면 기존 프래그먼트는 onDestroyView() ~ onDetach()되고 새 프래그먼트가 onResume() 됩니다.

 

replace(backStack)

위와 동일하지만 기존 프래그먼트가 onDestoryView()까지만 호출됩니다.

 

3. 홈버튼

add, add(backStack)일 경우

add()는 기존의 프래그먼트 위에 새 프래그먼트를 띄우기 때문에 모든 프래그먼트가 onPause()되고 액티비티가 onPause()되면 프래그먼트들의 onSaveInstanceState() 호출이 이루어진 후 프래그먼트에서 액티비티 순으로 onStop()이 호출

 

replace(), replace(backStack)

replace()로 프래그먼트를 띄울 때 기존의 프래그먼트를 삭제시킨 상태이기 때문에 화면에 띄어져있는 프래그먼트에 대해서만 위와 같이 호출됩니다.

 

4. 다시 앱으로 돌아온 경우

프래그먼트들과 액티비티 순서로 onStart() 후 onResume() 됩니다.

 

*자세히 : https://hungseong.tistory.com/25


 

Q) Activity와 Fragment의 화면 전환 또는 메모리 부족 등으로 종료된 경우 데이터 유지 방법은 무엇일까?

onSaveInstanceState() 메서드를 활용하는 것입니다.

onPause()와 onStop() 메서드 사이에서 호출되는 onSaveInstanceState() 메서드에서 파라미터로 받은 Bundle에 key 값으로 데이터를 구분해 저장하고 onCreate() 또는 onRestoreInstanceState() 메서드에서 savedInstanceState의 값 유무에 따라 분기처리해 key 값으로 data를 불러옵니다.


 

Q) Intent 무엇일까?

Android 런타임에서 컴포넌트 간에 통신을 하기위해 사용하는 일종의 메시지 객체로 명시적 인텐트와 암시적 인텐트 유형이 있습니다.

 

명시적 인텐트는 컴포넌트의 이름을 사용하는 형태로 개발자가 생성한 컴포넌트를 실행할 때 사용됩니다.

 

암시적 인텐트는 어떤 작업을 수행할 것인지에 대해 선언하는 형태로 해당 인텐트에 대한 작업을 처리할 수 있는 컴포넌트를 시스템이 필터링해 수행하거나 사용자에게 선택하도록 합니다.


 

Q) Room이 무엇일까?

Room은 내부적으로 SQLite를 사용해 SQLite의 모든 기능을 제공하고 DB 접근의 편의성을 높여주는 ORM라이브러리이기 때문에 DB 데이터를 Java 또는 Kotlin 객체로 매핑할 수 있습니다.

Room은 LiveData, Rx, Coroutine Flow로 데이터를 관찰할 수 있도록 구축되어 있습니다.

 

*SQLite : Android 플랫폼에서 사용되는 오픈소스, 서버리스 데이터베이스이고 데이터베이스 파일의 저장 루트가 어플리케이션 내부에 있습니다.

*매핑 : 두 개의 서로 다른 데이터 간의 관계를 정의해 하나의 데이터가 다른 데이터를 가르키도록 하는 것

*ORM : 하나의 객체를 테이블로 매핑해 객체를 통해 쿼리문 없이도 간접적으로 데이터베이스의 데이터를 다룰 수 있도록 객체와 관계형 데이터베이스를 연결해주는 역할을 하는 프레임워크

 


 

Q) ANR(Application Not Responding) 무엇일까?

메인 스레드가 일정시간 이상 차단되어 사용자와 상호작용이 불가능한 경우 안드로이드 시스템에서 어플리케이션을 강제종료하기 위해서 발생시키는 메시지입니다.

ANR을 피하기 위해선 사용자의 입력이벤트, 브로드캐스트 리시버, 서비스에서 장시간 메인 스레드를 이용하여 작업해야하는 경우 서브 스레드를 통해 메인 스레드의 부하를 줄여 해결할 수 있습니다.


 

Q) RecyclerView란 무엇일까?

리사이클러뷰는 사용자가 관리하는 많은 양의 데이터를 개별 Item 단위로 구성해 스크롤 가능한 리스트 형태로 화면에 표시할 수 있는 ViewGroup 입니다.

 

사이클러뷰를 사용하기 위해선 Adapter, LayoutManager, ViewHodler가 필요합니다.

 

1. Adapter : 데이터 목록을 실제 눈으로 볼 수 있도록 Item View로 변환하는 중간다리 역할을 하며 getItemCount(), onCreateViewHolder(), onBindViewHolder() 메서드를 재정의해 구현합니다.

  • viewType 형태의 Item View에 대한 ViewHolder 객체를 생성하는 onCreateViewHodler()
  • 생성된 ViewHolder에 position에 해당하는 데이터를 바인딩하는 onBindViewHolder()
  • 데이터 개수를 반환하는 getItemCount()

 

2. ViewHodler : 각 View를 보관하는 객체로 각 구성 요소를 저장해 반복적으로 조회하지 않고 즉시 접근할 수 있도록 합니다.

  • findViewById()는 일반 View에 경우 자기 자신의 ID를 확인하지만 여러 개의 자식 View를 포함하는 레이아웃에 경우 자신과 자식들까지 모두 확인하는 과정(DFS 탐색)이 거치기 때문에 비용이 크게 발생합니다.
    ViewHolder 패턴은 한 번 생성해 저장했던 View에 대해서 다시 findViewById()를 통해 View를 불러올 필요가 사라지게 됩니다.

 

3. LayoutManager : Item이 나열되는 형태를 관리합니다.

  • 수직 및 수평 레이아웃을 만들 수 있는 LinearLayoutManager
  • View 마다 크기가 다른 격자형 레이아웃을 만들 수 있는 StaggeredGridLayoutManager
  • 격자형 레이아웃을 만들 수 있는 GridLayoutManager

 

리사이클러뷰는 ItemDecoration 클래스와 ItemAnimator 클래스를 통한 커스터마이징이 가능합니다.

 

1. ItemDecoration : Item 간에 구분선 및 여백을 설정할 수 있습니다.

  • 매개변수로 Item의 테두리 역할의 Rect, 자식 View, 리사이클러뷰, 현재 리사이클러뷰의 상태를 받아 각 Item에 대한 여백을 설정하는 getItemOffsets()
  • 매개변수로 받아온 도화지 역할의 Canvas, 리사이클러뷰, 현재 리사이클러뷰의 상태를 받아 각 Item에 대한 구분선을 설정하는 onDraw(), onDrawOver()

*getItemOffsets() : 각 항목을 배치할 때 호출 | onDraw() : 항목 배치 전 호출 | onDrawOver() : 모든 항목이 배치된 후 호출

 

2. ItemAnimator : Item 삽입, 삭제, 이동에 대한 애니메이션을 설정할 수 있습니다.

 


 

 

DI, TDD, CI/CD 등 

 

 

 

2️⃣ CS

º 언어

 

Q) Class, Constructor, Object, Instance, Method, Property란 무엇일까?

Class는 객체를 만들어내기 위한 설계도를 의미하고 생성자, 필드, 메서드들로 구성됩니다.

Constructor는 객체 생성 시 가장 먼저 호출되어 객체의 데이터를 초기화하는 역할을 하고 생성자가 없어도 내부적으로 생성하여 default 값으로 초기화합니다.

Object는 클래스의 타입으로 선언된 모양 그대로 생성된 실체를 의미하며 모든 인스턴스를 대표하는 포괄적인 의미를 가지기도 합니다.

Instance는 객체가 메모리 영역을 할당받아 메모리에 상주하여 실제 사용할 수 있게되면 인스턴스라고 합니다.

Method는 어떤 결과를 도출해내는 행동을 의미

Property는 자바에서의 변수를 코틀린에선 프로퍼티라고 부르며 변수처럼 보이지만 getter/setter와 같은 함수가 내장되어 있고 자바에서의 필드와 접근자의 역할을 합니다.


 

Q) 추상 클래스와 인터페이스의 차이는 무엇일까?

추상 클래스는 상속을 통해 생성될 자식 클래스에서 공통적으로 가질 필드 및 메서드 오버라이딩에 강제성을 부여하기 위해 사용됩니다.

추상 클래스는 추상 메서드를 갖고있어 직접 객체화할 수 없으며 일반 메서드를 가질 순 있지만 선언한 메서드가 abstract 및 open 키워드를 명시하지 않으면 구현부가 필요하거나, final로 간주되어 오류가 발생합니다.

 

인터페이스는 인터페이스를 구현하는 클래스에서 동일한 목적을 가진 메서드 구현에 강제성을 부여하기 위해서 사용됩니다.

인터페이스는 메서드에 구현부가 없으면 추상 메서드로 간주하고 구현부가 있는 메서드는 open 메서드로 간주하므로 별도의 키워드를 명시할 필요는 없습니다.

*추상 메서드 : 아직 구현되지 않고 선언만 된 형태의 메서드


 

Q) Generic이란 무엇일까?

클래스에서 사용할 타입에 대한 정의를 클래스 외부로 미뤄 타입에 대한 유연성과 안정성을 확보할 수 있도록 합니다.


 

Q) 접근 지정자란 무엇일까?

클래스, 메서드, 필드에 대해 접근을 제한하는 역할을 합니다.

public : 모든 접근 허용

protected : 상속받은 클래스 또는 같은 패키지만 접근 허용

private : 같은 클래스 내에서만 허용

 

Java의 경우 default, Kotlin의 경우 internal가 있습니다.

default : 접근 지정자를 생략한 경우, 같은 패키지만 접근 허용

internal : 같은 모듈 내에서만 접근 허용

 


º 공통

 

Q) OOP(Object Oriented Programming | 객체 지향 프로그래밍)란 무엇일까?

객체를 기본 단위로 하여 각각의 객체들을 정의하고 객체들 간의 상호작용을 통해 프로그래밍하는 방법론입니다.

 

1. 객체지향 프로그래밍 방식은 추상화를 통해 공통적인 속성이나 기능을 묶어 클래스를 정의하고 상속을 통해 확장해 사용할 수 있다는 점에서 코드의 재사용성이 좋습니다.

2. 객체 단위로 모듈화하기 때문에 오류 발생 시 수정할 부분이 클래스 내부의 변수 또는 메서드로 존재해 디버깅과 유지보수가 쉽고 여러 명이 개발하더라도 업무 분담이 효율적입니다.

 

1. 상속을 통한 재사용성은 높였지만 객체 단위로 메모리에 저장하기 때문에 한번만 사용하더라도 필드나 메서드들이 인스턴스에 포함되어 메모리를 많이 사용하게 됩니다.

그렇다고 클래스 단위를 잘게 쪼개서 작성하게 되면 객체를 다루는 효율성이 떨어지기 때문에 모든 코드를 미리 메모리에 올려두지 않고 필요할 때 마다 동적 할당 방식을 사용하지만 이 또한 속도 저하가 발생됩니다.

2. 코드를 JVM이 이해할 수 있는 바이트 코드로 변환한 후 JVM의 Execution Engine이 CPU가 이해할 수 있는 기계어로 변환하여 실행하기 때문에 메모리 사용과 연산이 많아져 상대적으로 느려집니다.

3. 객체들 간의 관계를 표현해야 하기 때문에 설계가 쉽지 않습니다. 


 

Q) OOP(Object Oriented Programming | 객체 지향 프로그래밍)의 특징은 무엇일까?

1. 객체들이 가지는 공통적인 필드와 메서드를 묶어 이름을 붙여 정의하는 추상화가 있습니다.

 

2. 객체의 속성과 기능을 하나의 캡슐 형태로 묶는 캡슐화가 있습니다.

캡슐화 과정에서 접근 제한자를 이용해 실제 구현 내용을 외부로 부터 감추는 은닉성도 만족시킬 수 있습니다.

 

3. 부모가 자식에게 유전자를 물려주듯 상위 클래스의 모든 것을 하위 클래스가 이어 받는 상속이 있습니다.

 

4. 하나의 객체 또는 메서드 등이 다양한 자료형에 속하는 것이 허가되는 성질인 다형성이 있습니다.

자바에서의 오버로드와 오버라이딩이 다형성의 대표적인 예라고 할 수 있습니다.

오버라이딩 : 상위 클래스로 부터 상속받은 것을 하위 클래스에서 재정의 하는 것

오버로딩 : 같은 이름의 메서드들을 매개변수의 자료형과 개수에 따라 다르게 호출되는 것


Q) JVM(Java Virtual Machine | 자바 가상 머신) 무엇일까?

OS 위에서 동작하고 컴파일을 통해 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 변환하여 실행시켜주는 역할을 합니다.

JVM은 OS 위에서 동작하기 때문에 프로그램을 운영체제에 독립적으로 실행시킬 수 있습니다.

 

1. 프로그램 실행 시 JVM이 운영체제로 부터 필요한 메모리를 할당받고 메모리를 용도에 따라 여러 영역으로 나누어 관리합니다.

2. 자바 컴파일러가 소스코드를 읽어들여 자바 바이트코드로 변환시키고 JVM의 클래스 로더로 전달하면

3. 클래스 로더는 클래스 파일들을 JVM의 Runtime Data Areas에 배치시킵니다.

4. 로딩된 클래스 파일들은 JVM의 Execution engine이 기계어로 변환하여 실행시키는 역할을 합니다.

5. 이러한 실행과정 속에서 유효하지 않은 메모리가 발생하면 JVM의 가비지 컬렉터가 정리해줍니다.

 

Execution Engine이 바이트코드를 기계어로 변환하는 두 가지 방식을 사용하는데

인터프리터 방식은 바이트코드를 명령어 단위로 읽어서 한 줄 씩 수행하기 때문에 느립니다.

JIT 방식은 인터프리터 방식으로 실행하다 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하여 캐시에 보관해두고 이후에는 네이티브 코드로 직접 실행하는 방식이다. 하지만 컴파일하는 과정이 오래걸리기 때문에 JIT 컴파일러가 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도를 넘은 경우 컴파일을 수행합니다.

네이티브 코드는 OS에 의해 직접적으로 컴파일(기계어)되는 코드를 의미하며 플랫폼에 종석되고 가비지 컬렉션 되지도 않는다.


 

Q) Garbage Collection 무엇일까?

유효하지 않은 메모리 주소인 Garbage를 정리해주는 프로그램으로 Heap 메모리를 재활용 하기위해 참조되지 않는 객체들을 해제시켜 가용한 공간을 만드는 작업으로 개발자가 직접 메모리를 정리하지 않아도 되기 때문에 개발 속도가 향상됩니다.

(메모리를 언제 되찾을 지 결정하기 위한 오버헤드 발생 문제점 존재) 


 

Q) 자바의 메모리 구조와 운영체제의 메모리 구조 무엇일까?

Method, Heap, Stack, PC register, Native Method Stack

Method, Heap, Stack, PC register, Native Method Stack
Method 모든 스레드가 공유하는 메모리 영역으로 클래스, 인터페이스, 메서드, 필드, static 변수 등의 바이트 코드를 보관합니다. (runtime constant pool : 상수)
Heap 모든 스레드가 공유하는 메모리 영역으로 new로 생성된 객체와 배열이 생성되는 영역입니다.
Method 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역
Stack 메서드 호출 시 각각의 스택 프레임이 생성되어 메서드 안에서 사용되는 매개 변수, 지역 변수, 반환값들을 임시로 저장하고 수행이 끝나면 프레임 별로 소멸됩니다. 
PC register 스레드가 생성될 때 마다 생성되는 공간으로 스레드 마다 하나씩 존재합니다.
Native Method Stack 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.

 

Code, Data, Heap, Stack
Code 실행할 프로그램의 코드가 저장되는 영역
Data 전역 변수와 정적 변수가 저장되는 영역
Heap 사용자의 동적 할당(객체) / 런타임에 크기가 결정
Stack 함수 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역 / 컴파일 타임에 크기가 결정

 

Q) 함수형 프로그래밍 무엇일까?

어떤 입력값에 대해 항상 동일한 출력값을 반환하는 순수함수를 조합하고 변경 가능한 데이터 및 Side Effect을 피해 소프트웨어를 만드는 프로그래밍 방법론입니다.

 

불변성을 만족하게되면 데이터베이스 접근, 전역변수 접근 등의 요인에 영향을 받지 않아 Side Effect를 피하고 오로지 입력 값에만 영향을 받기 때문에 프로그램의 검증이 수월하고 오류를 줄여 프로그램의 에측이 가능하게 됩니다.


 

Q) Serializatoin이 무엇일까?

객체의 상태 혹은 데이터 구조를 바이트 단위로 변환하여 파일 또는 네트워크를 통해 송수신이 가능하도록 하는 것을 의미합니다.


 

 

Q) 동기와 비동기 무엇일까?

동기는 요청 시 작업에 대한 결과가 도착할 때까지 대기했다가 다음 작업을 처리하는 방식으로 순서대로 진행되기 때문에 작업에 대한 제어가 쉽지만 여러가지 작업을 동시에 처리할 수 없어 효율이 떨어집니다.

 

비동기는 요청 시 해당 작업에 대한 처리 여부와 상관없이 다음 작업을 처리하는 방식으로 작업이 완료될 때 까지 기다릴 필요가 없기 때문에 자원을 효율적으로 사용할 수 있지만 작업이 완료된 결과를 제어하기가 어렵습니다.


 

Q) TDD(테스트 주도 개발) 무엇일까?

반복 테스트를 이용한 소프트웨어 개발 방법론으로 작은 단위의 테스트 케이스를 토대로 테스트 코드를 작성하고 테스트한 후에 예외 사항이 발생하면 테스트 케이스에 추가하고 설계를 개선하며 테스트가 통과된 코드만을 실제 코드로 작성하는 과정을 반복하며 불필요한 설계를 피하고 정확한 요구 사항에 집중할 수 있다는 장점이 있지만 테스트의 원칙으로 인해 구조에 얽매이거나 개발 속도가 느려지는 단점이 있습니다.


 

Q) RESTful API 무엇일까?

이미지, 동영상, DB 자원 등의 데이터를 명시한 HTTP URI에 대한 CRUD 작업을 HTTP Method를 통해 처리하도록 하는 REST API 설계 가이드를 준수하는 API를 의미합니다.

API는 응용 프로그램과 API 제공자 사이에서 데이터를 요청하고 응답받는 Interface 역할을 합니다.

 

rest: HTTP URI를 통해 자원(이미지, 동영상, DB 데이터)을 명시하고 HTTP Method(POST, GET, PUT, DELETE)를 통해 자원(URI)에 대한 CRUD 작업을 처리하도록 설계된 아키텍처를 의미합니다.

url : 네트워크 상에서 리소스가 어디에 있는지 알려주기 위한 규약

uri : 네트워크 상에서 리소스를 식별하기 위한 문자열의 구성으로 url을 포함


 

Q) 프레임워크와 라이브러리 무엇일까?

프레임워크는 일정한 기반 구조와 부품들을 이용해 정해진 규칙에 따라 코드를 작성하여 다양한 결과물을 만들 수 있도록 개발, 실행, 테스트, 운영 환경을 지원하는 소프트웨어입니다.

 

라이브러리는 개발자에게 특정 기능을 제공하는 개발 도구를 의미합니다.

 

차이점 : 둘 모두 소프트웨어 개발의 편의성을 제공한다는 공통점이 있지만 프레임워크는 개발자가 프레임워크 안에서 필요한 코드를 작성한다는 점에서 권한을 자체적으로 갖지만 라이브러리는 개발자가 필요에 따라 원하는 기능을 구현하고 싶을 때 사용할 수 있다는 점에서 개발자가 권한을 가집니다.

 


º 운영체제

 

Q) CPU란 무엇일까?

다양한 입력 장치로 부터 데이터를 받아 작업을 처리하고 결과를 출력장치로 보내는 과정을 제어하는 컴퓨터 시스템의 핵심 장치입니다.


 

Q) 운영체제란 무엇일까?

컴퓨터의 성능(처리능력 향상, 응답시간 최소화, 신뢰도 등)을 높이고 사용자에게 편의성 제공을 목적으로 컴퓨터 하드웨어를 관리하는 소프트웨어입니다.

 

커널: 소프트웨어와 하드웨어 간 통신을 관리하는 프로그램으로 소프트웨어의 요청을 하드웨어가 처리할 수 있도록 변환하고 메모리와 프로세스를 관리합니다.

쉘: 사용자와 운영체제 간 통신이 가능하게 해주는 명령어 해석기로 사용자의 입력 명령을 커널이 이해할 수 있도록 변환해 전달하고 커널로 부터 받은 결과를 해석해 사용자가 확인할 수 있도록 해줍니다.


 

Q) 운영체제의 스케줄러란 무엇일까?

어떤 프로세스에게 자원을 할당할지 결정하는 작업을 하는 운영체제 커널의 모듈을 뜻하고 장기, 단기, 중기 스케줄러로 구분됩니다.

 

장기: Job 큐에 저장된 프로세스 중 어떤 프로세스에 메모리를 할당해 ready 큐로 보낼지 결정

Job 큐: 현재 시스템 내 모든 프로세스가 담긴 큐

 

단기: CPU 스케줄러라고도 하며 ready 큐에 있는 프로세스 중 어떤 프로세스를 runing 시킬지 결정

선점형(뺏기 가능 - RR, SRT, 다단계 큐), 비선점형(뺏기 불가 - HRN, FIFO, FCFS)

ready 큐: 현재 메모리 내 적재되어 CPU를 할당받아 실행되기를 대기하는 프로세스가 담긴 큐

 

중기: 메모리의 여유 공간을 마련하기 위해 프로세스를 통째로 메모리에서 디스크로 쫒아냄


 

Q) 프로세스와 스레드 무엇일까?

프로그램이 보조 기억장치(SSD, HD)에서 꺼내져 운영체제로 부터 자원을 할당받아 메모리(RAM)에 적재되어 실행되면 이것을 프로세스라고 합니다.

각 프로세스는 최소 1개의 스레드(메인 스레드)를 가지고 있으며 별도의 주소 공간에서 실행되기 때문에 운영체제에선 안전성을 위해 프로세스는 자신에게 할당된 메모리 내의 정보에만 접근하도록 강제하지만 IPC를 통해 접근할 수 있습니다.

 

스레드는 프로세스 내에서 프로세스가 할당받은 메모리 영역 중 Stack 영역만 별도로 할당받고 프로세스의 Code, Data, Heap 영역은 공유하며 실행될 수 있는 단위로 여러 개가 생성될 수 있고 메모리 영역을 공유하기 때문에 한 스레드가 공유 영역의 자원을 변경하면 다른 스레드에서 변경 결과를 볼 수 있습니다.

 

차이점: 자원 공유과 오류 발생 시 영향면에서 차이가 있습니다.


 

Q) 멀티 프로세스와 멀티 스레드란 무엇일까?

멀티 프로세스는 프로그램을 여러 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하는 방식이고 자식 프로세스 중 하나에 문제가 발생해도 다른 자식 프로세스에 영향을 끼치지 않지만 여러 프로세스 사용으로 높은 메모리 사용량과 스케줄링에서 발생하는 콘텍스트 스위칭 비용이 높습니다.

 

멀티 스레드는 프로그램을 여러 스레드로 구성해 각 스레드가 작업을 처리하는 방식으로 메모리를 공유한다는 점에서 메모리 사용량이 적고 스케줄링에서 발생하는 콘텍스트 스위칭 비용이 낮아(캐시 메모리 삭제) 처리속도 빠르지만 경합/교착 상태가 발생할 수 있고 하나의 스레드의 오류가 전체 프로세스에 문제를 발생시킵니다.

 

경합 상태: 여러 스레드가 동시에 같은 기억 장소에 접근해 내부적으로 명령어들이 뒤섞여 결과를 예측할 수 없는 상태

교착 상태: 여러 스레드가 서로 상대방의 작업이 끝나기를 기다리고 있어 결과적으로 무엇도 완료되지 못하는 상태 (스레드 간섭을 방지하기 위해 스레드가 자원을 점유할 시 해당 스레드를 제외하고 나머지는 접근하지 못하도록 막는 방법인 동기화로 인해 두 개의 스레드가 서로 점유 중인 자원을 필요로 하는 경우 교착상태가 발생)


 

Q) 컨텍스트 스위칭이란 무엇일까?

CPU가 스케쥴링에 따라 현재 동작 중인 프로세스의 상태를 PCB에 저장하고 PCB로 부터 실행될 프로세스의 정보를 가져와 CPU를 할당하는 과정을 의미하며 PCB에 정보를 저장하고 가져오는 타이밍엔 CPU가 아무 작업을 할 수 없기 때문에 너무 자주 일어나면 CPU의 오버헤드가 발생할 수 있습니다.

PCB: 프로세스 식별자, 프로세스 상태, 메모리 관리 정보 등이 포함된 특정 프로세스에 대한 정보를 갖고있는 프로세스가 가지는 고유한 자료구조


 

Q) 가상메모리(가상기억장치)란 무엇일까?

보조 기억장치의 일부를 주 기억장치처럼 사용해 용량이 작은 주 기억장치를 마치 큰 용량을 가진 것처럼 사용하는 기법입니다.

 

프로그램을 여러 개의 작은 블록 단위로 나누어 가상 기억장치에 보관해놓고 요구되는 블록만 주 기억장치에 할당하여 처리해 주 기억장치의 용량보다 큰 프로그램을 실행할 수 있습니다.

이를 구현하는 방법에는 페이징 기법, 세그먼테이션 기법이 있습니다.


 

Q) 페이징 기법과 세그먼테이션 기법이란 무엇일까?

페이징 기법은 가상기억장치에 보관되어 있는 프로그램과 주기억장치의 영역을 동일한 크기로 나눈 후 나눠진 프로그램(페이지)을 동일하게 나눠진 주기억장치의 영역(페이지 프레임)에 적재시켜 실행하는 기법입니다.

외부 단편화는 발생하지 않으나, 내부 단편화는 발생할 수 있고 페이지의 위치 정보를 가지는 페이지 맵 테이블이 필요해 비용이 증가하고 처리속도가 감소합니다.

페이지 교체 알고리즘 : LRU, FIFO, NUR 등 

 

세크먼테이션 기법은 가상기억장치에 보관되어 있는 프로그램을 다양한 크기의 논리적인 단위로 나눈 후 주기억장치에 적재시켜 실행시키는 기법입니다.

내부 단편화는 발생하지 않으나, 외부 단편화가 발생할 수 있습니다.


 

Q) 외부 단편화와 내부 단편화란 무엇일까?

단편화란 프로세스들이 메모리에 적재되고 제거되는 일이 반복되다 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 작은 공간들이 생기는 것을 의미합니다.

 

외부 단편화 : 메모리 공간 중 사용하지 못하게 되는 일부분

내부 단편화 : 프로세스가 사용하는 메모리 공간에 포함되는 남는 공간

 


º 네트워크

 

Q) 웹의 동작 방식은 무엇일까?

1. 브라우저에 URL 입력하면

2. 브라우저가 DNS를 통해 서버의 실제 주소를 찾고

3. HTTP 프로토콜을 통해 HTTP 요청 메시지를 생성합니다.

4. 이 요청 메시지를 TCP/IP 연결을 통해 서버로 전송되면

5. 서버는 HTTP 프로토콜을 통해 HTTP 응답 메시지를 생성하고

6. 이 응답 메시지를 TCP/IP 연결을 통해 요청한 컴퓨터로 전송합니다.

7. HTTP 응답 메시지가 도착하면 웹 페이지 데이터로 변환되어 웹 브라우저에 의해 출력됩니다.


 

Q) TCP와 UDP란 무엇일까?

연결형 서비스를 지원하는 전송 계층 프로토콜로 3-way handshaking 과정을 통해 통신 선로가 고정되고 이를 통해 순차적으로 전달합니다.

통신 과정에서 유실되면 재전송하고 순서가 바뀌면 순서를 재조합할 수 있지만 속도가 비교적 느리다는 단점이 있습니다.

 

비연결형 서비스를 지원하는 전송 계층 프로토콜로 연결 절차를 거치지 않고 보내는 쪽에서 일방적으로 데이터를 전달하기 때문에 속도가 빠르지만 데이터 전달 과정에서 유실이나 변조가 되어도 재전송을 하지않아 신뢰성이 떨어집니다.

https://coding-factory.tistory.com/614


 

Q) TCP 3-Way Handshake와 4-Way Handshake란 무엇일까?

TCP 네트워크에서 통신을 하는 장치가 서로 연결이 잘 되었는지 확인하는 방법입니다.

송신자와 수신자는 총 3번에 걸쳐 데이터를 주고 받으며 통신이 가능한 상태임을 확인합니다.

데이터 전송이 끝나면 커넥션을 끊습니다.

 

클라이언트가 서버에 접속을 요청하는 SYN(a) 패킷을 보냅니다.

서버는 클라이언트의 요청인 SYN(a)를 받고 클라이언트에게 요청을 수락한다는 ACK(a+1)과 SYN(b)이 설정된 패킷을 발송합니다.

클라이언트는 서버의 수락 응답인 ACK(a+1)과 SYN(b) 패킷을 받고 서버로 ACK(b+1)를 보내면 연결이 성립됩니다.

 

클라이언트가 서버에게 연결을 종료하겠다는 FIN 플래그를 보냅니다.

서버는 클라이언트의 요청(FIN)에 대한 응답으로 ACK 패킷을 보냅니다.

서버는 자신의 통신이 끝날때까지 기다리는 CLOSE_WAIT 상태가 되고 처리해야할 통신이 모두 끝났다면 FIN 패킷을 보냅니다.

클라이언트가 FIN 패킷에 대한 응답으로 ACK 패킷을 보냅니다.

클라이언트의 ACK 패킷을 받은 서버는 소켓을 닫습니다.

클라이언트가 서버로부터 아직 받지 않은 데이터가 있을 수 있으니 일정시간 세션을 남깁니다.


Q) 대칭키 암호화와 비대칭키(공개키, 개인키) 암호화 무엇일까?

대칭키 암호화는 동일한 키를 사용하여 암/복호화를 하는 방식으로 서버와 클라이언트 양쪽이 동일한 키를 가집니다.

 

비대칭키는 암호화와 복호화 시 서로 다른 키를 사용하는 방식으로 서버는 자신만의 개인키를 가지고 있고 이에 대응되는 공개키는 누구나 가지고 있을 수 있도록 공개합니다.

개인키로 암호화된 데이터는 공개키로만 복호화가 가능하고 공개키로 암호화된 데이터는 개인키로만 복호화가 가능합니다.


 

Q) HTTP와 HTTPS란 무엇일까?

HTTP는 인터넷 상에서 데이터를 주고받기 위한 프로토콜(통신규약)으로 평문(암호화되지 않은 내용) 통신이기 때문에 도청이 가능하고 통신 상대를 확인하지 않기 때문에 위장이 가능합니다.

도청 : 통신 경로 상에서 엿볼 수 있음

위장 : 통신 상대가 누구인지 확인하지 않기 때문에 누구든지 리퀘스트를 보낼 수 있음

 

HTTPS는 SSL(Secure Socket Layer) 프로토콜을 통해 전송하려는 데이터를 암호화하는 보안이 강화된 프로토콜입니다.

 

사이트의 안전성 판별하기(전자서명)

클라이언트가 서버를 완전히 신뢰할 수 없기 때문에 사이트의 안전성을 판별하기 위한 Handshake 과정을 밞습니다.

0. 브라우저는 CA(인증기관) 리스트와 CA의 공개키를 가지고 있고 서버는 CA(인증기관)의 개인키로 암호화한 인증서를 발급받아 가지고 있습니다.

1. 클라이언트가 서버로 접근을 요청하면 서버는 발급받은 인증서를 클라이언트에게 보냅니다.

2. 클라이언트는 서버로 부터 받은 인증서를 CA(인증기관)의 공개키를 이용해 복호화하면

3. 인증서로 부터 해당 서버의 공개키를 얻게되는데, 이 과정에서 주고받았던 두 종류의 랜덤 데이터를 활용해 임시키를 생성하고 이 임시키를 서버의 공개키로 암호화하여 서버로 전송합니다.

 

데이터주고 받기

4. 서버는 클라이언트로 부터 받은 임시키를 자신의 개인키로 복호화하고 클라이언트와 서버가 동일한 방법으로 임시키를 조작하여 대칭키를 생성하면 이 대칭키를 이용해 데이터를 주고받습니다.

 

즉 비대칭키 암호화 방식은 암/복호화 시간이 오래걸리기 때문에 데이터를 주고받기 전 사이트의 안전성을 판별하고 대칭키를 공유하기 위해 통신할 땐 비대칭키 암호화 방식을 사용하고 데이터를 주고받을 땐 대칭키 암호화 방식을 사용합니다.


 

Q) OSI 7계층이란 무엇일까?

네트워크에서 통신이 일어나는 과정을 7단계로 나눈 것을 의미하며 이를 통해 특정 계층에 이상이 생기면 다른 계층의 장비 및 소프트웨어를 건들이지 않고 이상이 생긴 단계만 고칠 수 있기 떄문입니다.

 

7 계층(응용 계층) : 사용자와 직접 상호작용하는 응용 프로그램들이 포함된 계층

6 계층(표현 계층) : 데이터 형식을 정의하는 계층

5 계층(세션 계층) : 컴퓨터끼리 통신을 하기위해 세션을 만드는 계층

4 계층(전송 계층) : 최종 수신 프로세스로 데이터의 전송을 담당하는 계층

3 계층(네트워크 계층) : 패킷을 목적지까지 가장 빠른 길로 전송하기 위한 계층

2 계층(데이터링크 계층) : 데이터의 물리적인 전송과 에러 검출, 흐름 제어를 담당하는 계층

1 계층(물리 계층) : 데이터를 전기 신호로 바꾸어주는 계층

https://shlee0882.tistory.com/110


 

Q) TCP/IP 프로토콜이란 무엇일까?

LINK 계층 : 물리적인 영역의 표준화에 대한 결과

IP 계층 : 경로 검색을 해주는 계층

TCP/UDP (전송) 계층 : 데이터의 실제 송수신을 담당

애플리케이션 게층 : 서버와 클라이언트를 만드는 과정에서 프로그램 성격에 따라 데이터 송수신에 대한 약속들이 정해지는 계층


 

Q) 웹 서버와 웹 어플리케이션 서버 무엇일까?

웹 서버란 클라이언트의 웹 브라우저로 부터 요청을 받아 정적인 콘텐츠(html, jpeg, css 등)를 제공하는 컴퓨터 프로그램입니다.

 

웹 어플리케이션 서버는 DB 조회나 다양한 로직 처리를 요구하는 동적인 콘텐츠(jsp, asp, php)를 제공하기 위해 만들어진 서버입니다.

 


º 자료구조

Q) 스택, 큐, 트리, 힙이란 무엇일까?

스택 : 세로로 된 바구니와 같은 구조로 먼저 넣게되는 자료가 마지막으로 나오게 되는 FILO 구조입니다.

큐 : 가로로 된 파이프와 같은 구조로 먼저 넣게되는 자료가 가장 먼저 나오는 FIFO 구조입니다.

트리 : 정점과 간선을 이용해 사이클을 이루지 않도록 구성한 Graph의 특수한 형태로 계층이 있는 데이터를 표현하기 적합합니다.

힙 : 최댓값 또는 최솟값을 찾아내는 연산을 쉽게 하기위해 고안된 구조로 각 노드의 키값이 자식의 키값보다 작지않거나 그 자식의 키값보다 크지 않은 완전 이진트리입니다.


 

Q) Array, LinkedList의 차이는 무엇일까?

배열 : 인덱스를 가지며 원하는 데이터를 한번에 접근하기 떄문에 접근 속도 빠르지만 크기 변경이 불가능하며 데이터 삽입 및 삭제 시 그 위치의 다음 위치부터 모든 데이터 위치를 변경해야되는 단점이 존재합니다.

 

연결리스트 : 인덱스 대신 현재 위치의 이전/다음 위치를 기억하며 크기 변경이 가능하고 인덱스 접근이 아니기 때문에 연결된 링크를 쭉 따라가며 접근해야합니다.

 

즉, 데이터의 양이 많고 삽입/삭제가 없이 데이터 검색이 필요한 경우 배열을 사용하고 데이터의 양이 적고 삽입/삭제가 빈번하다면 연결리스트를 사용하는 것이 좋습니다.

 

 

 

 

 

 

API와 라이브러리

 

동기와 비동기

스케줄러

프로세스

스레드

멀티 프로세스와 스레드

TDD

함수형 프로그래밍

 

레스트

레스트API

TCP

UDP

HTTP

HTTPS