분류 전체보기 176

[디자인 패턴] 정적 팩토리 메서드 (Static Factory Method)

🖍️ new 키워드의 단점?우리는 객체를 생성할 때 보통 new 키워드로 직접 생성자를 호출해서 생성한다.Calc c = new Calc(); new 키워드는 간단하지만 단점이 존재한다.읽기 어려운 생성자생성자의 매개 변수가 많아지면 읽기가 힘들고 유지 보수가 어렵다.객체의 특징을 파악하기 어려움생성자의 이름은 바꿀 수 없으므로 생성되는 객체의 목적과 의미를 구분지을 수 없다. 예) new Calc(int x, int y);와 new Calc(int x, int y, int z); 둘은 성격이 다르지만 모두 Calc라는 이름의 생성자를 사용객체 제어 불가생성자는 응집도를 높이기 위해 내부에 코드를 구현하지 않는 것이 권장된다.따라서 생성자 내부에 객체 생성 로직을 두기 어려우므로 객체 생성 과정을 제어..

CS 2025.01.08

[백준/Java] 4963번 : 섬의 개수

✏️ 문제 탐색https://www.acmicpc.net/problem/4963 섬과 바다 지도가 주어졌을 때, 섬의 개수를 세는 문제이다.섬이 가로 세로 대각선으로 붙어있는 경우 연결되어있는 땅으로 보고 하나의 섬으로 간주한다.대각선도 가능하다는 것에 주의하자✏️ 구현 아이디어 / 알고리즘 연결된 섬을 하나로 count하기 위해서는 인접한 곳이 섬인지 확인해야 한다.인접 노드를 가까운 depth부터 탐색해나가는 bfs를 사용하는 것이 적절해보인다.✏️ 시간복잡도한 번 방문한 곳은 다시 방문하지 않으므로 시간 복잡도는 O(N) (N=노드 개수)이며,지도의 너비w와 높이h가 각각 50 이하이므로 노드 개수는 최대 50*50=2,500개로 시간 안에 연산 가능하다.✏️ 코드 설계(0,0)에서 시작하여 인접한..

코테 2025.01.07

[백준/Java] 1326번 : 폴짝폴짝

✏️ 문제 탐색https://www.acmicpc.net/problem/1326 a번째 징검다리에서 b번째 징검다리까지 가는 데 최소 몇 번의 점프가 필요한지 구하는 문제이다. 개구리가 왼쪽, 오른쪽 방향 모두 움직일 수 있다는 것에 주의처음에는 앞으로만 움직일 수 있다고 생각하고 다음과 같이 아이디어를 떠올렸다.더보기더보기현재 위치에서 b번째 징검다리까지 갈 수 있는지 확인하는 과정을 반복하여 답을 구할 수 있다.현재 숫자 > b까지의 거리1배 길이만큼 점프해도 b보다 멀리 가버리므로 b에 도달할 수 없다. 따라서 -1 출력현재 숫자 (b까지의 거리/현재 숫자)만큼 점프 횟수를 count하고 현재 위치를 갱신하여 계속 비교b에 다다랐다면 점프 횟수 출력 ✏️ 구현 아이디어143 5 2 6 4 3 3 7..

코테 2025.01.06

[네트워크] Server-Sent Event

🔈 알림 기능 구현 방법 4가지Short-Polling클라이언트가 서버에 짧은 주기를 두고 정기적으로 새로운 이벤트가 있는지 요청을 보내는 방법서버에서 보내줄 새로운 데이터가 없어도 즉시 빈 응답을 보내고 받는 작업을 반복하기 때문에 불필요한 트래픽 발생, 비효율적Long-PollingShort Polling과 달리 새로운 이벤트가 발생하면 응답하는 방법불필요한 요청과 응답이 없어지고 보다 실시간성이 보장됨그러나 커넥션을 유지하는 동안은 서버의 리소스 지속적으로 소모응답이 없다면 timeout (보통 100~300 seconds로 설정)SSE(Server Sent Events)클라이언트가 HTTP Request 헤더로 keep-alive 요청을 하면 일정 시간 동안 연결이 유지됨연결 유지되는 동안 H..

CS 2025.01.05

[운영체제] 동시성 이슈 해결 방법 - Semaphore/Mutex

지난 포스팅에서 동시성 문제인 '레이스 컨디션'과 '데이터 레이스'에 대해 알아보았다.이번 포스팅에서는 그 해결 방법인 Semaphore과 Mutex에 대해 알아보자.동시성 이슈주요 원인 :data race데이터 접근 절차는 atomic하지 않음 (읽기->연산->쓰기)단일 코어 : 하나의 instructor 실행 중 cpu 사용 권한을 뺏기는 경우 동시에 같은 memory address 읽을 가능성 존재멀티 코어 : 여러 cpu에서 동시에 같은 memory address 읽을 가능성 존재race condition멀티 스레드 : 프로세스의 공유 데이터 사용 중 발생멀티 프로세스 : 커널 내부의 공유 데이터 사용 중 발생해결 방법 :단일 코어 : 공유 자원에 접근한 경우 계속해서 그 프로세스가 cpu를 점유..

CS 2024.12.31

[JAVA] String Constant Pool

String constant poolJava에서 문자열 리터럴을 저장하는 독립된 공간 String 객체에 값을 할당하는 방법은 두 가지가 있습니다.리터럴 대입new 키워드 사용하여 대입 String str1 = "hello"; String str2 = new String("hello"); String str3 = "hello"; String str4 = new String("hello"); System.out.println(str1==str2); //false System.out.println(str1==str3); //true System.out.println(str2==str4); //falsestr1, str3은 리터럴을 바로 대입했고 str2, str4는 new 키워드를 사용해 문자열을 대입했습니..

Java 2024.12.31

[JAVA] static 메서드에서 non-static 멤버에 접근

static 메서드는 같은 클래스의 non-static 멤버에 접근할 수 없다. 그 이유는 뭘까?non-static vs staticnon-static 멤버는 인스턴스 변수이다. 객체가 생성될 때마다 각기 다른 값을 갖는다.static 멤버는 클래스 변수이다. 클래스가 메모리에 로드될 때 단 한 번만 수행되고 모든 객체가 이 값을 공유한다.왜 static 메서드에서 non-static 접근이 안 되는가import java.io.*;class Person{ private String name; public Person(String name){ this.name = name; } static String get(){ return name; //static 함수는..

Java 2024.12.24

[운영체제] 동시성 이슈란 - Race Condition/Data Race

멀티 스레드 환경의 동시성 문제멀티 스레드 환경에서는 공유 자원에 여러 스레드가 동시에 접근하려고 경쟁하게 되는데, 이를 '동시성 문제'라고 한다. 동시성 문제의 예시로는 레이스 컨디션, 데이터 레이스가 있다. 1. 레이스 컨디션 (race condition)스레드가 실행되는 순서가 항상 보장되지 않아서 발생하는 문제. 여러 스레드가 공유 자원을 병행적으로(concurrently) 읽거나 쓸 때 자원에 접근한 순서에 따라 그 실행 결과가 바뀌는 상황이다.  (예제 1)아래 코드를 보면 main() 고루틴과 func() 고루틴이 멀티 스레드로 실행된다.그런데 만약 (1) -> (2) 순으로 수행되었다면 아무것도 출력되지 않을 것이고, (2) -> (1) 순으로 수행되었다면 'the value is 1'이라..

CS 2024.12.23

[운영체제] 프로세스 - 메모리 공간/상태(state)/문맥 교환(context-switching)/pcb/프로세스 vs 스레드

1. 운영체제운영체제는 여러 프로그램이 동시에 실행될 때, 하드웨어 자원(cpu, memory, disk, i/o devices)을 각 프로그램에게 최대한 효율적으로 분배해주는 역할을 한다. 프로세스가 연산을 하기 위해서는 cpu와 memory를 사용해야 하는데, 자원은 한정적이므로 모든 프로세스가 동시에 사용할 수 없다. 따라서 운영체제가 일정 시간마다 자원을 사용할 프로세스를 지정해준다. -오늘날 cpu는 보통 시분할 방식(time sharing)을 따른다.운영체제는 사용자가 하드웨어 자원에 접근하기 위한 인터페이스를 제공해주기도 한다. 사용자는 GUI 또는 CLI를 통해서 os에게 명령을 내릴 수 있다. 운영체제는 하드웨어의 device driver를 사용해서 프로세스가 하드웨어 장치를 사용할 수 ..

CS 2024.12.20

[운영체제] 하드웨어 - 불 논리/불 연산/가산기(adder)

1부 하드웨어이 책을 앞에서부터 읽으면 컴퓨터 시스템을 bottom-up으로 설명한다. 그러나 각 장을 순서대로 읽지 않아도 된다. 컴퓨터 시스템을 구현할 때 가장 기본적인 원리는 '추상화, 모듈화'이다. 컴퓨터를 설계하는 사람은 ram 내부의 칩 하나하나에 있는 레지스터들이 '어떻게' 동작하는지 몰라도 된다. 그저 ram이라는 모듈이 '무엇을' 하는지 설명되어 있는 인터페이스를 보고 사용하면 된다. 사용해서 컴퓨터를 설계하면 된다. 하드웨어, 소프트웨어 개발자는 이 추상화-구현 패러다임을 통해 매우 크고 복잡한 컴퓨터 시스템을 모듈 단위로 잘 설계해서 구현과 오류 해결이 쉽고 복잡도가 낮은 시스템을 만들 수 있다.  고수준 프로그래밍 언어가 컴파일러에 의해 저수준 기계어로 번역되고, 기계어가 어셈블러에..

CS 2024.12.20