메모리 구조
코드 영역
실행할 프로그램의 코드가 저장되는 영역으로 텍스트(Text) 영역이라고도 부른다.
사용자가 프로그램 실행 명령을 내리면 OS가 HDD에서 메모리로 실행 코드를 올리게 되고, CPU는 코드 영역에 저장된 명령어를 하나씩 가져가 처리하게 된다.
제어문, 함수, 상수들이 이 영역에 저장된다.
데이터 영역
프로그램의 전역 변수(global)와 정적 변수(static)가 저장되는 영역이다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
힙 영역
프로그래머가 직접 관리할 수 있는 메모리 영역으로 이 공간에 메모리를 할당하는 것을 동적 할당이라고 부른다.
Java, C# 그리고 일부 스크립트 언어에 가비지 콜렉터가 있으며, 해당 언어들에서는 가비지 컬렉터가 자동으로 메모리를 해제해준다.
힙 영역은 스택 영역과 달리 낮은 주소에서 높은 주소로 메모리가 할당된다.
스택 영역
함수의 호출과 함께 할당되며 지역 변수와 매개 변수가 저장되는 영역이다.
스택 영역에 저장되는 함수의 호출 정보를 스택프레임이라고 한다.
스택 영역은 함수의 호출이 완료되면 소멸하며, 높은 주소에서 낮은 주소로 메모리가 할당된다.
Call By Value / Call By Address / Call By Reference
Call By Value
인자로 받은 값을 복사하여 처리하는 방식이다.
Call By Value에 의해 넘어온 값을 증가시켜도 원래의 값이 보존된다.
값을 복사하여 넘기기 때문에 메모리 사용량이 늘어난다.
Call By Address / Call By Reference
인자로 받은 값의 주소를 참조하여 직접 값에 영향을 주는 방식값을 복사하지 않고 직접 참조하기 때문에 속도가 빠르다.
원래의 값에 영향을 주는 리스크가 존재한다.
Call By Address와 Call By Reference의 차이
둘은 변수의 주소에 접근하여 값을 수정할 수 있는 점은 같지만, 사용하는 메모리에서 차이가 난다.
Call By Address는 본질적으로는 주소값을 복사하여 전달한다는 점에서 Call By Value와 메모리를 사용하는 면에서 차이가 없다.
값을 복사하여 전달하는 과정에서 포인터 변수를 사용하기에 4바이트를 차지하게 된다.
하지만 Call By Reference는 참조된 해당 변수 메모리를 공유하기에 추가적인 메모리가 사용되지 않는다.
절차지향 프로그래밍 VS 객체지향 프로그래밍
절차지향 프로그래밍
위에서부터 아래로, 순차적인 처리를 중요시하는 프로그래밍 기법이다.
가장 대표적인 언어로 C언어가 있다.
컴퓨터의 처리구조와 유사해 실행속도가 빠르지만, 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.
객체지향 프로그래밍
실제 세계의 사물들을 객체로 모델링하여 개발을 진행하는 프로그래밍 기법이다.
절차지향보다는 실행속도가 느리지만, 절차지향보다는 덜 엄격하게 순서를 확인한다.
가장 대표적인 언어로 Java가 있으며, 요즘에는 거의 대부분의 언어가 객체지향을 따른다.
객체지향은 아래의 4가지 개념으로 구성된다.
- 추상화
추상화는 구체적인 예시들로부터 공통된 것들을 뽑아냄으로서 일반화된 아이디어와 컨셉을 만들어내는 것을 말한다.
구현하려는 영역에 있는 현실세계의 무언가를 추상화 한 것이 객체이다. - 캡슐화
캡슐화는 이름 그대로 객체를 캡슐과 같이 감싸, 외부에서 함부로 접근할 수 없게 만드는 것이다.
캡슐화의 핵심적인 목표는 접근을 막는다기 보다는 모듈화로, 각 시스템이 독립적으로 작용하게 만들어 다른 시스템에 영향을 주지 않게 하는 것이다.
- 상속
부모가 자식에게 물려준다는 의미로, 부모 클래스의 필드와 메소드를 자식 클래스에게 넘겨주는 것을 말한다.
상속을 통해 코드를 재사용하고 확장할 수 있다. - 다형성
하나의 메소드나 클래스가 다양한 방법으로 동작하는 것을 의미한다.
One interface, multiple implementations가 다형성을 대표하는 말이며, 여기서 핵심은 하나의 인터페이스이다.
외부에 공개되는 단 하나의 인터페이스를 통해 여러가지 기능을 할 수 있게 만들어준다.
함수형 프로그래밍
함수형 프로그래밍은 거의 대부분의 것들을 순수 함수로 나누어 문제를 해결하는 기법이다.
작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.
즉, 함수형 프로그래밍은 부수효과가 없는 순수 함수를 이용하여 프로그램을 만드는 것이다.
부수 효과
아래의 변화 혹은 변화가 발생하는 작업을 부수 효과라고 한다.
- 변수의 값이 변경됐다.
- 자료 구조를 제자리에서 수정했다.
- 객체의 필드값을 설정했다.
- 예외나 오류가 발생하여 실행이 중단됐다.
- 콘솔 또는 파일 I/O가 발생했다.
순수 함수
부수 효과가 없는 순수 함수란 데이터의 값을 변경시키지 않으며 객체의 필드를 설정하는 등의 작업을 하지 않는 함수를 의미한다.
1급 객체 (First-Class Object)
1급 객체란 다음과 같은 것들이 가능한 객체이다.
- 변수나 데이터 구조 안에 담을 수 있다.
- 매개변수로 전달할 수 있다.
- 반환값으로 사용할 수 있다.
- 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.
함수형 프로그래밍에서 함수는 1급 객체로 취급받기에 위의 것들이 가능하다.
참조 투명성 (Referential Transparency)
동일한 인자에 대해 항상 동일한 결과를 반환해야한다.
참조 투명성을 통해 기존의 값은 변경되지 않고 유지 된다.(Immutable Data)
아스키코드와 유니코드, EUC-KR과 UTF-8 차이
아스키코드
영문 알파벳을 사용하는 문자 인코딩 방식이다.
1바이트로 표현되며, 그 중 8비트 중에서 1비트는 통신 에러 검출을 위한 용도로 사용되어 7비트만이 사용됐다.
이로 인해 128개의 부호밖에 표현할 수 없었고, 더 많은 문자를 표현하고자 여러 가지 인코딩 방식이 등장했다.
EUC-KR
아스키코드에는 미국에서 사용되는 숫자나 알파벳만 들어있었기 때문에, 한글 같은 다른 문자체계는 표현이 불가능했다.
나라들마다 문자열 표를 만들어서 사용했는데, 이때 탄생한 것이 EUC-KR이다.
1바이트의 아스키코드와 달리 EUC-KR은 2바이트로 구성되었다.
허나 나라마다 다른 문자열 셋을 만들면 통일되지 않은 표현 방식에 의해 문제가 발생하였기 때문에 이를 해결하고자 유니코드가 등장했다.
UTF-8
전 세계 문자를 하나로 통합한 문자열 Set(유니코드)을 만들었는데, UTF-8은 유니코드의 한 종류다.
유니코드는 1~4byte로 인코딩하는 가변 크기 인코딩 방식으로, 사용 빈도가 높은 글자는 적은 공간을 차지한다.
UTF-16은 고정 길이(2또는 4바이트)를 사용한다는 점과 바이트 순서에 따라 2가지 형식이 존재한다는 점에서 다르다.
OOP
OOP란
OOP는 현실 세계를 프로그래밍으로 옮겨와 현실 세계의 사물들을 객체로 보고, 그 객체로부터 개발하고자 하는 특징과 기능을 뽑아와 프로그래밍하는 기법이다.
OOP로 코드를 작성하면 재사용성과 변형가능성을 높일 수 있다.
OOP의 5가지 설계 원칙 S.O.L.I.D
SOLID 원칙을 적용하는 순서가 따로 있는 것은 아니고, 프로젝트에 5가지 원칙을 모두 적용할 필요는 없다.
SRP (Single Responsibility Principle, 단일 책임 원칙)
클래스는 단 하나의 목적을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다.
즉, 클래스는 단 하나의 책임(기능)만 가져야 한다는 원칙이다.
최종적으로 단일 책임 원칙의 목적은 프로그램의 유지보수의 효율성을 높이기 위한 설계 기법이다.
OCP (Open-Closed Principle, 개방 폐쇠 원칙)
클래스는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
즉, 기능 추가 요청이 오면 클래스를 확장을 통해 쉽게 구현하며, 확장에 따른 클래스 수정은 최소하 하도록 프로그램을 작성해야하는 설계 기법이다.
추상화 사용을 통한 관계 구축 권장을 의미한다.
LSP (Liskov Substitution Principle, 리스코프 치환 원칙)
상위(자식) 타입의 객체를 하위(부모) 타입으로 바꾸어도 프로그램은 일관되게 동작해야 한다.
즉, 다형성의 특징을 이용하기 위해 상위 클래스 타입으로 객체를 선언하여 하위 클래스의 인스턴스를 받으면, 업캐스팅된 상태에서 부모의 메서드를 사용해도 동작이 의도대로 흘러가야 하는 것을 의미한다.
ISP(Interface Segregation Principle, 인터페이스 분리 원칙)
클라이언트는 이용하지 않는 메소드에 의존하지 않도록 인터페이스를 분리해야 한다.
SRP 원칙이 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조한다.
ISP 원칙은 인터페이스를 사용하는 클아이언트를 기준으로 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이 목표다.
DIP(Dependency Inversion Principle, 의존 역전 법칙)
클라이언트는 추상화(인터페이스)에 의존해야 하며, 구체화(구현된 클래스)에 의존해선 안된다.
즉, 구현 클래스에 의존하지 말고 인터페이스에 의존하라는 의미다.
프레임워크와 라이브러리 차이
프레임워크
프레임워크는 애플리케이션 개발 시 필수적인 코드, 알고리즘, DB 커넥션 등의 기능들을 위한 구조를 제공한다.
소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 상호 협력하는 클래스와 인터페이스의 집합이라고 할 수 있다.
라이브러리
라이브러리는 주로 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임이다.
여기에는 구성 데이터, 문서, 도움말, 메세지 틀, 미리 작성된 코드, 함수, 클래스, 값, 자료형 사양들을 포함할 수 있다.
핵심적인 차이점
이 둘의 차이점은 제어 흐름에 대한 주도권이 누구에게/어디에 있는가에 있다.
프레임워크는 전체적인 흐름을 쥐고 있고, 개발자는 그 안에서 라이브러리에 대한 흐름을 쥐고 있다.
프레임워크를 사용하면 사용자가 관리해야 하는 부분을 프레임워크에 넘김으로써 신경써야 할 것을 줄이는 제어의 역전(IoC, Inversion Of Control)이 적용된다.
RESTful API
REST API에서 REST는 REpresentational State Transfer의 약자로, 이를 해석하면 네트워크 상태가 전이되는 것에 대한 표현이다.
REST API는 이를 표현하기 위해 Resource, Method, Reperesntation 3가지를 사용한다.
이 3가지를 통해 상태가 전이되는 것을 표현한다면 우리는 RESTful한 API를 작성할 수 있다.
- Resource (자원, URI)
HTTP URI를 통해 자원을 명시하고, - Method (요청 방식, GET or POST 등)
HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해 - Representation of Resource (자원의 형태, JSON or XML 등)
해당 자원 (URI)에 대한 CRUD Operation을 적용하는 것을 의미한다.
Rest API의 Method
CRUD Operation란
CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create, Read, Update, Delete를 묶어서 일컫는 말로 REST에서의 CRUD Operation 동작 예시는 아래와 같다.
Create : 데이터 생성 (POST)
Read : 데이터 조회 (GET)
Update : 데이터 수정 (PUT, PATCH)
Delete : 데이터 삭제 (DELETE)
- GET: 데이터 조회
- POST: 데이터 추가 및 수정
- PUT: 데이터 변경
- PATCH: 일부 데이터 변경
- OPTION: 웹 서버에서 지원되는 메소드의 종류를 확인할 때 사용
TDD (Test-Driven-Development)
TDD란 작은 단위의 테스트 케이스를 작성하고 그에 맞는 코드를 작성하여 테스트를 통과한 후에 상황에 맞게 리팩토링하는 테스트 주도 개발 방식을 말한다.
- 테스트 케이스 작성
- 테스트 케이스를 통과하는 코드 작성
- 작선한 코드 리팩토링
테스트 코드를 작성해야 하는 이유
- 예상하지 못한 오류에 대한 피드백을 위해
- 실수를 줄여준다.
- 좋은 설계로 작성되게끔 코드를 유도
DDD (Domain-Driven-Design)
DDD에서 말하는 Domain은 비즈니스 Domain이다.
비즈니스 Domain은 유사한 업무의 집합으로, DDD는 비즈니스 Domain별로 나누어 설계하는 방식을 말한다.
DDD의 계층
표현 계층 (Presentation layer)
사용자의 요청에 대해 해석하고 응답하는 일을 책임지는 계층 (Controller)
응용 계층 (Application layer)
비즈니스 로직을 정의하고 정상적으로 수행될 수 있도록 도메인 계층과 인프라스트럭처 계층을 연결해주는 역할을 하는 계층 (Service)
도메인 계층 (Domain layer)
비즈니스 규칙, 정보에 대한 실질적인 도메인에 대한 정보를 가지고 있으며 이 모든 것을 책임지는 계층 (Entity)
인프라스트럭처 계층 (Infrastructure layer)
외부와의 통신을 담당하는 계층 (Repository)
대칭키, 비대칭키 암호화 방식
대칭키, 비대칭키는 양방향 암호화 방식이다.
대칭키는 암호화와 복호화에 같은 암호를 쓰는 알고리즘이다.
비대칭키는 암호화와 복호화 할 때 서로 다른 키를 쓰는 알고리즘이다.
'스펙 업!' 카테고리의 다른 글
신입 개발자 포트폴리오 작성 - 2 (프로젝트 작성) (0) | 2024.06.08 |
---|---|
신입 개발자 포트폴리오 작성 - 1 (프로필 작성) (0) | 2024.06.02 |
[면접 질문] Flutter 기본 질문 (0) | 2024.03.05 |
[면접 질문] 프로그래밍 공통(그 외) 작성중 (0) | 2024.03.05 |
[면접 질문] 프로그래밍 공통(CS) 작성중 (0) | 2024.03.05 |