01. 클라이언트 / 서버
● 클라이언트 (Client) / 서버 (Server)
- 네트워크를 통해 데이터를 주고받는 소프트웨어 혹은 기계장치를 의미
- 두 개의 기계장치 혹은 소프트웨어의 역할 관계를 의미
- 클라이언트 : 웹 사이트에서 정보를 검색할 때 해당 정보를 요청하는 것
- 서버 : 요청을 받아 정보를 제공하는 것
● 클라이언트
- 서버와 대응되는 개념으로, 특정 서비스를 이용하는 사용자 (고객) 을 의미함
- 컴퓨터 네트워크에서 고객인 클라이언트는 서버로부터 다양한 데이터를 요청하고 서버가 보내준 데이터를 처리하여 사용자가 볼 수 있게끔 함
● 서버
- 컴퓨터 네트워크를 통해 클라이언트로부터 요청받은 데이터를 찾아 다시 넘겨주는 일을 함
● 특징
- 1 : N 관계
-- 일반적으로 서버와 클라이언트는 일대일 (1 : 1) 관계가 아니라 일대다 (1 : N) 관계임
-- 물론 서버도 여러개로 구성되지만, 각 서버는 다수의 클라이언트에게 서비스를 제공함
- 상황에 따라 바뀌는 역할
-- 클라이언트와 서버는 고정적인 개념이 아닌 역할적인 개념
-- 상황에 따라 관계가 언제든지 바뀔 수 있음
- 누구나 될 수 있는 서버
02. 네이티브 앱 / 웹 앱 / 하이브리드 앱 / 크로스 플랫폼
● 앱을 개발하는 대표적인 네 가지 방식
● 네이티브 앱 (Native App)
- 우리가 스마트폰 앱으로 인식하고 있는 가장 보편적인 앱
● 웹 앱 (Web App)
- 네이티브 앱과는 완전히 상반되는 개념
- 모바일 웹, 즉 웹 사이트와 같은 개념
- 웹 앱은 모바일 웹을 앱처럼 디자인하여 마치 스마트폰에서 앱을 사용하는 것과 같은 사용자 경험을 제공하는 것이 목적
● 하이브리드 앱 (Hybrid App)
- 네이티브 앱의 장점과 웹 앱의 장점을 결합한 혼합형 모바일 앱
- 기본적으로 네이티브 앱이며, 네이티브 앱 내에서 웹 뷰를 실행시켜 서비스를 제공하는 방식
● 크로스 플랫폼 (Cross-Platform)
- 리액트 네이티브 (React Native), 플러터 (Flutter), 자마린 (Xamarin) 같은 개발 환경에서 하나의 프로그래밍 언어를 사용해 한 번의 개발로 안드로이드와 iOS 모두에서 동작하는 네이티브 앱을 만드는 방식
03. 컴파일 / 인터프리트
● 컴파일 (Compile) / 인터프리트 (Interpret)
- 개발자가 구상한 프로그램을 실행하기 위해 입력한 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 과정을 의미
- 빌드 (build) 라고 부르기도 함
● 기계어 번역 과정 : 컴파일
- 작성한 소스코드를 입력받으면 일련의 과정을 거쳐 실행 파일로 변환되는데 이때 입력받은 소스코드를 통째로 번역해 주는 것
- ex. C, C++
● 기계어 번역 과정 : 인터프리트
- 작성한 소스코드를 입력받으면 한 줄 (명령) 단위로 번역과 명령을 동시에 실행
- ex. Python, Ruby
● 기계어 번역 과정 : 하이브리드
- 먼저 컴파일러를 사용한 뒤 인터프리터를 사용해 소스코드를 번역하는 방식
- 컴파일 과정을 거쳤을 때 기존 컴파일 과정처럼 목적코드가 생성되는 것이 아니라, 바이트 코드라는 다른 형태의 파일이 만들어짐
- 이 바이트 코드를 이해하면서 일종의 인터프리터 역할을 하는 가상 컴퓨터 (VM) 를 통해서 바이트 코드를 번역해 프로그램을 실행시킴
- ex. java
● 컴파일 빌드 세부 과정
1. 전처리 (Pre-processing)
-- 주석을 제거하거나 #지시문에 따라 헤더 파일을 삽입하는 과정
2. 컴파일 (Compilation)
-- 소스코드를 어셈블리어로 번역하는 과정
-- 고수준 언어 ▶ 저수준 언어
3. 어셈블리 (Assembly)
-- 어셈블리어로 번역된 파일을 오브젝트 파일로 변환하는 과정
-- 저수준 언어 ▶ 기계어
4. 링킹 (Linking)
-- 링커를 통해 오브젝트 파일들을 묶어 실행 가능한 파일로 만드는 과정 (exe 확장자)
04. 디자인 패턴
● 디자인 패턴 (Design Pattern)
- 객체 지향 개발자들이 개발 중에 발생한 문제들을 개선하여 놓은 해결 방법들
- 총 23 가지의 Gof (Gang of Four) 객체 지향 디자인 패턴이 있음
● 생성 패턴
- 빌더 (Builder) 패턴
-- 매개변수를 순서대로 입력하지 않아도 생성자를 만들 수 있는 패턴
- 싱글톤 (Singleton) 패턴
-- 하나의 앱에 하나의 인스턴스만 생성되게 하는 패턴
- 프로토타입 (Prototype) 패턴
-- 원래 만들어진 인스턴스를 복사해서 새로운 인스턴스를 만드는 패턴
- 팩토리 메소드 (Factory Methods) 패턴
-- 객체 생성에 대한 정의만 선언해 놓고 자식 클래스에서 메소드를 통해 실제 객체를 생성하는 패턴
- 추상 팩토리 (Abstract Factory) 패턴
-- 인터페이스를 사용하여 자식 팩토리 클래스에서 실제 객체를 생성하는 패턴
● 구조 패턴
- 경량 (Flyweight) 패턴
-- 여러 개의 작은 객체를 생성하고 최대한 공유해서 작은 객체들을 매번 생성하지 않고 절약하는 패턴
- 어댑터 (Adapter) 패턴
-- 사용하는 클래스와 연관이 없는 다른 클래스의 인터페이스를 사용하는 클래스의 인터페이스로 변환하여 사용 가능하게 해 주는 패턴
- 프록시 (Proxy) 패턴
-- 원본 객체를 생성하기 전에 임시로 객체를 생성하는 패턴
- 퍼사드 (Facade) 패턴
-- 하나의 객체에서 다른 여러개 객체의 메소드를 각각 실행시켜야 할 때 하나의 메소드에 담에 한 번에 실행시키는 패턴
- 데코레이터 (Decorator) 패턴
-- 원래 객체를 변경하지 않고 추가적인 기능을 확장할 때 사용하는 패턴
- 컴포지트 (Composite) 패턴
-- 객체들을 트리 구조로 구성하여 복합 객체와 단일 객체의 처리과정이 같을 때 사용하는 패턴
- 브리지 (Bridge) 패턴
-- 인터페이스를 구현하는 구현 클래스 계층과 기능 (메소드) 를 생성하는 클래스 계층을 분리해서 사용하는 패턴
● 행동 패턴
- 전략 (Strategy) 패턴
-- 같은 명령을 내려도 어떤 객체를 사용하는지에 따라 결과가 달라지는 패턴
- 옵저버 (Observer) 패턴
-- 관찰하는 클래스에서 관찰당하는 객체들을 리스트 형태로 보관하고 상태가 변경되었을 때 관찰 당하는 모든 객체에게 특정 메소드를 발생시키는 패턴
- 이터레이터 (Iterator) 패턴
-- 어떤 집합의 내부를 알지 못하더라도 집합이 가지고 있는 원소들에 순서대로 접근하는 패턴
- 템플릿 메소드 (Template Method) 패턴
-- 추상 클래스에서 메소드를 선언하여 상속받는 클래스들의 메소드를 구현하게 하는 패턴
- 커맨드 (Command) 패턴
-- 명령했을 떄 실행 내용을 객체로 캡슐화하여 실행되게 하는 패턴
- 인터프리터 (Interpreter) 패턴
-- SQL 처럼 문법적인 언어를 해석하는 패턴
- 중재자 (Mediator) 패턴
-- 객체들이 중재자 객체를 통해서만 통신할 수 있게 제한하는 패턴
- 메멘토 (Memento) 패턴
-- 이전 객체 상태를 기억하고 불러오는 패턴
- 상태 (State) 패턴
-- 특정 상황에 따라 작동되는 방식을 정해 놓는 패턴
- 방문자 (Visitor) 패턴
-- 정보를 담는 객체와 작업을 담당하는 개체를 분리하는 패턴
- 책임 연쇄 (Chain of Responsibility) 패턴
-- 요청을 받았는데 어떤 객체가 처리해야 할지 모를 때 처리하는 객체들을 사슬처럼 묶어 놓고 다음 객체들에게 책임을 떠넘기는 방법
05. 함수형 프로그래밍
● 함수형 프로그래밍
- 선언형 패러다임을 따르면서 함수의 응용을 강조한 방식
- 가변 데이터를 멀리하는 프로그래밍 페러다임
- 함수형 코드에서 함수의 출력값은 그 함수에 입력된 매개변수, 즉 인자에만 의존하여 같은 인자값을 넣으면 항상 같은 결과가 나옴
● 특징
- 불변성
-- 데이터는 항상 불변
- 순수성
-- 부작용 (side effect) 이 없는 특성
- 익명함수
-- 이름이 없는 함수
- 고차함수
-- 함수를 다루는 함수
- 재귀
-- 재귀 : 함수가 자기 자신을 반복 호출
06. 객체 지향 프로그래밍
● 객체 지향 프로그래밍 (Object-Oriented-Programming)
- 여러 개의 독립적인 단위인 객체들의 모임으로 파악
- 순서대로 코드가 실행되는 절차 지향 프로그래밍의 단점을 보완
● OOP 구성요소
- 클래스 (Class)
-- 같은 종류의 집단에 속하는 속성과 행위를 정의한 것
-- 객체를 만들기 위한 설계도
- 객체 (Object)
-- 클래스의 인스턴스
-- 인스턴스 : 실제로 메모리상에 할당된 것
-- 객체는 자신의 고유 속성을 가지며 클래스에서 정의한 행위를 수행 가능
- 메소드 (Method)
-- 클래스로부터 생성된 객체를 사용하는 방법
-- 객체에 내리는 명령
-- 객체의 속성을 조작하는 데 사용됨
● OOP 특징
- 상속성 (Inheritance)
-- 자식 클래스에 반복적으로 중복된 코드를 작성할 필요 없이 부모 클래스에만 선언해 두고 코드를 재사용해 유지 보수성이 매우 편리
- 다형성 (Polymorphism)
-- 때로는 자식 클래스에서 부모 클래스의 속성이나 메소드를 상속받아서 사용하되, 해당 자식 클래스만이 가지고 있는 독특한 속성이나 행위들이 추가로 있을 수 있음
-- 이때 활용되는 것이 메소드 오버라이딩 (overriding)
-- 이름이 동일한 메소드에 매개변수의 여러 타입, 개수, 순서를 지정해 다양한 형질의 특성을 가질 수 있도록 부여한 것을 메소드 오버로딩
- 정보 은닉성 (Information Hiding)
-- 보안이 중요한 정보들은 잘 숨겨서 외부에서 접근하거나 조작하지 못하게 만들어야 함
-- public : 어디에서나 접근 가능
-- private : 해당 클래스 내부에서만 접근 가능
-- protected : 해당 클래스 + 상속관계에서만 접근 가능
07. 오버로딩 / 오버라이딩
● 오버로딩 (Overloading)
- 같은 이름의 메소드를 자료형만 다르게 하여 사용하는 것
● 오버라이딩 (Overriding)
- 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하여 사용하는 것
08. TDD
● TDD (Test-Driven Development)
- 소프트웨어 개발방법론 중 하나
- Red, Green, Refactor 총 3 단계의 사이클을 가지고 있음
- Red 단계
-- 개발하려는 것이 무엇인지 고려하고 먼저 테스트 코드를 작성함
- Green 단계
-- 테스트 코드를 성공시키기 위한 최소화된 코드를 작성
- Refactor 단계
-- Green 단계에서 구현된 최소화된 코드로 중복 코드 제거, 효율적인 개선 등을 고려하여 리팩토링을 수행하고 구조화함
- 기능 개발 전 테스트 코드를 먼저 작성하는 테스트 주도 개발 방식
- Production Code 를 작성하기 전에 단위 테스트를 작성한 다음 코드를 리팩토링 함
● Unit Test
- 하나의 함수 또는 메소드에 대한 테스트 케이스 (Test Case) 를 작성하는 절차
● 일반 개발 방식 vs TDD 개발 방식
09. RPA
● RPA (Robotic Process Automation)
- 단순 반복 업무를 대신해 주는 로봇 (소프트웨어)
- 은행, 금융, 보험, 기업, 물류 산업 등에서 사용
● 특징
- 고급 프로그래밍 기술이 필요 X
- 비용이 적게 든다
- 보안성이 뛰어남
● 대표적인 RPA 툴
- UiPath / Brity RPA / AutomationAnywhere / Power Automation
● 사용 이유
- 인건비 절감
- 생산성 향상
- 뛰어난 정확도와 보안
참고문헌
● 개발자가 되기 위해 꼭 알아야 하는 IT 용어 : https://product.kyobobook.co.kr/detail/S000061352646