프로그래밍 언어 정리 (14) 썸네일형 리스트형 [Java] 스레드 동기화 동기화멀티 스레드에서 스레드끼리는 stack area를 제외하고 메모리를 공유한다.공유 자원에 접근하는 경우, 스레드끼리 race condition이 발생하여 정합성을 보장할 수 없다.이를 위해 상호 배제 (Mutual Exclusion: Mutex)를 사용하여 공유 자원이 존재하는 구역(Critical Section)에는 하나의 스레드만 접근 가능하도록 해야 한다. → 동기화해야 한다.Java에서는 synchronized 키워드를 사용하여 해결할 수 있다.synchronizedsynchronized를 사용하는 방식은 여러 가지가 있다.적당한 예시를 통해 이해하는 것이 더 나을 것 같아서 밑에서 설명하도록 하겠다.몬스터 잡기 예제개별 플레이어는 스레드로 존재한다.멀티 스레드를 사용하여 두 플레이어는 독립.. [Java] 스레드 스레드스레드 자체에 대한 개념은 이 글에서Java 스레드는 JVM 메모리 영역에서 Stack area만 고유하게 갖고 Heap, Method(static) area는 공유한다.Thread Class vs Runnable Interface스레드를 생성할 때는 Thread Class를 상속하거나 Runnable 인터페이스를 구현하여 생성할 수 있다.일반적으로 Runnable 인터페이스를 사용하는데, 그 이유는 다음과 같다.Thread Class는 스레드를 관리하는 클래스이다. 해당 클래스에 스레드 로직을 심어두는 행위는 단일 책임 원칙에 위배될 수 있다.Java에서는 다중 상속을 지원하지 않기 때문에 Thread Class를 상속받으면 다른 클래스로부터 상속을 받을 수 없다.Executors가 Runnabl.. [Java] JVM, JRE, JDK JVM자바를 실행시키는 가상 머신JVM만 설치되어 있다면 OS와 관계없이 Java 프로그램을 실행시킬 수 있다. (높은 이식성)JVM은 운영체제에 종속됨자바 컴파일러에 의해 바이트 코드(.class)가 컴파일되고, JVM이 이를 읽어서 바이너리 코드(기계어)로 변환한다. (느리다)JREJVM + 각종 라이브러리(Util, Lang, JDBC 등)가 포함된 자바 실행 환경JDK자바 개발 키트: 자바로 개발에 사용되는 SDK자바로 개발하기 위한 JRE, Development Tool(javac, javap, jar, java 등)이 들어있다.4가지의 버전 존재Java SE: 표준 버전Java EE: 기업용 버전. 서버 개발에 주로 사용Java ME: 임베디드 버전Java FX: GUI 버전Reference블로그 [C/C++] 포인터와 상수 int i1 = 1; int i2 = 2; const int* p1 = &i1; int* const p2 = &i2; 상수 키워드 const와 포인터를 쓰다보면 같아 보이지만 위의 코드처럼 다른 두 가지 경우가 등장합니다. p1의 const는 p1이 참조하는 i1의 값을 바꾸지 못하게 합니다. p2의 const는 p2가 값을 바꾸지 못하게 합니다. 말로만 보면 어려우니 코드로 확인해보겠습니다. #include using namespace std; int main() { const char * s1 = "Hello"; int i1 = 1; int i2 = 2; const int* p1 = &i1; int* const p2 = &i2; int i3 = 3; int i4 = 4; (*p1) = 11; // 이.. [C/C++] bad_array_new_length 백준 5836번 문제를 풀어서 제출했는데 segfault가 나왔습니다. 어느 정도 간 거 보니까 로직은 맞았는데... 무엇을 놓쳤을까 이런저런 확인을 하다가 큰 입력이 주어졌을 때 해당 콜을 뱉고 코드가 종료되었습니다. chat gpt말고도 더 검색해보니... sort를 할 때 벡터가 매우 크거나, 사이즈로 음수를 참조하는 일이 발생하면 위와 같은 에러를 발생시킨다고 합니다. 벡터가 동적이다 보니 이런 일이 발생합니다. 문제는 벡터의 크기는 900미만에 내부벡터의 크기도 약 10내외정도로 큰 크기는 아니었습니다. 또 cmp를 빼주니 멀쩡히 돌아갑니다. 벡터의 크기가 크지 않았음을 이용하여 직접 선택정렬을 구현하는 방식으로 문제를 해결하였습니다. 추론을 해보자면 다차원 벡터이면서, 직접 정렬방법을 구현하고.. [C/C++] call by value, call by address(pointer), call by reference reference / not reference reference == not copy not reference == value, address == copy ∴ call by value => value copy call by address => pointer copy call by reference => reference [C++] NULL과 nullptr NULL과 0은 다릅니다. NULL은 포인터이고 0은 int이니 사실은 비교도 되지 않습니다. NULL과 NOT NULL로 나뉘고, 0은 그저 NOT NULL에 불과합니다. [NULL] 초기화조차 안 한 상태. 포인터 변수에 넣어서 0 주소를 넣는 용도로 사용할 수도 있지만 일반 변수에도 넣을 수 있습니다. 분명 위에서 NULL은 포인터라고 했는데 일반 변수에 들어간다니 조금 의아합니다. 아래에서 확인해 봅시다. #include using namespace std; int main(void) { int a = NULL; // 가능 int* b = NULL; // 가능 cout [기초 다지기 - 3] 람다 표현식 함수형 프로그래밍을 통해 함수를 하나의 표현식으로 나타낸 것이 람다 표현식입니다. 익명함수이고, 사용하면 코드가 간결해지고, 재사용이 불가능하고, 그 외에도 함수형 프로그래밍의 특징과 장단점을 갖고 있습니다. 함수형 프로그래밍에 대한 내용은 다른 글에서 따로 설명하겠습니다. 알고리즘 문제풀이를 하다 보면 객체를 정렬하는 상황이 많이 생기는데, 이를 람다 표현식을 이용해 코드를 작성하겠습니다. 클래스 타입 배열의 객체들을 정렬하는 방법으로는 두 가지 방법이 있습니다. 클래스 내에서 정의한 우선순위를 적용시키는 방법 (기초 다지기 - 2: 클래스에서 구현) 클래스 외부에 작성한 함수를 이용해 우선순위를 적용시키는 방법 2번 방법을 람다 표현식으로 구현하였습니다. 추가로 이 글에서는 람다 표현식을 전부 변수에.. 이전 1 2 다음 목록 더보기