전체 글
-
5. 응집도 : 흩어져 잇는 것들Study/내 코드가 그렇게 이상한가요? 2023. 12. 20. 21:48
응집도(cohension)란 '모듈 내부에 있는 데이터와 로직 사이의 관계가 얼마나 강한지 나타내는 지표'이다. 여기서 모듈은 클래스, 패키지, 레이어 등을 모두 포함할 수 있다. 응집도가 높은 구조는 변경하기 쉬우며 바람직한 구조인 반면, 응집도가 낮은 구조는 변경 시 문제가 발생하기 쉽다. 이러한 응집도를 낮추는 사례들을 알아보자. 5.1 static 메서드 오용 static 메서드를 오용하면 응집도가 낮아질 수 있다. 아래 예시를 살펴보자. // 주문을 관리하는 클래스 class OrderManager { static int add(int moneyAmount1, int moneyAmount2) { return moneyAmount1 + moneyAmount2; } } // static메서드를 사용..
-
4. 불변 활용하기 (안정적으로 동작하게 만들기)Study/내 코드가 그렇게 이상한가요? 2023. 12. 20. 11:07
가변과 불변을 적절하게 설계하지 못하면 동작을 예측하기 어렵고 혼란스러워진다. 이러한 상황을 피하기 위해 가능한 한 상태가 변경되지 않도록 불변을 활용하여 설계하는 방법을 알아본다.4.1 재할당재할당(파괴적 할당) : 변수에 값을 다시 할당하는 것 재할당은 변수의 의미를 바꿔 추측하기 어렵게 만들고, 언제 어떻게 변경되었는지 추적하기도 힘들게 만든다.int damage() { // 기본 공격력 int tmp = member.power() + member.weaponAttack(); // 속도로 공격력 보정 tmp = (int)(tmp (1f + member.speed() / 100f)); // 적 방어력 적용 tmp = tmp - (int)(enemy.defence / 2); // 음수 조정 tmp = ..
-
3. 클래스 설계 (객체 지향 설계의 기본)Study/내 코드가 그렇게 이상한가요? 2023. 12. 5. 06:41
객체 지향 설계의 기본이라고 할 수 있는 클래스 설계의 기본을 알아본다. 3.1 클래스 단위로 잘 동작하도록 설계하기 가장 중요한 것은 '클래스 단위로도 잘 동작하게 설계해야 한다'는 것이다. 클래스는 클래스 하나로도 잘 동작할 수 있어야 하며, 이는 복잡한 초기 설정 없이 바로 사용할 수 있으며, 클래스를 마음대로 조작해서 클래스 전체가 고장나는 일이 없도록 최소한의 조작 방법(메서드)만 외부에 제공해야 한다는 의미이다. 클래스는 기본적으로 '인스턴스 변수', '메서드' 두 가지로 구성된다. 여기서 잘 만들어진 클래스는 이를 다음과 같이 쓸 수 있다. 인스턴스 변수 인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작하는 메서드 이러한 구성을 지켜야 하는 이유는, 이러한 구성을 지키지 않았..
-
[Linux] telnet 비활성화 시 telnet 사용하기 Tip(feat. curl)CS/기타 2023. 6. 3. 01:45
telnet 명령어는 특정 서버에 접속할 수 있는 명령어이지만, 주로 서버의 포트 오픈 여부를 확인할 때 많이 사용된다. // telnet [IP] [PORT] $ telnet 127.0.0.1 8080 하지만, 종종 telnet 설치가 안 되어 있는 경우에 포트 점검을 하고 싶은 경우가 있다.(telnet 활성화가 안 된 윈도우, telnet 미설치 VM, pod 등) Tip curl 명령어는 http 뿐 아니라 telnet 프로토콜도 허용이 된다. (curl은 웬만한 경우 설치가 되어 있다.) // curl -v telnet://[IP]:[PORT] $ curl -v telnet://127.0.0.1:8080 위와 curl 명령어를 사용해 telnet 접속을 했을 때 포트 오픈이 되어 있다면 해당 서..
-
[Java] List 에서 ObjectUtils.isEmpty() 를 이용한 null 체크(isEmpty(), != null)CS/Java 2022. 4. 1. 17:10
List 를 사용하여 데이터를 조회하다 보면, 조회된 데이터가 없을 경우 NullPointerException 등이 터질 수 있기 때문에 null 체크를 해주어야 합니다. 1. List 가 null 일 경우 인스턴스 자체가 생성되지 않았을 경우 List 는 null 값을 가진다. null 인 리스트를 조회하려고 하면, NullPointerException 이 터진다. null 체크는 "list == null" 로 할 수 있다. if(list != null){ // task } 위 코드를 추가하면, list 가 null 이 아닌 경우에만 작업을 수행한다. 다만, 여전히 문제가 있다. 데이터를 받아오는 과정에서 list 에 null 이 아닌 빈 값이 저장되는 경우 위의 null 체크에 걸리지 않는다. (li..
-
[Pintos] Project 1 : Thread(스레드) - Advanced Scheduler (mlfqs)프로젝트/Pintos 2021. 5. 12. 15:06
자 이제 스레드의 마지막 미션인 Advanced Scheduler 를 구현해보도록 하자. Advanced Scheduler 는 Pintos 도큐먼트 Appendix B 에 기록되어 있는 4.4BSD Scheduler 와 같은 맥락의 스케줄러를 구현하도록 요구한다. 4.4BSD Scheduler 는 Multi-Level Feedback Queue Scheduler 의 구성이며, 이를 줄여서 pintos 의 코드에서는 mlfqs 로 나타나 있다. 4.4BSD 스케줄러의 상세한 내용은 전에 다룬 포스트가 있으니 자세한 이해를 원한다면 아래 링크에서 읽어보길 바란다. (recent_cpu, load_avg 값의 계산식을 분석하는 부분이 매우 흥미롭다.) [Pintos] 4.4BSD 스케줄러(4.4BSD Sche..
-
[Pintos] Project 1 : Thread(스레드) - Priority Inversion(donation)프로젝트/Pintos 2021. 5. 2. 00:29
드디어 Priority Scheduling 의 마지막 파트인 Priority Inversion 까지 왔다. 이전에 다루었던 문제들보다 꽤 많이 복잡해서 생각보다 시간이 오래 걸렸다ㅜㅜ 시작해보자! Priority Inversion 핀토스 Documents 에 나와있는 설명을 해석해보자. 우선 priority inversion 이란 다음과 같은 상황에서 발생한다. H (high), M (medium), L (low) 라는 세 개의 스레드가 있고 각각의 우선순위는 H > M > L 일 때, H 가 L 을 기다려야 하는 상황(예를 들어, H 가 lock 을 요청했는데 이 lock 을 L 이 점유하고 있는 경우)이 생긴다면 H 가 L 에게 CPU 점유를 넘겨주면 M 이 L 보다 우선순위가 높으므로 점유권을 선점..
-
[Pintos] Project 1 : Thread(스레드) - Priority Scheduling(2)프로젝트/Pintos 2021. 4. 30. 09:23
이번에는 동기화 도구들의 스케쥴링 방식을 살펴보자. 스케쥴링 도구들의 코드는 thread 폴더의 synch.h, synch.c 에 구현되어 있다. 우리가 다루어야 할 동기화 도구는 lock, semaphore, condition variable 3가지이다. 하나씩 살펴보자. /* thread/synch.h */ struct semaphore { unsigned value; /* Current value. */ struct list waiters; /* List of waiting threads. */ }; struct lock { struct thread *holder; /* Thread holding lock (for debugging). */ struct semaphore semaphore; /* B..