2023-02-17
목터뷰 조사한 내용 정리 5일차...
30. Base64 인코딩이란 무엇인가요?
인코딩이란 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 말합니다.
Base64 인코딩은 8비트 이진 데이터(Binary Data) 를 ASCII 문자로 변환하는 인코딩 방식입니다.
이진 데이터를 텍스트 형식으로 변환하는데 사용되며 이메일, 웹에서의 데이터 전송, DB 등에서 널리 사용됩니다.
Base64를 글자 그대로 직역하면 64진법 이라는 의미이며 화면에 표시되는 ASCII 문자들로 표시할 수 있는 가장 큰 진법입니다.
디코딩에서는 인코딩된 문자열을 이진 데이터로 다시 변환하는 것이며, 인코딩된 문자열을 6비트씩 나누어 8비트 이진 데이터로 변환하고 이진 데이터를 다시 문자열로 변환하여 원래 데이터를 복원합니다.
이진 데이터를 전송하거나 저장하기 어려운 경우에 유용하지만, 원래 문자열보다 길어지는 단점이 있으며 데이터의 보안성이 강화되는 것도 아니여서 보안을 위해서는 별도의 암호화가 필요합니다.
정리
8비트 이진 데이터를 ASCII 문자로 변환하는 인코딩 방식입니다.
이진 데이터를 텍스트 형식으로 변환하는데 사용되며 이메일, 웹에서의 데이터 전송, DB 등에서 널리 사용됩니다.
글자 그대로 64진법 이라는 의미이며 화면에 표시되는 ASCII 문자들로 표시할 수 있는 가장 큰 진법입니다.
다만 인코딩된 문자열이 원래 데이터보다 더 길어지는 단점과 보안성이 강화되는 것은 아니여서 보안을 위해서는 별도의 암호화가 필요합니다.
30번 질문의 다른 사람들의 답변
Base64란 8비트 2진 데이터(zip파일이나 exe파일 등)을 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어린 일련의 문자열로 바꾸는 인코딩 방식입니다. Base64를 사용하면 초기 문자보다 데이터 크기가 커지는데 사용하는 이유는 문자를 전송하기 위해서는 설계된 미디어(email, html)을 통해 독립적으로 바이너리 데이터를 전송할 필요가 있을 때, ASCII로 인코딩하여 전송하게 되면 문제가 발생할 수 있습니다. 이러한 문제로 인해 ASCII는 시스템간 데이터를 전달하기에 안전하지가 않습니다. Base64는 ASCII의 제어문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자 만 사용하기 때문에 Base64 인코딩을 사용하는 이유입니다.
바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII문자로 표현하기 위해 만들어진 인코딩이다. ASCII 문자 하나가 64진법의 숫자 하나를 의미하기 때문에 Base64라는 이름을 가지게 되었다.
Base64의 인코딩 과정은 먼저 24비트의 버퍼를 생성해 바이트 데이터를 넣은 뒤 버퍼의 위쪽부터 6비트 단위로 잘라 Base64테이블의 ASCII문자로 변환한다. 다시 말해 원본 문자열 => ASCII binary => 6비트로 쪼갬 => Base64 인코딩 순서가 되고, 디코딩은 해당 과정을 반대로 진행하면 된다.
32. 프로세스와 스레드를 비교하여 설명해주실 수 있을까요?
프로세스와 스레드는 모두 컴퓨터에서 실행되는 작업의 단위를 의미합니다.
프로세스는 운영체제로 부터 자언을 할당받는 작업의 단위입니다. 스레드는 할당 받은 자원을 이용하느 실행의 단위이고 프로세스 내에 여러개 생길 수 있습니다. 어플리케이션 하나가 프로세스이고, 그 안에서의 분기 처리가 스레드가 됩니다.
더 쉽게...
프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름의 단위를 말합니다.
프로세스는 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간(stack)을 독립적으로 할당 받는다.
또한, 각 프로세스는 독립된 메모리 공간을 가집니다.
- Multi Process
하나의 프로그램을 구성하여 각 프로세스가 하나의 작업(task)를 처리하는 것을 말합니다.
- 장점 : 하나의 프로세스가 잘못 되어도 프로그램은 동작 함
- 단점 : context switching 비용 발생 - Multi Thread
프로그램을 여러개의 쓰레드로 구성하고 각 스레드가 작업(task)를 처리하는 것
- 장점 : 시스템 자원 소모 감소, 처리 비용 감소(실행 속도 향상), 쓰레드간 자원 공유(stack을 제외한 영역)
- 단점 : 디버깅 어려움, 동기화 이슈 발생, 하나의 스레드의 오류로 전체 프로세스에 문제 발생
정리
프로세스는 하나의 프로그램을 구성하여 각 프로세스가 하나의 작업(task)를 처리하는 것이고 프로그램은 여러개의 스레드로 구성하고 각 스레드가 작업(task)를 처리하는 것을 말합니다.
프로세스는 각각의 독립된 메모리 공간을 가집니다. 각 프로세스는 별도의 주소 공간에서 실행됩니다.
스레드는 프로세스 안에서 실행되는 흐름의 단위를 말하며, 기본적으로 모든 프로세스는 최소 하나의 메인 스레드를 가지게 됩니다.
32번 질문의 다른 사람들의 답변
프로세스는 운영체제로부터 시스템 자원을 할당받는 기본 단위이다. 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 의미한다. 프로세스는 각각 독립된 메모리 영역을 할당받게 되고, 각 프로세스는 별도의 주소 공간에서 실행된다.
스레드는 프로세스 내에서 실행되는 여러 흐름의 단위이다. 기본적으로 모든 프로세스는 최소 하나의 메인 스레드를 가지게 된다. 프로세스가 할당받은 자원을 이용하는 실행의 단위이고 프로세스 내의 stack을 제외한 주소 공간이나 자원들을 공유한다.
33. 동기와 비동기를 비교하여 설명해주실 수 있을까요?
둘 모두 프로그래밍에서 자주 사용되는 용어로, 작업을 처리하는 방식에 대한 차이를 나타냅니다.
동기 (Synchronous)
동기 방식은 호출한 함수가 작업을 마칠 때까지 호출한 함수가 대기하는 방식입니다. 이 방식에서는 호출한 함수가 작업이 완료되기를 기다리기 때문에 다른 작업을 수행할 수 없으며, 결과가 반환되기 전까지는 다음 단계로 넘어갈 수 없습니다.
비동기 (Asynchronous)
호출한 함수가 작업을 마칠 때까지 대기하지 않고, 바로 다음단계로 넘어가며 작업의 완료는 콜백 함수를 통해 확인합니다.
작업이 완료되기를 기다리지 않기 때문에, 다른 작업을 수행할 수 있으며 결과가 반환되기 전에도 다음단계로 넘어갈 수 있습니다.
정리
동기방식은 호출한 함수가 작업을 마칠 때까지 함수가 대기하는 방식이며 비동기는 작업을 마칠 때까지 대기하지 않습니다. 따라서 비동기 방식은 바로 다음단계로 넘어가며 작업의 완료는 콜백 함수로 확인합니다.
동기방식은 작업이 완료되기를 기다리기 때문에 다른 작업을 수행할 수 있으며, 비동기 방식은 기다리지 않기 때문에 다른 작업을 수행할 수 있습니다.
32번 질문의 다른 사람들의 답변
동기는 데이터의 요청과 결과가 한 자리에서 동시에 일어나는것을 말합니다. 사용자가 데이터를 서버에게 요청한다면 그 서버가 데이터 요청에 따른 응답을 사용자에게 다시 리턴해주기 전까지 사용자는 다른 활동을 할 수 없으며 기다려야만합니다. 비동기는 동시에 일어나지 않는다는 의미입니다. 서버에게 데이터를 요청한 후 요청에 따른 응답을 계속 기다리지 않아도되며 다른 외부 활동을 수행하여도되고 서버에게 다른 요청사항을 보내도 상관없습니다.
35. 동시성과 병렬성을 비교하여 설명해주실 수 있을까요?
동시성
여러 작업이 겹치는 기간에 실행될 수 있음을 의미합니다. 즉, 여러 작업을 번갈아 가며 짧은 시간동안 처리하고 다른 작업을 처리하는 방식입니다.
멀티태스킹 운영체제에서는 여러 개의 프로그램이 동시에 실행되는 것처럼 보이지만, 실제로는 CPU가 각각의 프로그램을 번갈아 가며 처리를 합니다.
병렬성
물리적으로 여러 작업을 동시에 처리하는 것을 의미합니다. 여러 개의 CPU가 존재하거나, 하나의 CPU 에서도 여러개의 코어를 사용하여 여러 작업을 동시에 처리하는 것이 가능합니다.
예로, 멀티코어 CPU를 사용하여 여러 개의 프로그램을 동시에 실행하는 것이 병렬성을 이용한 방식입니다.
- 동시성은 작업을 번갈아 가며 처리하기 때문에 처리 시간이 늘어날 수 있습니다.
- 하지만 작업을 분리하고, 프로그램의 병목 현상을 줄일 수 있어서 성능 향상에 도움을 줄 수 있습니다.
- 병렬성은 여러 작업을 동시에 처리하기 때문에 처리 시간이 단축될 수 있습니다.
- 하지만, CPU의 코어 수에 따라 처리 성능이 크게 달라질 수 있어서 코어 수에 비례하여 하드웨어 비용이 늘어날 수 있습니다.
정리
동시성은 여러 작업을 번갈아 가며 짧은 시간동안 처리하고 다른 작업을 처리하는 방식으로 여러개의 프로그램이 동시에 실행되는 것처럼 보이지만, 실제로는 CPU가 각각의 프로그램을 번갈아 가며 처리합니다.
병렬성은 물리적으로 여러 작업을 동시에 처리하는 것을 의미합니다. 복수의 CPU 가 존재할 수 있고 하나의 CPU 에서도 여러 작업을 동시에 처리하는 것이 가능합니다.
동시성은 작업을 번갈아 가며 처리해서 처리 시간이 늘어나지만 병목 현상을 줄여 성능 향상이 가능합니다.
병렬성은 여러 작업을 동시에 처리해 처리 시간은 단축되지만 CPU의 코어 수에 따라 성능이 바뀌며 하드웨어 비용이 늘어날 수 있습니다.
35번 질문의 다른 사람들의 답변
동시성은 여러개의 스레드를 하나의 코어에서 빠르게 교차시키면서 실행하여 동시에 실행되는 것 처럼 보이도록 동작시키는 방식이다. 스레드가 교차하며 Context Switching을 계속해서 일으키고 다중 스레드들이 실행된다. 반면 병렬성은 멀티 코어프로세서 에서 멀티 스레드를 실행 시키는 방법으로 실제로 다중의 코어에서 각자의 스레드가 명령어를 실행하는 것을 말한다.
동시성은 적어도 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할(time-slicing)을 포함합니다. 우리가 흔히 ‘동시’라고 이야기 하지만 컴퓨터(코어)는 한번에 하나의 명령어만 처리할 수 있다. 즉, 두개 이상의 알고리즘이 하나의 코어내에서 스레드간에 빠르게 교차되면서 실행되기 때문에 ‘동시’라고 느끼는 것입니다. 병렬성을 이야기하려면 적어도 2개 이상의 코어가 있어야 합니다. 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말합니다. 그러므로 두개의 알고리즘이 정확히 같은 시점에 실행될 때 이를 병렬적이라고 말할 수 있습니다.
37. (중급) JVM 이란 무엇이고 왜 필요한지 설명해주실 수 있을까요?
Java Virtual Machine 의 줄임말, 자바는 OS에 종속적이지 않다는 특징을 가지고 있다.
이게 가능한 이유는 OS 에서 자바를 실행시키는 JVM 의 존재 때문인데, JVM 이 자바 소스코드를 CPU 가 인식할 수 있도록 기계어로 컴파일 해주기 때문이다.
자바 소스코드, 즉 원시코드(*.java) 는 CPU 가 인식을 하지 못하며 이를 위해서 JVM 이라는 가상머신을 거쳐서 OS 에 도달하며 OS 가 인식할수 있는 기계어로 컴파일 되는게 아닌 JVM 이 인식할 수 있는 Java bytecode(*.class) 로 변환된다.
자바 컴파일러가 .java 파일을 .class 라는 자바 파이트코드로 변환한다.
- 자바 컴파일러는 JDK 를 설치하면 bin 에 존재하는 javac.exe 를 말하며 즉, JDK 에 자바 컴파일러가 포함되어 있다는 의미이다.
자바 바이트코드는 기계어가 아니여서 OS 에서 바로 실행은 불가능하지만, JVM이 OS가 바이트코드를 이해할 수 있도록 해석해준다. 이 말은 자바 바이트코드를 운영체제 맞게 해석해주는 역할을 한다는 의미이다.
따라서 바이트코드는 JVM 위에서 OS 상관없이 실행이 가능하다.
즉, JVM 은 OS 와 자바 어플리케이션 사이의 중개자 역할로, 자바 바이트코드를 실행할 수 있는 환경을 제공한다.
정리
Java Virtual Machine 의 줄임말로, 자바 소스코드를 CPU 가 인식할 수 있도록 기계어로 컴파일 해주는 역할을 수행한다.
이 JVM이 있음으로 인해 자바는 OS에 종속적이지 않고 자바 파일 하나만 만들면 어느 디바이스에 상관없이 JVM 위에서 실해이 가능해진다.
37번 질문의 다른 사람들의 답변
Java Virtual Machine의 줄임말로 OS에 종속받지 않고 Java를 실행시킬 수 있는 가상머신으로 JVM은 JAVA와 OS 사이에서 중개자 역할을 수행하여 JAVA가 OS에 관계없이 실행될 수 있게 해준다. 크게 세가지로 중요한 부분이 나뉜다. java 파일을 컴파일러가 자바 바이트 코드인 .class로 변환한다. 바이트 코드를 Class Loader 에서 Loading, Linking, Initialization 과정을 거치며 클래스를 실제 실행될때 사용하는 영역인 Runtime Data Area의 메모리로 로딩한다. 이때 메서드, 힙 ,스택 ,PC 레지스터,Native Method Stacks의 5개의 영역으로 구성된다. 위의 영역을 Execution Engine에서 실제로 실행한다. 이 때 반복되는 명령어는 JIT 컴파일러가 바로 실행시켜주며 가비지 컬렉터가 사용하지 않는 힙 영역에서 할당한 메모리를 주기적으로 삭제해준다.
JVM이란 Java Virtual Machine 의 줄임말로, Java Byte Code 를 운영체제에 맞게 해석해주는 역할을 한다. 즉, 작성한 자바 프로그램의 실행 환경을 제공하는 자바 프로그램의 구동 엔진이다. Java compiler 는 .java 파일을 .class 라는 자바 바이트코드로 변환시켜주는데 Byte Code 는 기계어(Native Code)가 아니므로 OS 에서 바로 실행이 되지 않는다. 이때 JVM은 OS가 Byte Code 를 이해할 수 있도록 해석해주는 역할을 담당한다. JVM은 메모리 관리도 담당한다. 이를 '가비지 컬렉터'라고 하는데, 가비지 컬렉터는 Java7부터 힙 영역의 객체들을 관리하는 역할을 담당한다.