Programming Language
[Java] 스트림과 병렬 실행
[Java] 스트림과 병렬 실행
2023.08.02데이터 컬렉션을 병렬로 처리하려면 데이터를 작은 단위로 분할하고 분할된 서브파티를 각각의 쓰레드로 할당해서 실행해야 한다. 이 과정에서 쓰레드의 Race Condition이 발생하지 않도록 동기화 해 줘야 하고, 각 쓰레드의 작업 결과를 합쳐 줘야 한다. 몇 개의 쓰레드를 사용하고 결과 변수는 어떻게 동기화 해야 하는지도 함께 고려해 줘야 한다. 스트림은 순차 스트림을 병렬 스트림으로 바꾸는 기능을 제공한다. 스트림을 사용해 병렬 작업을 구현해보자. 컬렉션에서 parallelStream을 호출하면 병렬 스트림이 생성된다. 병렬 스트림은 각각의 쓰레드에서 처리할 수 있도록 스트림 요소를 여러 덩어리로 분할한 스트림으로, 멀티코어 프로세서가 각 덩어리를 처리하도록 할당할 수 있다. public long pa..
[Java] 컬렉션과 스트림
[Java] 컬렉션과 스트림
2023.08.01스트림은 데이터의 흐름을 나타내고, 흐름에 다양한 연산을 수행한다. 선언형으로 컬렉션 데이터를 처리할 수 있고, 이 작업을 병렬로 처리할 수 있다. List expensiveCarNames = cars.stream() .filter(car -> car.getPrice() > 1000) .sorted(Comparator.comparing(Car::getPrice)) .map(Car::getName) .collect(Collectors.toList()); List expensiveCarNames2 = cars.parallelStream() .filter(car -> car.getPrice() > 1000) .sorted(Comparator.comparing(Car::getPrice)) .map(Car::ge..
[Java] 람다 표현식
[Java] 람다 표현식
2023.06.09코드를 간결하게 작성하고 중복을 최대한 피하기 위해 사용한다. 어떤 메서드를 구현한다고 해 보자. 확장성을 열어놓기 위해 특정 비즈니스 요구사항이 추가됐을 때 쉽게 수정하고 추가할 수 있어야 한다. 이를 위해 값을 메서드의 파라미터로 넘기는 것 보다 동작을 메서드의 파라미터로 넘기는 편이 합리적이다. package Parameter; public class Apple { private String color; priavet String weight; public Apple(String color, String weight) { this.color = color; this.weight = weight; } public String getColor() { return color; } public String..
[C++] 예외처리
[C++] 예외처리
2022.12.18C++ 에서 를 include하면 특정 데이터 타입이 표현할 수 있는 최대 / 최소 범위를 구할 수 있다. int 나 long 타입으로 변수를 지정하고, 해당 데이터 타입이 표현할 수 있는 수를 넘어선 수를 저장하면 어떻게 될까? 코드를 실행하는 환경에 따라 다르지만, 이 경우는 undefined behavior이다. (언어에 정의 돼 있지 않다) unsigned의 경우는 좀 다르다. undefined behavior가 아니다. unsigned의 경우 표현할 수 있는 수를 넘어선 수는 wrap around로 처리된다. unsigned 데이터 타입을 다루지 않는 경우 항상 undefined behavior에 의존해서 프로그램을 작성할 수 없으니 오버플로우나 언더플로우가 발생할 수 있는 연산은 연산 전에 체..
[C++] Template
[C++] Template
2022.12.17C++은 Template을 통해 Generic Programming을 지원한다. (Compile time Polymorphism) (제네릭 프로그래밍은 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식 - 위키백과) C++에서 Template은 class 와 function으로 나뉜다. 1. Class Template 클래스들이 여러 개 있는데 자료형만 다른 경우 template을 적용해 간단하게 표현할 수 있다. (template 선언 시 넘겨주는 type-parameter-key 값인 typename과 class는 같은 역할을 한다) 컴파일러는 Pair 와 Pair을 보고 template을 참고해 해당하는 ..
[C++] STL
[C++] STL
2022.12.15Standard Template Library. C++에 이미 정의돼있는 라이브러리를 의미한다. STL에는 데이터를 저장하는 객체인 Container / 여러 가지 편리한 메서드를 제공하는 Algorithm과 Functions / Container의 객체를 가리키는 Iterator 로 총 4가지 종류가 있다. 이 중 Container에 대해 살펴보자. 1. Array int arr[10]; 에서 사용하는 C-style 배열과는 다르다. 왼쪽과 같이 Random Access 방식으로 요소에 접근 할 때는 오류를 뱉지 않지만, 오른쪽과 같이 array STL을 사용해서 요소에 접근 시 오류를 뱉는다. 런타임 시간에 invalid index를 체크해준다. 2. vector vector 컨테이너 내부 요소들은 ..
[JavaScript] BOM
[JavaScript] BOM
2022.12.09Browser Object Model 으로 웹 브라우저에서 웹 페이지를 제외한 모든 객체들을 의미한다. 그림은 BOM의 구조를 보여준다. window 객체가 최상단에 위치하고 그 아래 document / screen / location / history / navigator가 위치한다. document는 Document Object Model 부분에서 자세히 알아봤으니.. 다른 요소들에 대해 알아보자. window 객체에는 전역 변수로 선언한 모든 요소들이 포함된다. 모든 객체의 근원이 되기 때문에 window를 생략해서 사용하기도 한다. (window.document.get... -> document.get...) screen screen 객체를 통해 화면의 크기와 지원하는 색상 등을 알 수 있다. l..
[C++] Design Pattern
[C++] Design Pattern
2022.11.24클래스와 객체의 관계를 어떻게 구성해야 할까? 이런 상황에서 클래스는 어떻게 구성해야 할까? 위와 같이 자주 발생하는 문제에 대한 정리된 해결책을 디자인 패턴이라고 한다. 디자인 패턴은 문제 해결의 방법론이고, Paradigm에 맞춰서 정의된다. (함수형 언어의 paradigm, 객체지향 언어의 paradigm) 몇 가지 디자인 패턴에 대해 알아보자. Singleton 클래스가 하나의 인스턴스만을 가지도록 한다. 클래스의 생성자를 private 접근제어자로 정의하고, instance를 static 으로 정의해 어디서든지 해당 instance로 접근할 수 있되, 인스턴스의 생성은 단 한 번만 진행되도록 한다. Builder 복잡한 객체를 한 단계씩 생성한다. 생성해야 하는 객체가 복잡해지면 생성자로 넘겨야..
[JavaScript] function
[JavaScript] function
2022.11.231. function 키워드 자주 사용하는 방식이다. 2. Literal function 키워드로 함수를 정의한 후 해당 함수를 사용하는 경우가 많지만, 리터럴 방식으로도 함수를 정의할 수 있다. 리터럴 방식을 사용할 때는 익명 함수를 사용한다. x(4, 3) 을 실행 시 12를 반환한다. 3. Constructor 자바스크립트의 built_in 함수인 Function을 사용해 함수를 정의할 수 있다. 4. Self Invoking 정의 후 스스로를 호출한다. 재사용 할 수 없다. 5. lambda (arrow) 람다식을 사용해 함수를 간단하게 표현 할 수 있다. 인자가 하나면 괄호를 생략할 수 있지만 인자가 없거나 두 개 이상인 경우는 괄호를 생략할 수 없다. Hoisting 자바스크립트는 다른 언어와..
[C++] 정리 (1)
[C++] 정리 (1)
2022.11.231. cast / dispatch Dynamic cast / Dynamic dispatch Static cast / Static dispatch 제대로 정리하자. cast 는 형변환이고 dispatch는 함수 호출이다. static은 컴파일 시간이고 dynamic은 런타임 시간이다. 위의 부분을 제대로 짚고 다시 공부하자. 2. 함수, 메서드, 프로시저 셋 다 프로그램의 일부비슷한 의미라서.. 혼용해서 사용해도 괜찮다. 맥락에 따라 다르게 사용하기도 한다. 클래스 안에 있으면 메서드, 호출하는건 함수로 부른다. 함수와 프로시저는 같이 사용하는 편이다. (https://murphymoon.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80procedure-%E..
[JavaScript] Object
[JavaScript] Object
2022.11.22let something = { a : 'A', b : 'B', }; 원시 타입의 값들은 변경할 수 없지만, 객체는 변경할 수 있다. 객체는 위와 같이 프로퍼티 키와 프로퍼티 값들로 이루어져 있으며, 프로퍼티 값으로는 자바스크립트에서 사용하는 모든 값이 해당될 수 있다. (함수 포함) 자바와 C++같이 클래스를 중심으로 객체를 생성하고 인스턴스화하는 클래스 기반 언어들에 반해, 자바스크립트는 프로토타입 기반 객체지향 언어로서 자바와 C++과는 다른 방법으로 객체를 생성한다. let something = { a : 'A', b : 'B', }; console.log(something); console.log(something.a); console.log(something['a']); 위와 같이 객체 리터럴..
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance
2022.11.22객체지향 언어에는 같은 signature를 가진 함수를 여러 개 정의할 수 있다. (signature 가 다르면 다른 함수이다) 이를 function overloading 이라고 부르고, 여러 함수 중 어떤 함수가 호출될지는 컴파일 시간에 정해진다. 여기까지는 지난번에 배웠고.. 이번에 살펴볼 function overriding 은 부모에서 정의된 함수를 자식이 새로 정의하는 작업이다. 함수를 사용할 때 어떤 함수가 불리는지는 런타임 시간에 정해진다. 즉, Dynamic dispatch를 사용한다. 런타임 시간에 불리는 함수가 결정되는 경우를 Dynamic dispatch 라고 부른다. 런타임 오버헤드가 있어 성능은 떨어질 수 있지만 코드를 훨씬 효과적으로 작성할 수 있어 상황에 맞춰서 사용한다. C++..