반응형

Developer's_til/그외 개발 공부 20

[Java] JDK8부터 등장한 Stream API

✅ Stream API란? Java는 객체지향 언어로 함수형 프로그래밍이 불가능했습니다. 하지만, JDK8부터 Stream API와 람다식, 함수형 인터페이스가 등장하면서 Java를 활용한 함수형 프로그래밍이 가능해졌습니다. 그 중 Stream API는 데이터를 추상화하여 처리하는데 자주 사용되는 함수들을 정의해두었습니다. (여기서 데이터 추상화란, 데이터의 종류와 상관없이 똑같은 방식으로 데이터를 처리할 수 있다는 것을 의미. 그만큼 재사용성을 높일 수 있음을 뜻함) 두 가지 예를 통해, Stream API를 사용하지 않은 경우와 사용한 경우를 비교해보겠습니다. 먼저, 배열이나 리스트의 데이터를 정렬하여 출력하고자 할 때, 아래와 같은 코드를 작성하게 됩니다. String[] stoneArr = {"m..

객체지향 프로그래밍(OOP)의 설계 원칙 'SOLID'

SOLID 원칙이란? 소프트웨어를 설계함에 있어 이해하기 쉽고, 유연하고, 유지보수가 편하도록 도와주는 5가지 원칙을 의미합니다. 시스템에 새로운 요구사항이나 변경사항이 있을 때, 영향을 받는 범위가 적은 구조를 만들면서 장기적으로 운영하기 위한 원칙이라고 볼 수 있습니다. 한마디로 좋은 설계를 위한 원칙 1️⃣ 단일 책임 원칙(SRP) 2️⃣ 개방-폐쇄의 원칙(OCP) 3️⃣ 리스코프 치환 원칙(LSP) 4️⃣ 인터페이스 분리 원칙(ISP) 5️⃣ 의존 역전 원칙(DIP) 1. SRP (Single Responsibility Principle) - 모든 클래스(Class)는 한 가지의 책임을 부여받아서 추후, 수정할 이유가 단 한가지여야함을 의미합니다. 즉, 클래스에 속해있는 멤버들과 메소드는 모두 공..

[Crawling] Python을 활용한 동적 웹 크롤링 구현하기

크롤링이란? 간단히 말하자면, 인터넷에 있는 정보들을 자동으로 수집하는 행위를 말합니다. 지난 9월에 데이터 수집 업무를 맡았었습니다. 예전 같았으면 인터넷에서 하나씩 검색해서 엑셀에 저장했을텐데 나름 개발자라고 크롤링하면서 편하게 업무 처리했네요. 그래서 실제로 제가 어떻게 크롤링을 업무에 활용했는지 소개해드리고자 합니다. 가장 먼저 Python과 IDE설치 및 pip를 설치해서 개발 환경을 구축했습니다. 이 부분은 직접 구글링하시는 걸 추천드립니다. 1. ChromeDriver와 Selenium 크롤링에 사용할 프레임워크는 Selenium의 webDriver입니다. webDriver를 활용하면 Python으로 가상 브라우저(Chrome)를 실행해 자유롭게 검색할 수 있는 환경이 만들어집니다. But ..

[Clean Code] 네이밍 기법, 카멜과 파스칼, 스네이크?

다양한 프로그래밍 관습들 중 변수나 클래스 이름을 정의할 때, 두개 이상의 단어를 조합하는 경우가 있다. 프로그래머들은 해당 객체가 이름만으로 어떤 역할을 하는지 알기 쉽게하기 위해 여러 방식들을 사용한다. 1) 카멜식(Camel Casing) 낙타의 모양에서 따온 방법으로 첫 단어는 소문자로 시작, 두번째 단어부터 대문자로 시작한다. ex) sumOfArray 2) 파스칼식(Pascal Casing) 카멜식과 비슷하나 차이점은 첫 단어도 대문자로 시작한다는 점이다. 하지만 특정 언어의 경우 관습적으로 클래스명만 대문자로 시작하는 규칙이 있기 때문에 유의하자. ex) SumOfArray 3) 스네이크식(Snake Casing) 각 단어를 Under bar를 활용해 이어붙인다. "_" ex) sum_array

[객체지향] Java를 Java스럽게

class Solution { public int solution(int n) { int answer = 0; return answer; } } 프로그래머스를 자주 이용하는 분들이라면 위 코드가 무엇인지 알 것이다. 알고리즘 문제에 들어가서 언어를 Java로 선택하면 나오는 기본 템플릿이다. 평소에는 solution함수에 로직을 작성하고 모듈별로 메소드를 만들어서 풀이했는데, 이제는 좀 더 Java스럽게 문제를 풀고 있다. class Solution { public static int solution(int n) { int answer = 0; return answer; } public static void main(String[] args) { int n = 0; solution(n); } } 무슨 차..

컴파일러와 인터프리터의 차이?

대표적인 둘의 차이로 컴파일러는 전체 소스코드를 한 번에 번역하고 인터프리터는 소스코드의 각 행을 연속적으로 번역하여 실행한다. 이 정도는 쉽게 기억할 수 있는 둘의 차이지만 좀 더 깊게 살펴보고 이해하겠다. 컴파일러의 특성 작성된 소스코드를 한번에 번역 한 번 번역을 하면 실행 파일(목적 파일)을 생성해 메모리에 저장 다음 실행 시, 저장된 목적 파일을 실행하기 때문에 실행 시간 단축. 인터프리터의 특성 고레벨 언어를 중간 코드(Intermediate Code)로 변환해 이를 각 행마다 실행. 일반적으로 컴파일러에 비해 실행시간이 느림. 하지만, 각 행을 실행하는 도중 에러 발생 시, 이후 작성된 코드를 살펴보지 않음 보안적인 관점에서 도움이 됨. 자바를 통해 컴파일러와 인터프리터의 차이를 다시 알아보..

Python을 활용한 KNN 알고리즘

이전 포스팅에서는 머신러닝의 비지도학습 중 대표적인 Clustering을 다뤄봤습니다. 이번에는 머신러닝의 지도학습에 해당하는 KNN 알고리즘에 대해 알아보겠습니다. KNN 알고리즘은 최근접 이웃 알고리즘이라고도 합니다. 새로운 데이터를 입력받았을 때, 이 데이터와 가장 근접한 데이터들의 종류가 무엇인지 확인하고 해당 그룹으로 분류하는 알고리즘입니다. KNN은 아래처럼 3단계에 걸쳐 진행됩니다. 1. 주변 데이터 간의 거리계산하기 2. 가장 근처에 있는 요소 뽑기 3. 분류되는 군집 예측하기 위 그림은 KNN알고리즘의 동작 과정으로 신규 데이터(흰색)가 K값에 따라 분류되는 군집을 Prediction으로 확인할 수 있습니다. 다만, K를 너무 작게 설정하면 과적합이 우려되며 너무 크게 설정하면 데이터 구..

Python을 활용한 K-means Clustering

클러스터링은 비지도 학습기법으로 유사한 유형의 데이터를 그룹화함으로써 숨겨진 구조를 파악합니다. 클러스터링을 활용하면 추천 엔진, 검색 엔진, 시장 세분화 등을 구현할 수 있습니다. K-means Clustering이란? "K"는 주어진 데이터를 그룹화할 수 즉, 클러스터 개수를 말합니다. "Means"는 각 클러스터의 중심과 데이터들의 평균 거리를 의미합니다. 이 때, 클러스터의 중심을 centroids라고 합니다. K-means 알고리즘은 다음과 같은 과정을 수행합니다. 1. 데이터셋에서 K개의 centroids를 임의로 지정. 2. 각 데이터들을 가장 가까운 centroids와 같은 그룹으로 할당. 3. 2번 과정에서 할당된 결과로 centroids를 다시 지정. 4. 2~3번 과정을 반복하면서 c..

[Java] Scanner와 BufferedReader, 뭘로 입력할까?

Scanner와 BufferedReader의 가장 큰 차이점은 속도입니다. 숫자 100만개를 입력받는데 걸리는 속도는 Scanner는 약 2.5ms / BufferedReader는 약 0.4ms 나머지 차이점은 다음과 같다. 버퍼크기 : Scanner(1024 chars), BufferedReader(8192 chars) 문자열 : Scanner는 문자열을 구분하여 분석, BufferedReader는 문자열을 단순히 읽고 저장 동기화 : Scanner은 동기화x, BufferedReader는 동기화가 가능 BufferedReader는 InputStreamReader에 버퍼링 기능이 추가된 class입니다. 일정한 크기의 데이터를 한 번에 읽어와 버퍼에 보관, 사용자의 요청이 있을 때 버퍼에서 데이터를 읽..

String, StringBuilder, StringBuffer의 차이?

1. String 과 StringBuilder, StringBuffer String과 StringBuilder, StringBuffer의 차이는 동일 객체 내에서 변경이 가능한지의 여부입니다. 먼저, String은 불변의 속성을 갖습니다. String str = "hello"; str += " world"; str에 world를 추가할 경우, str은 "hello world"라는 새로운 메모리 영역을 가리키게 됩니다. 이때, "hello"는 Garbage로 남아 GC에 의해 사라지게 됩니다. 만약, 문자열의 수정이 빈번할 경우 힙 영역에 임시 Garbage가 쌓여서 메모리 부족이 발생할 수 있습니다. StringBuilder sb = new StringBuilder(); sb.append("a"); sb..

반응형