블로그

양종문

워밍업 클럽 3기 BE 클린코드&테스트 - 1주차 발자국

강의 요약 섹션 2. 추상 (抽象)우리가 클린 코드를 추구하는 이유가독성글이 잘 읽힌다.이해가 잘 된다.유지보수 하기가 수월하다.우리의 시간과 자원이 절약된다.추상이란?사물을 정확하게 이해하기 위해서 사물이 지니고 있는 여러 가지 측면 가운데서 특정한 측면만을 가려내어 포착하는 것이다. 어떤 일면만을 추상하는 것은 다른 측면을 버린다는 것과 같다.추상화를 하는 이유?적절한 추상화는 복잡한 데이터와 복잡한 로직을 단순화하여 이해하기 쉽도록 돕는다. 즉 읽기가 좋다.추상화의 가장 대표적인 행위이름 짓기메서드와 추상화메서드 선언부추상화 레벨매직 넘버, 매직 스트링 섹션 3. 논리, 사고의 흐름뇌 메모리 적게 쓰기Early returnelse의 사용을 지양사고의 depth 줄이기중첩 분기문, 중첩 반복문사용할 변수는 가깝게 선언하기공백 라인을 대하는 자세공백 라인도 의미를 가진다. (복잡한 로직의 의미 단위를 나누어 보여줌으로써 읽는 사람에게 추가적인 정보를 전달할 수 있다.)부정어를 대하는 자세부정어구를 쓰지 않아도 되는 상황인지 체크하기부정의 의미를 담은 다른 단어가 존재하는지 고민하기 or 부정어구로 메서드명 구성해피 케이스와 예외 처리예외가 발생할 가능성 낮추기어떤 값의 검증이 필요한 부분은 주로 외부 세계와의 접점의도한 예외와 예상하지 못한 예외를 구분하기Null을 대하는 자세항상 NullPointException을 방지하는 방향으로 경각심 가지기메서드 설계 시 return null을 자제한다 섹션 4 객체 지향 패러다임단일 책임 원칙 (Single Responsibility Principle)하나의 클래스는 단 한 가지의 변경 이유만을 가져야 한다.객체가 가진 공개 메서드, 필드, 상수 등은 해당 객체의 단일 책임에 의해서만 변경 되는가?관심사의 분리높은 응집도, 낮은 결합도개방 폐쇄 원칙 (Open-Closed Principle)확장에는 열려 있고, 수정에는 닫혀 있어야 한다추상화와 다형성을 활용해서 OCP를 지킬 수 있다.리스코프 치환 원칙 (Liskov Substitution Principle)상속 구조에서, 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환할 수 있어야 한다.LSP를 위반하면, 상속 클래스를 사용할 때 오동작, 예상 밖의 예외가 발생하거나, 이를 방지하기 위한 불필요한 타입 체크가 동반될 수 있다.인터페이스 분리 원칙 (Interface Segregation Principle)클라이언트는 자신이 사용하지 않는 인터페이스에 의존하면 안 된다.ISP를 위반하면, 불필요한 의존성으로 인해 결합도가 높아지고, 특정 기능의 변경이 여러 클래스에 영향을 미칠 수 있다.의존 역전 원칙 (Dependency Inversion Principle)상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다.의존성의 순방향 : 고수준 모듈이 저수준 모듈을 참조하는 것의존성의 역방향 : 고수준, 저수준 모듈이 모두 추상화에 의존하는 것 저수준 모듈이 변경되어도, 고수준 모듈에는 영향이 가지 않는다. 섹션 5 객체 지향 적용하기상속과 조합상속보다 조합을 사용하자!상속은 시멘트처럼 굳어지는 구조다. 수정이 어렵다.조합과 인터페이스를 활용하는 것이 유연한 구조Value Object도메인의 어떤 개념을 추상화하여 표현한 값 객체값으로 취급하기 위해서, 불변성, 동등성, 유효성 검증 등을 보장해야 한다.일급 컬렉션컬렉션을 포장하면서, 컬렉션만을 유일하게 필드로 가지는 객체컬렉션을 추상화하며 의미를 담을 수 있고, 가공 로직의 보금자리가 생긴다.만약 getter로 컬렉션을 반환할 일이 생긴다면, 외부 조작을 피하기 위해 꼭 새로운 컬렉션으로 만들어서 반환해주자.Enum의 특성과 활용Enum은 상수의 집합이며, 상수와 관련된 로직을 담을 수 있는 공간이다.특정 도메인 개념에 대해 그 종류와 기능을 명시적으로 표현해줄 수 있다.만약 변경이 정말 잦은 개념은, Enum 보다 DB로 관리하는 것이 나을 수 있다.다형성 활용하기변하는 것과 변하지 않는 것을 분리하여 추상화하고, OCP를 지키는 구조추상화와 다형성 활용하여 반복되는 if문 제거. OCP 지키기숨겨져 있는 도메인 개념 도출하기도메인 지식은 만드는 것이 아니라 발견하는 것객체 지향은 현실을 100% 반영하는 도구가 아니라, 흉내내는 것이다.설계할 때는 근시적, 거시적 관점에서 최대한 미래를 예측하고, 시간이 지나 만약 틀렸다는 것을 인지하면 언제든 돌아올 수 있도록 코드를 만들어야 한다.발작국 1주차 회고클린 코드와 객체 지향 설계에 대한 학습을 통해 코드의 가독성과 유지 보수성을 높이는 방법에 대해 많은 것을 배웠습니다. 이론으로만 알고 있던 부분들을 실제 코드를 수정해 가면서 배우니 훨씬 더 이해가 잘 되었던 것 같습니다. 빠르게 제 것으로 만들어 현업 프로젝트에 적용해 보고 싶습니다.

백엔드워밍업클럽

hee j

[인프런 워밍업 클럽 3기 풀스택 ] 1주차 발자국

목차Next.js, TailwindCss, Recoil, supabase 특징Todo List 미션  Next.jsReact 기반의 풀스택 프레임워크SSR(서버사이드 렌더링) 지원서버에서 미리 HTML을 렌더링하여 SEO와 초기 로딩 속도 개선fetch 등의 API 요청을 서버에서 처리해 클라이언트의 부담 감소SSG(정적 사이트 생성) 지원빌드 시 HTML을 미리 생성하여 빠르게 페이지 로딩파일 기반 라우팅pages/ 폴더 내 파일이 자동으로 라우트 됨app/ 디렉토리에서는 레이아웃 공유 & 동적 라우팅 가능서버 컴포넌트 & 클라이언트 컴포넌트 지원 API Routes 제공백엔드 서버 없이 NextJS 내에서 API 구축 가능이미지 최적화<Image /> 컴포넌트를 사용하면 자동으로 이미지 크기 조절 & 포맷 변환웹페이지 속도 향상SEO 최적화Middleware 지원요청이 처리되기 전에 인증, 리디렉션, 캐싱 등 제어 가능   TailwindCss유틸리티 퍼스트 방식의 CSS 프레임워크미리 정의된 클래스를 조합하여 빠르게 스타일 적용하기 때문에 CSS를 직접 작성할 필요 없음 => 개발 속도 향상 RecoilFacebook에서 개발한 React 전역 상태 관리 라이브러리React의 Context API보다 강력하고, Redux보다 간단하게 사용할 수 있음간단한 전역 상태 관리useState 처럼 쉽게 사용할 수 있음Atom을 이용해 상태를 관리하고 여러 컴포넌트에서 공유 가능 비동기 상태 관리 지원Selector를 이용하면 useEffect 없이도 비동기 데이터 관리 가능Redux보다 가볍고 React의 상태 관리 방식과 유사해 학습 부담이 적음   supabase오픈 소스 백엔스 서비스로 Firebase의 대체제로 사용됨PostgreSQL 기반의 데이터베이스RDBMS 기능 제공JSONB 데이터 타입 지원인증 권한 관리이메일, OAuth(Google, GitHub 등), Magic Link 로그인 지원 Row-Level Security(RLS) 를 통해 사용자별 데이터 접근 제한 가능스토리지 제공이미지, 파일 업로드 가능접근 권한을 설정해 보안 유지서버리스 함수(Edge Functions) 지원서버리스 API 생성 가능TypeScript와 호환Firebase 보다 쉬운 SQL 기반 데이터 관리  1주차 미션 - TODO List 제작 미션Next.js + Supabase 기반의 TODO List 제작생성 날짜와 수정 날짜 표시하기 TODO list 만들기생성 날짜와 수정 날짜 표시하기날짜를 "yyyy-MM-dd HH:mm:ss" 형태로 보여주기 위해 date-fns 설치 npm install date-fnscreated_at과 updated_at 값을 각각 상태로 관리하고,updated_at 값이 있다면 "수정됨:"이라는 텍스트와 함께 표시하고, 없다면 created_at 날짜만 표시// todo.tsx export default function Todo({ todo }) { const [created_at] = useState(todo.created_at); const [updated_at] = useState(todo.updated_at); const formatDate = (dateString: string) => { return format(new Date(dateString), "yyyy-MM-dd HH:mm:ss"); }; return <span className="text-sm text-gray-500"> {updated_at ? "수정됨: " + formatDate(updated_at) : formatDate(created_at)} </span>   

풀스택풀스택next.jsreactsupabase워밍업발자국

주이

[워밍업 클럽 3기] CS 1주차 - 운영체제 미션

  while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?인터럽트폴링 방식은 일정 간격마다 상태를 확인하므로 불필요한 CPU 리소스를 낭비 -> 인터럽트 방식을 사용하여하드웨어 또는 소프트웨어에서 발생하는 신호로, 이벤트가 발생했을 때 운영체제가 즉시 반응하도록 함 프로그램과 프로세스가 어떻게 다른가요?프로그램: 실행 파일이나 코드와 같은 정적인 개념. 하드디스크 등에 저장된 실행 가능한 파일.프로세스: 프로그램이 실행될 때 운영체제로부터 메모리를 할당받아 동작하는 개체. 실행 중인 프로그램 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍: 여러 개의 프로그램이 메모리에 올라가 있지만 CPU는 한 번에 하나씩 실행하며, 빠르게 전환하면서 실행하는 방식멀티프로세싱: 두 개 이상의 CPU 또는 코어가 여러 프로세스를 동시에 실행하는 방식. 실제 병렬 처리 가능 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?프로세스의 실행과 스케줄링을 위해 PCB(Process Control Block), 스케줄러, 컨텍스트 스위칭 등을 사용PCB: 프로세스의 정보를 저장하는 데이터 구조로, 프로세스 ID, 상태, 레지스터 값, 메모리 정보 등을 포함스케줄러: CPU 할당 순서를 결정하는 알고리즘을 사용하여 프로세스의 실행을 조율컨텍스트 스위칭: 실행 중인 프로세스의 상태를 저장하고, 다른 프로세스를 실행하기 위해 이전 상태를 복원하는 과정 컨텍스트 스위칭이란 뭔가요? 운영체제가 현재 실행 중인 프로세스를 중단하고 다른 프로세스를 실행하기 위해 레지스터, 프로그램 카운터, 메모리 정보 등을 저장하고 복구하는 과정

7마리상어

[인프런 워밍업 클럽 3기 - BE 클린 코드, 테스트 코드] 1주차 발자국

1주차 발자국이제까지 읽기 좋은 코드를 작성하기 위해서 따로 기준을 잡지 않고, 그저 내 눈에 읽기 가장 좋게 코드를 작성했었다. 하지만 강의를 들으며, 사고의 depth부터 시작하여, SOLID 원칙까지 읽기 좋은 코드를 작성하기 위해서 어떻게 사고를 해야하는 지 많이 얻어갈 수 있었던 강의였다. 가장 기본적인 추상과 구체를 시작으로 일기 좋은 코드를 만들기 위한 자세, 추상의 관점으로 바라보는 객체 지향 등을 통해 앞으로 읽기 좋은 코드를 작성할 때, 어떻게 생각할 지 조금은 방향이 잡힌 것 같다.강의 내용 중 가장 기억에 남는 것은 SOLID 원칙이다.SRP(Single Responsibility Principle): 단일 책임 원칙 : 하나의 클래스는 하나의 책임만을 가져야 한다. 하나의 기능만을 담당하여 유지보수를 더욱 효율적으로 할 수 있다. OCP(Open Closed Priciple): 개방 폐쇄 원칙 : 확장에는 열려있어야 하며, 수정에는 닫혀있어야 한다. 새로운 변경 사항이 발생했을 때, 확장에 따른 기존 코드의 수정은 최소화 하며, 유연하게 코드를 추가함으로써 기능을 확장할 수 있다. LSP(Listov Substitution Priciple): 리스코프 치환 원칙 : 자식 타입은 언제나 부모 타입으로 교체할 수 있다. 자식의 부모의 기능을 사용해도 동작이 부모 타입에서 의도한대로 흘러가야 한다. ISP(Interface Segregation Principle): 인터페이스 분리 원칙 : 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공한다. 한 인터페이스에 변경이 발생하더라도 다른 인터페이스는 영향을 받지 않도록 한다. DIP(Dependency Inversion Principle): 의존 역전 원칙 : 구현 클래스가 아닌 인터페이스에 의존해야한다. 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경할 수 있다.강의를 들으면서 왜 이 5가지의 원칙들이 읽기 좋은 코드를 만드는 데 큰 도움이 되는 지 많이 깨달았다.미션day2 미션 - 추상과 구체의 예시추상과 구체 강의를 들었을 때, 가장 와닿은 것은 '이해'라고 생각한다. 추상화 된 문장을 보았을 때, 머릿속으로는 구체화 된 사건이 떠오르는 것이 제대로 된 추상화가 아닐까? 싶었다. 그래서 흔히 사용하는 추상화 된 문장을 아무거나 하나 생각해내고, 그 과정을 빠진 부분 없이 자세하게 작성해서 추상에 대한 구체를 작성하여 미션을 수행했다. day4 미션 - 자기만의 언어로 리팩토링하기미션에 있는 코드를 봤을 때, 가장 먼저 생각했던 건 일단 복잡성을 줄이기였다. 강의 때 들은 SOLID 원칙이 있지만, 아직까지는 이 원칙들에 대해서 완벽하게 이해를 못했기 때문에 먼저 복잡하게 연결되어있었던 if문을 줄이고, 최대한 이것저것 연결되어 복잡해지지 않게 만들어야 겠다고 생각했다. 그래서 복잡한 코드들을 3가지 조건으로 나눠서 나만의 언어로 리팩토링 했다. 회고day2 강의에서 노래방에 가는 것을 구체화 된 문장으로 설명해주셨었는데 거기서 어찌보면 가장 큰 깨달음을 얻은 것 같았다. 노래방을 간다는 것이 그냥 노래방을 가는 것이지 그렇게 생각해 본 적이 없는데 폐에서 나온 공기가 성대를 통과하면서 만들어진 진동과 같이 구체화 시킨 문장을 보고 나도 모르는 사이에 내 머릿속은 구체화 된 문장으로 생각하고 있었던 것 같다. 그때 추상과 구체에 대해서 조금 더 확실하게 이해를 했었던 것 같다.생각한 코드를 구현하는 것도 물론 어렵지만, 그 코드를 생각하는 단계가 더욱 중요하게 어떻게 보면 더 어렵다고 생각하기에 앞으로 읽기 좋은 코드를 만들기 위해서 스스로 많은 생각을 해봐야겠다고 깨달음을 얻었다.

백엔드

인프런 워밍업 스터디 클럽 3기 (FE) _ 1주차 발자국

강의를 학습하며 새로 배운 점1주차 학습 범위 :따라하며 배우는 자바스크립트 A-Z 1~ 7섹션 그 동안 전시 프로젝트에 사용할 기능들 위주로 겉핥기식으로 독학해 배우다가기초부터 다시 배우니 그 동안 왜 이렇게 되는지 모른체 급한대로 사용했던 몇가지 지식들을 습득하게 되었다.기억에 남는 것들을 상기해보면this키워드는 정말 많이 이용했으면서 정확히 무엇을 가르키는지 모른체 되는대로 사용해왔는데이젠 정확하게 지칭해 사용할 수 있을 것 같고생성자 함수도 대강 사용해왔는데, 강의 외에도 직접 검색해보며 세세하게 정리한 것 같다또 궁금해서 버블링과 캡쳐링 강의를 들으면서 다양한 중첩 요소들의 eventListner함수 두번째 인자에 true, false를 여러 방식으로 넣어보며 실험도 해보았고변수 참조를 Closure를 배우면서는 let a = 'a'; function functionA() { function functionB() { let c = 'c'; console.log(a, b, c); } let b = 'b'; console.log(a, b); functionB(); }; functionA();여기서 변수 b가 엑세스 될 수 있는 이유를 functionB와 같은 A함수 안에서 같은 레벨 위치에 정의되어서 라고주먹구구식으로 이해하고 있었는데 정확한 이유를 알 수 있게 되었다.이처럼 잘못된 방식으로 이해하고 있던 개념들을 바로잡게 되었고,아예 처음 들어보았지만 중요한 개념들도 배울 수 있었다.앞으로 프로젝트를 진행할 때 내가 작성한 코드가 작동하는 원인과 결과에 대해 제대로 이해할 수 있을 것 같아 기대가 된다.과제 진행 회고1주차 과제음식 메뉴 앱 만들기가위 바위 보 앱 만들기퀴즈 앱 만들기책 리스트 나열 앱 만들기Gihub Finder 앱 만들기음식 메뉴 앱아르바이트를 했던 식당의 메뉴들로 과제를 진행했다. 정말 오랜만에 코드를 작성하니 js 보다도 html, css에서 시간이 더 걸렸던 것 같다. 나중에 보니 내용에 맞게 각 메뉴 박스의 높이값이 내용의 양 만큼만 되도록 하려고 의도했는데 어쩌다 양 쪽 메뉴 박스 중 더 높은 항목에 맞춰 조정되게 해버린 것 같다 여유가 될 때 수정해야겠다. 가위 바위 보 앱비교적 쉽게 구상할 수 있었는데, 결과값이 즉각적으로 나오는게 뭔가 어색해서 setTimeout 함수로 늦추다 의도치 않게 컴퓨터의 선택지가 즉각적으로 나오지 않게 되었는데 값을 할당해주는 코드의 위치만 바꾸면 해결될 문제를 졸려서 꽤 오랜 시간 할애해 해결했다. 퀴즈 앱 만들기예시에서는 수학 퀴즈였는데, 숫자가 아닌 다른 항목도 랜덤으로 가져오는 것을 해보고 싶어 수도 맞추기 퀴즈로 구상했다. 퀴즈는 5문제가 출제되고 매번 다른 문제와 선택지가 나오도록 했다. 배열로 많은 선택지 항목들과 문제 항목을 준비하고 랜덤으로 가져와 정답인 선택지를 랜덤으로 배치시키도록 했다. 한계점은 결국엔 문서상에 준비된 문제와 선택지 중에서 출제된다는 것인데. 나중에는 출제 자체를 그때 그때 ai가 하게 해서 매번 새로운 문제와 선택지를 제시하는 프로젝트를 해보고 싶다. 책 리스트 나열 앱책에서 영화로 주제를 바꾸고 별점주기 항목을 추가했다.별점주는 부분은 특수문자 별을 배열로 불러와 클릭시 하위 인덱스의 별들에 클래스를 추가해서 색이 바뀌도록 날 것(?)의 방식으로 구현했다 깃허브 유저 찾기시간이 부족해 주요 기능만 구현해보았다.hotsunny라는 유저를 찾는 과정에 거치는 h,ho,hot,,,hotsuny 8명의 가상의 유저 정보를 객체와 배열을 이용해 담고 강의에서 배운 생성자 함수를 처음으로 제대로 이용해서 innerHTML로 인풋값에 따라 렌더했다. 각 인풋값에 맞는 유저를 어떻게 할당해서 렌더할까에 대해 가장 고심했던 것 같다. 자주 사용되는 기능이라 참고할 곳은 많았는데 배우지 않은 기능을 이용한게 많아서 도움되지 않았다. 

프론트엔드

[인프런 워밍업클럽 3기 백엔드 코드] 1주차 발자국

Readable Code: 읽기 좋은 코드를 작성하는 사고법 강의 수강섹션2. 추상추상화는 데이터와 논리를 단순화하여 이해하기 쉽도록 돕는다.도메인을 고려하여 개념을 추상화해야 한다.전반적인 추상화의 정도를 맞춰야 한다. 추상의 어원때문인지 이 강의가 가장 기억에 남았다.섹션3. 논리, 사고의 흐름후손을 위해 뇌 메모리를 적게 쓸 수 있는 코드의 흐름에 대해 배웠다.부정어와 중첩, else if문을 줄여야 좋은 코드임을 인지할 수 있었다.간단하고 적용이 쉬운 내용이라 바로 적용할 수 있을 것 같다.섹션4. 객체 지향 패러다임S (SRP, 단일 책임 원칙)하나의 클래스는 단 하나의 책임만 가진다.즉, 변경해야 할 이유가 단 하나뿐이어야 하며, 여러 가지 책임을 하나의 클래스에 넣으면 유지보수가 어렵다.O (OCP, 개방-폐쇄 원칙)코드는 확장에는 열려있고, 수정에는 닫혀있어야 한다.새로운 기능을 추가할 때 기존 코드를 바꾸는 것이 아니라, 확장을 통해서만 변경이 이뤄지게 해야 한다.L (LSP, 리스코프 치환 원칙)자식 클래스는 부모 클래스가 쓰이는 자리에 그대로 치환될 수 있어야 한다.I (ISP, 인터페이스 분리 원칙)큰 인터페이스 하나보다 작은 인터페이스 여러 개로 나누는 것이 낫다.D (DIP, 의존 역전 원칙)상위 모듈이 하위 모듈에 의존하면 안 된다. SOLID에 대해서 다시 한 번 되새길 수 있는 기회가 되었다.섹션5. 객체 지향 적용하기관심사에 따라 기능과 책임을 나누자 -> 유지보수성이 높아진다.각 관심사 끼리는 결합도가 낮아야 한다.setter의 사용은 자제하자. getter도 꼭 필요할 때 만들어 사용하자. 아는 것과 적용하는 것은 역시나 또다르다는 것을 느꼈다. 미션Day2코드와는 직접적인 관련은 없는, 추상화의 예시를 떠올리는 미션이었지만 상당히 재미있게 수행했다.예시를 수행하면서 개념을 실제로 응용해보려고 떠올릴 때 더 개념이 구체화된다는 것을 몸소 느꼈다.추상화의 구체화라는 아이러니함이 재밌었다.Day4가독성이 떨어지는 코드에 early return과 적절한 메서드 추출을 하나씩 적용해보았고,SOLID 원칙을 내가 이해한 나의 단어로 정리해보려고 시도했다.아직 SOLID의 추상을 구체화하진 못했지만 시간을 들여 연습하면 더더욱 추상 레벨을 높일 수 있을 거라고 기대한다. 

Eun-Ng

인프런 워밍업 클럽 스터디 3기 - CS 1주차 발자국

운영체제프로그램과 프로세스프로그램: 저장장치에 저장된 정적인 코드프로세스: 실행 중인 프로그램 (메모리에 로드됨)멀티프로그래밍과 멀티프로세싱멀티프로그래밍: 여러 프로그램을 메모리에 동시에 올려두고 실행멀티프로세싱: 여러 프로세서(CPU)가 여러 프로세스 동시 처리프로세스 상태생성(New): 프로세스 생성됨준비(Ready): CPU 할당 대기실행(Running): CPU 할당받아 실행 중대기(Waiting): I/O 등 이벤트 대기 종료(Terminated): 실행 완료컨텍스트 스위칭실행 중인 프로세스를 바꾸는 작업PCB 정보 저장/복원 필요오버헤드 발생쓰레드프로세스 내의 실행 단위특징:같은 프로세스의 자원 공유빠른 생성과 컨텍스트 스위칭병렬 처리 가능PCB (Process Control Block)프로세스 관리를 위한 정보 저장 블록포함 정보:프로세스 ID프로세스 상태프로그램 카운터레지스터 정보메모리 정보CPU 스케줄링목표 리소스 사용률: CPU 사용률을 높이는 것을 목표로 할 수도 있고, I/O 디바이스의 사용률을 높이는 것을 목표로 할 수도 있음오버헤드 최소화공평성: 모든 프로세스에게 공평하게 CPU 할당. 특정 프로세스에게만 CPU가 계속 할당되지 않게처리량: 같은 시간내에 더 많은 처리를 할 수 있는 방법을 목표로 함대기시간: 작업을 요청하고 실제 작업이 수행되기까지 대기하는 시간이 짧은 것을 목표로 함응답시간: 사용자의 요청에 얼마나 빨리 반응하는지 서로 상반되는 목적을 지니기 때문에 목적에 따라 적절히 목표를 변경해야함주요 알고리즘FIFO(First In First Out)먼저 들어온 프로세스가 완전히 끝나야 다음 프로세스 실행SJF(Shortest Job First)어떤 프로세스가 얼마나 실행될지 예측하기가 힘듦Burst Time이 긴 프로세스는 아주 오랫동안 실행되지 않을 수도 있음RR(Round Robin)FIFO의 경우 시분할 처리 시스템에서 사용하기 힘들고, SJF 알고리즘은 프로세스의 종료시간을 예측하기가 힘듦.FIFO 알고리즘에서 단점을 해결하기로 함프로세스에 정해진 시간만큼만 할당할 수 있게 함(타임 슬라이스, 타임 퀀텀)타임 슬라이스를 작게 설정하는 경우 동시에 실행되는 느낌을 받을 수 있지만 컨텍스트 스위칭을 처리하는 양이 훨씬 커져 비효율적임(오버헤드가 너무 커짐)MLFQ(Multi Level Feedback Queue)RR 알고리즘의 업그레이드 된 버전CPU 사용률과 I/O 사용률 전체를 생각하면 타임 슬라이스가 더 작은 값이 좋음MLFQ는 기본적으로 CPU 사용률과 I/O 사용률이 좋게 나오는 작은 크기의 타임 슬라이스를 선택함CPU Bound Process에는 타임 슬라이스를 크게 주고, I/O Bound Process에는 타임 슬라이스를 작게 줌.알고리즘&자료구조시간복잡도알고리즘의 성능을 평가하는 척도입력 크기(n)에 따라 알고리즘이 실행되는 시간을 나타냅니다.빅오(Big-O) 표기법을 주로 사용합니다.배열 (Array)연속된 메모리 공간에 데이터 저장인덱스로 빠른 접근 가능 (O(1))크기가 고정적연결리스트 (Linked List)노드가 다음 노드를 가리키는 구조삽입/삭제가 용이 (O(1))접근은 처음부터 순차적으로 (O(n))스택 (Stack)LIFO (Last In First Out) 큐 (Queue)FIFO (First In First Out) 덱 (Deque)양쪽 끝에서 삽입/삭제 가능스택과 큐의 기능 모두 수행 가능해시테이블 (Hash Table)키-값 쌍으로 데이터 저장평균적으로 빠른 검색/삽입/삭제 (O(1))셋 (Set)중복을 허용하지 않는 컬렉션빠른 검색과 중복 제거합집합, 교집합 등 집합 연산 가능회고과제도 생각보다 시간이 걸려서 다음엔 좀 더 넉넉잡아 시작해야할거 같다.노션에 따로 정리해놓은 것도 중요한 내용들만 간략하게 정리해놓았다 보니 누락되는 것들이 있어 과제와 회고때 더 디테일하게 작성하지 못한 점이 아쉽다.

박지수

[인프런 워밍업 클럽] 스터디 3기_백엔드 클린 코드, 테스트 코드 1주차 발자국

이 포스트는 [인프런 워밍업 클럽 스터디 3기](https://www.inflearn.com/course/offline/warmup-club-3-be-code)에 참여한 후, [Readable Code: 읽기 좋은 코드를 작성하는 사고법](https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95)를 수강한 후 작성된 포스트입니다.public boolean validateOrder(Order order) { Boolean validate = false; //주문자 정보 체크 if(order.hasCustomerInfo()){ //주문 정보 체크 validate = order.isValidateOderInfo(); } return validate; } public class Order { Customer customer; Item item; public boolean hasCustomerInfo() { if(customer.getInfo()){ return true; } return false; } public boolean isValidateOderInfo() { if(isValidatePrice() && isValidateItem()){ return true; } return false; } public boolean isValidatePrice(){ if(this.getTotalPrice() > 0){ return true; } return false; } public boolean isValidateItem(){ if(this.getItems() == 0){ return false; } return true; } public List getItems(){ return item.getItem(); } public int getTotalPrice(){ return item.getItem() * item.getPrice(); } }Day 4 미션으로 리팩토링 미션이 주어졌다.논리의 흐름으로 리팩토링 하려 했다.주문 유효성 체크를 위해서는 주문자 정보를 확인하는게 우선이라 생각했다.주문자 정보가 없으면 주문 정보가 있더라도 유효한 주문이 아니기 때문이다.주문자 정보와 주문정보를 if문으로 분기했는데 강의에서 강조하는 부분을 정확하게 이수했는지 여부는 조금더 있어봐야알것같다. Day4미션을 작성하면서 Solid원칙도 학습하였는데단일 책임원칙, 개방폐쇄원칙은 비교적 쉽게 와닿았는데 리스코프 치환원칙이나 의존성 역전의 원칙은 쉽게 와닿는 개념은 아니라서 더 학습해봐야겠다. 회고잘된점 : 미션을 기한내에 제출했다.안된점 : 제출한 미션의 질이 좋지않다. 시간을 더 내서 다음번엔 더 퀄리티있는 발자국을 남기고싶다.

웹 개발

박예은

[인프런 워밍업 클럽 CS 3기] 1주차 발자국

강의 요약자료구조어떤 알고리즘의 성능의 지표로 빅오표기법($O(n)$)을 사용한다.배열(array)동일한 자료형 요소들의 모임메모리의 연속된 공간에 위치한다데이터의 참조의 시간복잡도 $O(1)$데이터 추가 및 삭제 시간복잡도 $O(n)$연결리스트(linked list)데이터와 다음 노드의 주소를 저장하는 포인터를 가진 노드들이 일자로 연결된 자료구조 각 노드들이 랜덤한 공간에 위치해도 된다.데이터의 참조의 시간복잡도 $O(n)$데이터 추가 및 삭제 시간복잡도 $O(1)$스택(stack)후입선출(LIFO, Last In First Out)큐(queue)선입선출(FIFO, First In First Out)덱(deque)양방향으로 데이터의 접근 및 처리가 가능한 자료구조해시테이블(hashtable)키(key)와 값(value)을 매핑시켜 저장하는 자료구조키를 해시함수를 통해서 변환하여, 변환된 값으로 값을 참조한다.해싱(hashing) : 임의의 크기의 값을 해시 함수를 통해 고정된 크기의 값으로 변환하는 작업해시 충돌(collision) : 다른 키로부터 동일한 해시 함수의 결과값이 나오는 경우chaining 기법 : 해시테이블의 공간을 연결리스트 자료구조를 사용하여 존재하는 데이터 뒤에 연결시킨다.open addressing : 해시 함수의 반환값의 위치에 이미 데이터가 있는 경우 다른 해시 코드를 사용하는 것데이터의 CRUD 작업에 대해 $O(1)$의 시간복잡도를 갖는다. (해시충돌이 없는 경우)메모리를 많이 차지하고, 해시 충돌 시 다른 자료구조를 사용하거나 좋은 해시함수를 구현해야 함셋(set)데이터의 중복을 허용하지 않는 자료구조순서도 고려되지 않는다.학습 내용 정리[배열, linked list](https://github.com/yeeuniii/TIL/blob/main/DataStructure/%EB%B0%B0%EC%97%B4%EA%B3%BC-%EB%A7%81%ED%81%AC%EB%93%9C%EB%A6%AC%EC%8A%A4%ED%8A%B8.md)[stack, queue, deque](https://github.com/yeeuniii/TIL/blob/main/DataStructure/%EC%8A%A4%ED%83%9D-%ED%81%90-%EB%8D%B1.md)[hash table](https://github.com/yeeuniii/TIL/blob/main/DataStructure/%ED%95%B4%EC%8B%9C%ED%85%8C%EC%9D%B4%EB%B8%94.md)[set](https://github.com/yeeuniii/TIL/blob/main/DataStructure/Set.md)  운영체제프로세스와 스레드프로세스는 메모리에 프로그램이 적재되어 운영체제의 관리하에서 실행되는 프로그램이다.프로세스가 생성되면 PCB가 생성되고, 준비 상태(Ready)가 되어 운영체제로부터 CPU를 할당받기를 기다린다.CPU를 할당받으면 실행 상태(Running)가 된다.이때 CPU 점유 시간을 초과하면 운영체제로부터 CPU 제어권을 빼앗고 다시 대기 상태(Ready)가 되고,입출력 작업이 요청되면 대기 상태(Waiting)가 되어 CPU 스케줄링의 대상에서 제외된다.입출력 작업 완료 시, 다시 대기 상태(Ready)가 된다.모든 작업이 완료되면 프로세스의 자원(PCB, 메모리 등)이 회수된다. 프로세스는 고유한 메모리와 PCB를 갖기 때문에 프로세스의 수에 비례하게 메모리도 증가한다.따라서 프로세스 내에서 스택을 제외한 메모리와 PCB를 공유하는 스레드를 사용하여 멀티태스킹을 구현한다.스레드는 가볍지만, 메모리를 공유하기 때문에 동기화 문제가 발생할 수 있다. CPU 스케줄링운영체제가 여러 프로세스에 합리적으로 CPU를 할당 / 해제하는 행위CPU 스케줄링의 성능은 평균 대기 시간에 따라 결정된다.FIFO들어온 순서대로 작업을 처리한다.하나의 프로세스의 작업이 완료되어야 다음 프로세스를 실행할 수 있다.SJF프로세스의 작업 시간을 정확히 예측할 수 없다.Burst Time이 큰 프로세스는 무한 대기가 발생할 수 있다.RR(Round Robin)time slice를 기반으로 모든 프로세스에 공평하게 CPU를 할당한다.time slice가 너무 작을 경우 잦은 컨텍스트 스위칭에 의한 오버헤드가 발생할 수 있다.MLFQ(Multi Level Feedback Queue)프로세스의 우선순위를 줘서(프로세스마다 time slice를 다르게 줌) CPU 처리율과 I/O 처리율의 균형을 제공한다.  [1주차 학습 내용 정리](https://github.com/yeeuniii/TIL/blob/main/OS/%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C.md) 회고강의에서 이해가 되지 않거나 부족한 부분들을 더 찾아보고 채워나가면서 생각보다 학습 시간이 오래 걸렸다. 이렇게 학습함으로써 확실히 이해하고 머릿속에 남는 것 같아 후회되지는 않지만, 그럼으로써 매일매일 계획된 스케줄대로 학습하기가 어려워진 것 같다.자료구조의 경우, 이전 알고리즘 스터디에서 학습했던 것과 비슷한 부분이 많아 리마인드하는 느낌으로 반복 학습해줬다. 그래도 이전과 다르게 연결리스트로 자료구조를 구현하면서 또 다른 방식을 알아갈 수 있어 좋았던 것 같다.운영체제는 진짜 42서울에서 배웠던 것은 헛이었다... 운영체제의 역사, 컴퓨터 구조와 같은 완전 기본부터 학습을 시작하니 다음께 다다 이해되는 느낌.. 이때까지 OS는 주먹식 암기로 학습했었는데 이해를 기반으로 학습되니 운영체제의 기반이 잡힌 기분이다! 그러면서 이때까지 조금씩 주워듣고 겉핥기로만 알고 있던 부분을 플러스알파로 학습하면서 지식을 탄탄히 채워나갈 수 있었다!! 스터디 고민했었는데 운영체제의 개념을 정리할 수 있는 시간이 되었다는 점에서 스터디 신청이 하나도 후회되지 않는다!다만 이번주는 CS 학습에 좀 끌려다니듯이 살았는데, 다음주부터는 일정 학습시간을 정해두고 그날 학습할 것은 그날 끝내도록하자! 미션과 발자국을 이렇게 시간 임박해서 작성하는 불상사를 만들지 않도록... 다음주도 화이팅!

CS발자국

인프런 워밍업 클럽스터디 3기 FE - 1주차 발자국

강의[ 변수 ]var : 중복선언, 재할당 가능 , 마지막에 할당된 값이 변수에 저장, 함수스코프let : 중복선언 불가, 재할당 가능, 블록스코프const : 재선언, 재할당 불가능 -> 상수 , const 선언했어도 배열과 객체의 값은 변경 가능, 블록스코프 [This]Function => window.objectMethod => objectConstructor Function => {}화살표함수 this는 항상 상위스코프 this를 가르키게 된다 메소드 사용하기- call()call 메소드는 함수를 호출하는 함수이며, 첫번째 매개변수로 어떤한 것을 전달해주면 호출되는 함수의 this 안에 window 객체가 아닌 전달받은 것을 받게 됨 - apply()call 메소드와 사용법은 동일, 인수를 넣을때는 [] 로 넣는다 - bind()function func(language){If(language == ‘kor’){console.log(`language: ${this.korGreeting}`);}else{console.log(`language: ${this.engGreeting}`);}}const greeting = {korGreeting : ‘ 안녕‘,engGreeting: ‘Hello’,}func.bind(greeting);// func() 함수에서 this에다가 greeting 객체를 바인딩 시켜준다는 개념const boundFunc = func.bind(greeting);// 위 변수에다가 바인딩 시켜준 함수를 할당boundFunc(‘kor’);// 변수에 담겨진 함수를 호출, 호출할때 인수값 넣기 [ 이벤트루프 ]setTimeout()전역 setTimeout() 메서드는 만료된 후 함수나 지정된 코드 조각을 실행하는 타이머를 설정합니다.두번째 매개변수로 들어간 밀리초 단위가 지난 후 첫번째 매개변수인 콜백함수가 호출됨 [ closure ]다른 함수 내부에 정의된 함수가 있는 경우 외부함수가 실행을 완료하고 해당 변수가 해당 함수 외부에서 더 이상 액세스할 수 없는 경우에도 해당 내부 함수는 외부 함수의 변수 및 범위에 엑세스할 수 있습니다. [ map ,filter,reduce 메소드 ]- mapmap() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환 - filterfilter()메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환 - reducereduce()메서드는 배열의 각 요소에 대해 주어진 리듀서 함수를 실행하고, 하나의 결과값을 반환리듀서 함수는 네개의 인자를 가집니다.1. 누산기(acc) - 여기에 계속 값이 쌓임2. 현재값(cur)3. 현재 인덱스(idx)4. 원본 배열(src)[ 0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){return accumulator + currentValue;}) [ undefined 와 null 차이 ]undefined는 아무값도 할당 받지 않은 상태null은 비어있는, 존재하지 않는 값을 의미변수에 의도적으로 값이 없다고 할때는 null 사용 미션[ 음식 메뉴 앱 ]스타일 dispaly로 메뉴 클릭 시 해당 메뉴 이미지와 글이 보이도록 구현하였고 forEach에 대해 공부할 수 있었다[ 가위 바위 보 게임 ]공통함수로 만들려고 했고 동작을 생각하면 코드를 어떻게 구성할지 생각할 수 있었다   

재영

[인프런 워밍업 클럽 3기] CS - 1주차 미션 (자료구조와 알고리즘)

여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.해시테이블을 사용해시 테이블은 Key Value로 구성되며, Key 값을 고유해야함교실의 학생들을 구별할 수 있는 고유한 정보가 존재하기 때문에, (예를 들면 학번)Key를 학번으로 하며, 학생 정보를 Value에 저장하면 됨이렇게 되면 고유한 값을 통해서 학생 정보를 쉽게 찾을 수 있을 것  여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.큐 Queue 를 사용고객이 주문한 순서대로 처리되어야 하므로, FIFO를 만족하는 자료구조인 큐를 사용  우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요.import 한 LinkedList 의 프로퍼티에는 원소의 개수를 나타내는 count가 있다고 가정import { LinkedList } from "./linked.list.ts"; class Stack { list; constructor () { this.list = new LinkedList(); } push (data) { this.list.insertAt(this.list.count, data); } pop () { try { return this.list.deleteAt(this.list.count - 1); } catch (e) { return null; } } peek () { return this.list.getNodeAt(this.list.count - 1); } isEmpty () { return (this.list.count == 0); } } export { Stack };   해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요. ( 힌트: charCodeAt() 함수를 이용 예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력)hashFunction(str) { let hash = 0; for (let i = 0; i < str.length; i++) { hash += str.charCodeAt(i); } return hash % 10; } 각 문자의 Unicode 값 더한 뒤, 테이블 크기로 나눈 나머지를 사용할 수 있음.하지만, 이름이 같거나, 구성이 같은 경우(이운재, 이재운)에는 충돌이 발생할 수 있으므로 추가적인 처리가 필요해보임

인프런워밍업클럽3기CS1주차미션자료구조와알고리즘

wlsgml450

인프런 워밍업 클럽 CS - 1주차 발자국 👣

운영체제운영체제가 하는 일 ================== - 프로세스 관리 - 메모리 관리 - 하드웨어 관리 - 파일 시스템 관리 운영체제의 구조 ================== 1. 커널 - 프로세스와 메모리, 저장장치를 관리하는 핵심적인 기능을 담당한다. 2. GUI (Graphic User Interface) - 그래픽으로 된 인터페이스로 그래픽으로 커널과 상호 작용한다. 3. CLI (Command-Line Interface) - 유닉스나 리눅스 같은 운영체제가 기본적으로 제공하는 인터페이스로 텍스트를 이용해 커널과 상호 작용한다. 4. 시스템 콜 - 어플리케이션은 시스템 콜을 통해서 커널에 접근할 수 있다. 5. 드라이버 - 하드웨어와 커널의 인터페이스로는 드라이버를 사용한다. 인터럽트 ================== - 인터럽트는 폴링 방식의 단점을 해결한 방식이다. 프로세스 ================== - 실행 중인 프로그램이라고 할 수 있다. - 프로세스는 운영체제에 의해 관리된다. PCB (Process Control Block) - 프로세스가 만들어지면 운영체제는 해당 프로세스의 정보를 가지고 있는 PCB를 만들고 저장한다. 프로세스 상태 ================== - 프로세스는 시분할 처리를 위한 다섯 가지 상태를 가진다. 1. 생성상태 2. 준비상태 3. 실행상태 4. 대기상태 5. 완료상태 컨텍스트 스위칭 ================== - 프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행 중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 교체하는 작업이다. CPU 스케줄링 ================== - 운영체제는 모든 프로세스에게 CPU를 할당/해제하는데 이를 CPU 스케줄링이라고 한다. CPU 스케줄링 알고리즘 ================== 1. FIFO (First In, First Out) - 스케줄링 큐에 들어온 순서대로 CPU를 할당받는 방식이다. - 먼저 들어온 프로세스가 완전히 끝나야만 다음 프로세스가 실행될 수 있다. 2. SJF (Shortest Job First) - Burst Time이 짧은 프로세스가 먼저 실행되는 알고리즘이다. 3. RR (Round Robin) - 한 프로세스에게 일정 시간만큼 CPU를 할당하고 할당된 시간이 지나면 강제로 다른 프로세스에게 CPU를 할당한다. - 강제로 CPU를 뺏긴 프로세스는 큐의 가장 뒷부분으로 밀려난다. 4. MLFQ (Multi-Level Feedback Queue) - 프로세스의 우선순위를 동적으로 조정하는 알고리즘이다.  자료구조와 알고리즘자료구조 ================== 데이터가 어떤 구조로 저장되고 어떻게 사용되는지를 나타낸다. 1. 배열 - 숫자나 문자열 등을 연속적으로 저장하는 자료구조 2. 연결리스트 - 데이터를 담는 변수, 다음 노드를 가리키는 변수를 가지고 있는 노드들이 연결되어 있는 자료구조 3. 스택 - 가장 나중에 들어온 데이터가 가장 먼저 나가는 자료구조 4. 큐 - 가장 먼저 들어온 데이터가 가장 먼저 나가는 자료구조 5. 덱 - 양쪽 끝에서 데이터 삽입/삭제가 가능한 자료구조 6. 해시테이블 - 키 값 쌍으로 데이터를 저장하며, 빠른 검색, 삽입, 삭제가 장점인 자료구조 7. 셋 - 중복을 허용하지 않는 자료구조 알고리즘 ================== 어떤 문제를 해결하기 위한 확실한 방법을 말한다.  회고코딩 테스트 문제를 Lv.1부터 풀다가 드디어 한계가 왔다.. 자료구조와 알고리즘 공부가 1000000000% 필요한 순간이 왔...다.. 겸사겸사 CS 공부를 제대로 공부하고 싶어 인프런 워밍업 클럽 CS 에 참가했다.   벌써 1주차가 마무리됐다. 되돌아보니, 그동안 너무 무작정 문제만 풀었던 것이 느껴졌다. 주로 사용했던 배열이 흔히 듣던 자료구조라는 걸 알게 되었고, 이제는 자료구조에 따라 데이터 처리 방법이 달라진다는 점을 인식하며 문제에 접근할 수 있게 되었다.   앞으로 공부를 더 진행하면서 그동안 수많은 좌절감을 느끼게 했던 코딩테스트 문제들을 이제 제대로 풀 수 있지 않을까 하는 기대감이 생겼다. 물론 내가 열심히 해야만 할 수 있는 문제! 앞으로도 스터디에 열심히 참여하고 CS 지식을 내 것으로 만들어야겠다! 

워밍업 클럽 스터디 3기 - 백엔드 클린 코드, 테스트 코드 1주차 발자국

사실 클린코드나 리팩토링에 대한 스터디가 처음이 아니다.하지만 개발을 하다보면 조금씩 잊기 마련이라 초심으로 돌아가서 다시 배워보자는 마음가짐으로 신청하게 되었다.TDD에 대해서도 항상 생각은 하지만 실천하기가 어려워서 한구석으로 미뤄두고 있었는데이번 스터디를 통해서 체화할 수 있으면 좋겠다. Day2. 추상과 구체추상과 구체. 객체지향을 배울 때 가장 처음 접하는 개념일 것이다.아무래도 많이 들어왔던 예시가 있어서 창의적인 비유를 상상하지 못해 아쉽다. 😅항상 클래스명, 메소드명 짓는게 힘들었는데 강의를 들으면서 좀 더 단계적으로 추상화하는 방법을 익힌 것 같다. Day4. 객체지향 구현하기SOLID 개념은 개발 공부를 시작하면서, 또 자격증준비, 취업준비를 하면서 끊임없이 외웠던 내용들이다.하지만 막상 코드에 적용시키려면 막막하고 어디서부터 손대야할지, 어디까지 해야할지 많은 고민이 생긴다.강의를 듣고 내 언어로 정리하는 건 어떤 공부에든 도움되는 방법일 것이다.이번 기회에 다시 한 번 정리하면서 잊고 있었던 부분들을 상기하는데 많은 도움이 되었다.미션으로 진행한 코드는 상당히 단순하지만 생각할 점이 의외로 많아서 재미있었다.코드를 보면서 어떻게 리팩토링할지 생각하고 적용시키는데 생각보다 시간이 꽤 걸렸다,미션을 제출한 후에 조금 더 고치고 다른 분들이 제출한 코드들을 구경했는데 나와 같은 방식으로 리팩토링한 사람도 없고, 정말 다양한 코드들이 나와서 흥미로웠다. 회고OT에서 경고한 것처럼 스터디클럽에서 제시한 커리큘럼대로 강의를 듣고 미션을 완수하는 게 쉬운 일은 아니었다.따라가기 벅차서 허덕거리는 감이 있지만, 그래도 1주차는 어떻게 해냈다.앞으로 남은 미션과 발자국도 무사히 제출해서 완주할 수 있으면 좋겠다. 다들 화이팅! 

주이

[워밍업 클럽 3기] CS 1주차 - 자료구조와 알고리즘 미션

여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.HashMap일반적으로 학생 정보를 관리할 때는 '학번(아이디), 이름' 으로 관리하기 때문에, key는 학번, value는 이름을 저장하는 key-value 형식의 해쉬맵을 사용학번(key)으로 빠르게 조회가 가능. 수정/삭제 시에도 학번으로 조회하여 데이터 처리를 하면 되기 때문에 효율 적일 것 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요. 큐(Queue)주문은 들어온 순서대로 처리되기 때문에 큐의 선입선출(FIFO) 구조와 일치  우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요.class Stack { constructor() { this.list = new LinkedList(); } push(data) { this.list.insertLast(data); } pop() { try { return this.list.deleteLast(); } catch (e) { return null; } } } 해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요.function hashFunction(name) { let hash = 0; for (let i = 0; i < name.length; i++) { hash += name.charCodeAt(i); } return hash % 10; }

초동

[인프런 워밍업 클럽] 스터디 3기_백엔드 클린 코드, 테스트 코드 1주차 발자국

공부내용1. 우리가 클린코드를 추구하는 이유가독성이해가 잘 된다.유지보수 하기가 수월하다.우리의 시간과 자원이 절약된다.2. 프로그램 이란?프로그램 = 데이터 + 코드3. 추상과 구체중요한 정보는 가려내어 남기고, 덜 중요한 정보는 생략하여 버린다.적절한 추상화 는 해당 도메인의 문맥 안에서, 정말 중요한 핵심 개념만 남겨서 표현하는 것추상은 항상 구체적인 실재에서 시작해야 한다. -Pablo Picasso 고수준 : 추상화 레벨이 높다 (자연어)저수준 : 추상화 레벨이 낮다 (기계어)4. 이름 짓기: 가장 단순하면서도, 아주 중요한, 고도의 추상적 사고를 기반으로 한다.표현하고자 하는 구체에서 정말 중요한 핵심 개념만을 추출하여 잘 드러내는 표현우리 도메인의 문맥 안에서 이해되는 용어작명 팁단수와 복수를 구분하기어미에 ‘-(e)s’ 를 붙여 어떤 데이터(변수, 클래스 등)가 단수인지, 복수인지 나타내는 것만으로도 읽는이에게 중요한 정보를 같이 전달할 수 있다.이름 줄이지 않기ex) column → col, latitude → lat, longitude → lon관용어처럼 많은 사람들이 자주 사용하는 줄임말 정도는 존재한다.은어/방언 사용하지 않기새로운 사람이 팀에 합류했을때, 용어를 단번에 이해할 수 있는가?도메인 용어 사용하기도메인 용어를 먼저 사전으로 정의하는 과정이 필요할 수 도 있다.좋은 코드를 보고 습득하기ex) pool, candidate(당선, 후보), threshold(문지방, 한계점, 임계값)등비슷한 상황에서 자주 사용하는 단어, 개념 습득하기5. 메서드와 추상화잘 쓰여진 코드라면, 한 메서드의 주제는 반드시 하나다. (0개도 2개도 아닌, 무조건 1개)→ 여러개라고 느껴진다면 추상화가 제대로 되지않은것이니 분리해야한다.6. 메서드 선언부메서드 구성요소 : 반환타입 메서드명 (파라미터) {}메서드 선언부 : 반환타입 메서드명 (파라미터) {}메서드 구현부 : 반환타입 메서드명 (파라미터) {}반환타입메서드 시그니처에 납득이 가는, 적절한 타입의 반환값 돌려주기→ 반환 타입이 boolean인데, 이게 이 메서드에서 무엇을 의미하는거지?void 대신 충분히 반환할 만한 값이 있는지 고민해보기→ 반환값이 있다면 테스트도 용이해진다.메서드명추상화된 구체를 유추할 수 있는, 적절한 의미가 담긴 이름파라미터와 연결지어 더 풍부한 의미를 전달할 수도 있다.파라미터파라미터의 타입, 개수, 순서를 통해 의미를 전달파라미터는 외부 세계와 소통하는 창 💡메서드 생성 기능 (블럭 잡고 + ⌥ + ⌘ + M) 💡inline 기능 (⌥ + ⌘ + N)목적불필요한 변수를 줄이고 싶을 때메서드가 너무 작아서 굳이 따로 뺄 필요가 없을 때리팩토링할 때 코드 단순화방법변수를 선언한 곳에 값 자체를 직접 넣음메서드 호출을 해당 메서드의 코드로 직접 치환함상수를 선언한 곳에 값을 직접 대입함 </aside>inline 예제before int a = 10; int b = a * 2; System.out.println(b); after int b = 10 * 2; **System.out.println(b); => 변수 a를 없애고, 직접 값(10)을 대입함** 7. 추상화 레벨하나의 세계 안에서는 추상화 레벨이 동등해야 한다.8. 매직넘버, 매직스트링 (옵션 + 커맨드 + C)의미를 갖고 있으나, 상수로 추출되지 않은 숫자, 문자열 등상수 추출로 이름을 짓고 의미를 부여함으로써 가독성, 유지보수성이 향상됨추출 이후 클래스 하단에 모아짐섹션3. 논리, 사고의 흐름1. 뇌 메모리 적게 쓰기<aside> 💡“범주화”정리 시스템에서 중요한 과제를 최소의 인지적 노력으로 최대의 정보를 제공하는 것이다.-정리하는 뇌, 대니얼 J.레비틴-</aside><aside> 💡“집중력”뇌는 한 번에 한 가지 일 밖에 하지 못한다. 멀티태스킹? 그건 저글링일 뿐.-도둑맞은 집중력, 요한 하리-</aside>인지적 경제성최소한의 인지로 최대의 효율을 내보자뇌 메모리 적게 쓰기다른 사람들이 우리가 작성한 코드를 읽을 때 뇌 메모리를 효과적으로 쓸 수 있도록 가독성을 높이는 것이 핵심이다.2. Early return메서드로 추출 (리턴하기위해)if문을 쪼개서 elseif와 else의 사용을 지양3. 사고의 depth 줄이기중첩 분기문, 중첩 반복문메서드 추출로 중첩 분기문, 반복문을 줄여서 사고를 쪼개서 해볼 수 있음무조건 1 depth로 만들라는게 아님, 추상화를 통해 사고과정의 depth를 줄이는 것이 중요사용할 변수는 가깝게 선언하기4. 공백 라인을 대하는 자세공백 라인도 의미를 가진다.5. 부정어를 대하는 자세부정어구를 쓰지않아도 되는 상황인지 체크부정의 의미를 담은 다른 단어가 존재하는지 고민부정연산자 보다는 isNotA와 같이 표현하는것이 가독성이 좋음6. 해피 케이스와 예외 처리해피케이스는 우리가 의도한대로 진행되는 상황을 말함해피케이스의 예외 처리예외가 발생할 가능성 낮추기어떤 값의 검증이 필요한 부분은 주로 외부 세계와의 접점의도한 예외와 예상치 못한 예외를 구분하기Null을 대하는 자세항상 NullPointException을 방지하는 방향으로 경각심 가지기메서드 설계 시 return null을 자제Optional에 관하여Optional은 꼭 필요한 상황에서 반환타입에 사용한다.Optional을 파라미터로 받지 않도록 한다.Optional을 반환받았다면 최대한 빠르게 해소한다.섹션 4. 객체 지향 패러다임1. 단일 책임 원칙 (SRP, Single Responsibility Principle)클래스는 하나의 역할만 담당해야 한다.2. 개방-폐쇄 원칙 (OCP, Open/Closed Principle)코드는 확장할 수 있어야 하고, 기존 코드 수정 없이 기능을 추가할 수 있어야 한다.3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)자식 클래스는 부모 클래스의 기능을 대체할 수 있어야 한다.4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)필요한 기능만 포함한 작은 인터페이스를 여러 개로 나누어야 한다.5. 의존 역전 원칙 (DIP, Dependency Inversion Principle)구현이 아닌 추상화에 의존해야 한다.1주차 회고그 유명한 클린코드를 개발 공부 시작할때 경험해보고 싶어서 신청함Java 중급 문법 공부하고 있는 나에게도 '이렇게 생각할 수 있구나' 신선한 충격이었음강의를 하나하나 들을때마다 묘하게 빠져들음코드를 따라칠때는 메서드 추출이나 인라인처리 등의 단축키를 많이 사용하게 됨매직넘버, 매직스트링이라는 개념을 알게됨추상의 개념을 이해했다가 못했다가 계속 반복하면서 아직 자리잡지 못하고있음근데 또 강의를 보면 오 .. 신기하다 하면서 보고 있음=> 결론 : 어려우면서 재밌다 클린코드 

백엔드워밍업클럽백엔드클린코드

인프런 워밍업 클럽 BE-박우빈 클린코드&테스트 1주차 회고

# 학습에 관한 회고클린 코드에 대해 작정하고 탐구한 적은 없지만 모 부트캠프 선발과정에서 해당 주제를 처음 접하고 고민해본 적은 있었다. 덕분에 강의에서 나오는 단어와 이야기들이 아주 낯설지는 않았다. 그때도 느꼈지만 개념만 놓고 보면 참 아리송한 이야기들로 한가득이다. 문장으로는 읽히지만 곧 '그래서 뭐 어쩌라는거지', '이렇게.. 이렇게 하면 되는건가? 맞나?' 라는 질문들로 가득 찬다.강의는 고맙게도 설명과 간단한 예시에서 그치지 않고 아예 작은 프로젝트 하나를 통째로 뜯어고치며 그 내용들을 직접 적용해 설명해준다. 덕분에 명확하게 개념이 보이는 것들도 있고 아직은 아리송한 것들도 있다. 그래도 예시를 함께 보니 이전보다 훨씬 뚜렷해졌다.1주차가 시작되기 전에 미리 강의를 수강해두고 싶었는데 이전에 수강하던 강의 완료가 늦어져 그러질 못했다. 따라서 정해진 일정에 늦지 않게 맞춰 따라가는게 중요했다. 큰 무리 없이 따라가나 싶었지만 후반부에 다른 일이 끼어들어 진도 맞추는게 좀 빠듯해졌다. 또 강의 시간을 그대로 일정표에 적용했는데 코드를 실제로 작성하며 학습하는 과정 때문에 예상보다 좀 더 시간이 소요됐다. 2주차에선 각 섹션별로 시간을 좀 더 넉넉하게 잡고 본 클럽의 일정을 우선순위로 두어 무리없이 학습을 따라갈 예정이다.# 미션첫번째 미션은 '자유 주제로 추상화 연습해보기' 였다. 주제는 도메인이기에 내게 익숙한 취미생활 '볼링'으로 결정했다. 볼링 투구에 대해서 떠들어보라고 하면 몇 시간 단위로 떠들 수 있는 나이기에 파악된 정보를 추상화하기는 쉬울거라 생각했다.처음엔 상위 문장에서 점점 추상화를 통해 분리해 나갈 생각이었는데 이게 생각보다 쉽지 않았다. 이미 내 머리속에 로우 레벨의 정보들이 너무 많아서 차근차근 추상화되지 않고 한번에 몇 단계를 넘어 상세한 내용들이 쏟아진게 원인이었다. 추상화의 레벨이 중요함을 직접 체감했다.덕분에 과제 수행에 있어 순방향인지 역방향인지 모르겠지만 로우 레벨의 정보들을 모두 나열하고 관련 있는 정보들을 묶어 하이 레벨로 올라가기로 했고 잘 먹혀든 것 같다.또, 로우 레벨의 정보들에도 볼링 용어라고 할 만한 단어들이 많이 있었는데 이걸 더 풀어 설명하자니 지나치게 길어지는게 문제였다. 이를 도메인 지식이라고 할 수 있을 것 같다. 미리 알고 있어야 대화가 쉽게 풀리는 부분이 있음을 느꼈다.두번째 미션은 '추상화로 직접 코드 리팩토링 하기' 이다. 아직 나는 리팩토링이 익숙하지 않아 차근차근 해보기로 했다.먼저 복잡한 조건문들을 파악하여 early return의 형태를 갖췄다. 그 후 validateOrder메서드의 목적, 문맥과 함께 Order객체가 가질 책임을 상상해서 들어날 필요 없는 조건들을 모두 객체 내부 메서드로 옮겼다. 이름은 최대한 연속적으로 읽히도록 작명했다.결과, Order의 유효성을 검증할 건데, Order가 아이템을 가지고 있지 않다면, Order는 유효하지 않다.Order가 총 가격이 0보다 같거나 작다면, Order는 유효하지 않다.Order가 고객 정보를 가지고 있지 않다면, Order는 유효하지 않다.위 조건에 걸리지 않으면 Order는 유효하다.로 정리할 수 있었다.한가지 해결하지 못한 부분이 있었는데 두 번째 총가격 검증 부분에서 0이 메서드가 넘겨주는 인자가 되어야 할지, Order가 내부에서 알아서 기준을 세워 검증해야할지 의문이었다. 외부에서 0이라는 값을 지정한다면 이후 다양한 조건을 지정할 수 있을 것이고 Order가 내부에서 기준을 가진다면 validateOrder는 검사를 요구하기만 하면 되기 때문에 추상화 레벨에 맞다는 생각이 든다.세번째 미션은 'SOLID 정리하기'.이는 학습하면서 받은 느낌의 첫 인상만 짧게만 정리했다. 아직은 알것 같으면서 실천하라고 하면 좀 주춤할 것 같은 단계라 좀 더 코드로 직접 체감을 해봐야겠다.# 학습 내용 요약## 왜 클린 코드?- 가독성, Readability를 위해단순히 줄간격 등의 양식을 말하는 것이 아니다. 글, 코드가 잘 읽혀야한다. 잘 읽힌다는 것은 이해가 잘된다는 것을 뜻한다. 이해가 잘되면 유지보수가 수월해진다.## 어떻게 클린 코드?- 추상화, 중요한 정보를 골라 남기고 덜 중요한 정보는 치워둔다.지금 작성하는 메서드의 문맥을 읽고 핵심을 결정한다. 작성된 모든 코드는 메서드의 작동에 필요한 요소겠지만 지금 이 메서드의 이름에 부합하는 내용의 뼈대만 고르고 나머지는 다른 메서드에 치워둔다. 이를 반복하여 추상화 레벨을 다듬고 읽기 좋은 코드를 완성한다.## 몇 가지 구체적인 방법- 빠른 리턴, 조건을 구질구질하게 늘여놓지 말자 1. 이러하면 이거, 인데 아니면 저러할때때 저거, 인데 둘 다 아니면 그것. 조건이 여러 개 겹쳐서 읽힌다. 1. 이러하면 이거. 저러하면 저거. 그러하면 그거. 필요한 조건들만 분류하여 가독성을 높힌다.- 부정 연산자를 지양해보기if(!이러하면): '이러하지 않다면', 한 번 더 생각해야 한다.if(이러하지 않다면): '이러하지 않다면', 메서드명에 넣어버리자 읽기 편해진다.## 객체를 존중하기- 객체의 책임을 항상 염두해두고 이를 기반으로 적절한 추상화를 해야함## SOLID에 대해 정리해보기### SRP- 단일 책임의 원칙이란 하나의 클래스가 하나의 주제만 가지는 것### OCP- 개방-폐쇄의 원칙이란 새로운 코드 작성에 기존 코드가 영향 받지 않는 것### LSP- 리스코프 치환 원칙이란 부모 클래스는 자식 클래스의 부분집합이라는 것### ISP- 인터페이스 분리 원칙이란 인터페이스에는 반드시 필요한 메서드들만 선언하는 것### DIP- 의존성 역전의 법칙이란 추상화된 의존관계를 주입시켜 주는 것## 상속보다 조합- 상속보다는 조합이 우수하다.그럼.. 상속은 아무데도 쓸 곳이 없는건가요..? 상속만이 가지는 장점이 뭘까..## VO- 기본 타입을 랩핑- 불변성, final, setter 금지- 동등성, equals() & hashCode() 재정의- 유효성 검증, 생성 시점에 유효한 값 검증하기## Entity- 엔티티는 식별자가 존재한다. 이 식별자를 통해 동등성을 파악한다. 

안지수

[워밍업 클럽] CS 전공지식 1주차 미션

운영체제 while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다.이 방식은 폴링방식입니다.1초마다 체크하기 때문에 성능에 좋지 않습니다.이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?인터럽트 방식을 이용합니다.플레이어가 스킬을 사용하면 CPU에게 신호를 주고 CPU가 그 신호를 받아 인터럽트 서비스 루틴(ISR)을 실행시켜 작업을 완료합니다.인터럽트는 비동기적으로 동작하기 때문에 성능에 이점이 있습니다. 2. 프로그램과 프로세스가 어떻게 다른가요?프로그램 : 하드 디스크 등과 같은 저장장치에 저장된 명령문의 집합체 / 애플리케이션(앱) / .exe 파일(Windows 운영체제)프로세스 : 실행 중인 프로그램(하드 디스크에 저장된 프로그램이 메모리에 올라갔을 때) 3. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍 : 메모리에 여러 개의 프로세스를 올려서 처리멀티프로세싱 : 멀티프로세서(여러 개의 CPU)로 작업을 처리 4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?프로세스가 만들어지면 운영체제는 해당 프로세스의 정보를 가지고 있는 PCB(Process Control Block)를 만들어 저장합니다.PCB는 연결리스트로 저장되어 프로세스가 종료되면 연결리스트에서 해당 프로세스의 PCB를 제거합니다. 5. 컨텍스트 스위칭이란 뭔가요?컨텍스트 스위칭(Context Switching)이란 프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행 중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 교체하는 작업입니다.실행 중인 프로세스의 작업 내용을 PCB에 저장하고 실행될 기존 프로세스의 PCB의 내용대로 CPU가 다시 세팅됩니다.컨텍스트 스위칭이 일어날 때 PCB의 내용-프로세스 상태, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보 등-이 변경됩니다. 자료구조와 알고리즘1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.학생 번호와 학생 이름을 key-value 쌍으로 저장할 수 있는 HashTable(Map) 구조를 선택하겠습니다.학생 번호로 빠르게 조회할 수 있고 학생을 추가하거나 삭제하는 경우에도 성능이 좋기 때문입니다. 2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다.이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.주문이 들어온 순서대로 처리되므로 FIFO 구조인 큐를 사용하겠습니다. 3. 우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다.반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요. class Stack { constructor() { this.list = new LinkedList(); } push(data) { this.list.insertLast(data); } pop() { try { return this.list.deleteLast(); } catch (e) { return null; } } peek() { return this.list.getNodeAt(0); } isEmpty() { return (this.list.count == 0); } }  4. 해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요.힌트: charCodeAt() 함수를 이용예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력hashFunction(name){ return name.charCodeAt(0) % 10; }

재영

[인프런 워밍업 클럽 3기] CS - 1주차 미션 (운영체제)

while(true) { wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다.1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?스킬을 언제 사용했는지 알 수 없기 때문에 주기적으로 계속 체크하는 폴링 상황은 성능에 좋지 않음이때, 인터럽트 방식을 사용할 수 있음수업에서 예시로 설명되었던 입출력 관리자의 예시를 생각해보면, CPU는 입출력 관리자에게 명령을 내리고 CPU는 다른 일을 진행입출력 관리자는 입출력이 완료되었을 때 CPU에게 신호를 줌CPU는 그 신호를 받아 인터럽트 서비스 루틴을 실행시켜 작업을 완료하는 형식으로 처리문제와 결합하여 생각해보면, 인터럽트 신호를 플레이어가 스킬을 사용한 경우라고 볼고, 플레이어가 스킬을 사용하면 (인터럽트) 알리도록 설정하면됨  프로그램과 프로세스가 어떻게 다른가요?프로그램 : 하드디스크와 같은 저장장치에 저장된 명령문의 집합체.애플리케이션이나, 앱이라고 불리며 Windows 운영체제에서는 .exe 모양을 하고 있음컴퓨터 관점에서 하드디스크만 사용하는 수동적인 존재프로세스 : 실행중인 프로그램하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 실행중인 프로그램을 프로세스라 함프로세스는 메모리도 사용하고, 운영체제의 CPU 알고리즘 스케줄 알고리즘에 따라서 CPU도 사용,필요에 따라 입력, 출력을 하기 때문에 능동적인 존재프로세스는 코드, 데이터 힙, 스택 영역으로 구성Code 영역은 자신을 실행하는 코드가 저장되어 있음Data 영역은 전역 변수와 정적 변수가 저장되어 있음Stack 영역에는 지역변수와 함수 호출을 했을 때 필요한 정보들이 저장됨Heap 영역은 프로그래머가 동적으로 메모리를 할당하는데 쓰임C언어를 예로 들면, malloc(), free() 함수를 호출하면 Heap 영역에 자원을 할당 / 해제할 수 있음  멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍은 메모리에 여러 프로세스를 올려서 처리하는 방식CPU는 프로세스를 실행하다가 I/O 작업을 만나면 해당 프로세스에서 발생한 I/O 작업은 기다리면서 다른 프로세스를 실행 → CPU가 쉬는 시간이 줄어들며, 효율성이 올라감여기서 프로세스가 IO 작업이 있을 때만 다른 프로세스를 실행하는 것이 아닌,모든 프로세스를 짧게 실행하며 모든 프로세스를 동시에 실행시키는 것 처럼 느끼게 하는 기술을 멀티 태스킹이라고함이때, CPU가 하나가 아닌 여러 개를 사용하는 상황을 멀티프로세서라 부르며, 멀티프로세서로 작업을 처리하는 것을 멀티프로세싱이라고 함정리하면,멀티프로그래밍은 단일 CPU 관점에서 메모리에 여러 프로세스를 올려서 처리하는 방식이고,멀티프로세싱은 다중 CPU 관점에서 여러 프로세스가 짧게 실행되며 프로세스를 동시에 시키는 것처럼 느끼게 하는 상황  운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?PCB Process Controll Block운영체제는 여러개의 프로세스를 전부 다 관리하고 공평하게 실행시켜야함운영체제는 프로세스가 만들어지면 해당 프로세스의 정보를 가지고 있는 PCB를 만들고 저장PCB는 연결리스트 자료구조 형태로 저장되며, PCB의 구조는 다음과 같음  컨텍스트 스위칭이란 뭔가요?컨텍스트 스위칭 Context Switching 우리말로는 문맥 교환이라고함프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 교체하는 작업을 말함.컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경되며, 실행중인 프로세스의 작업 내용을 PCB에 저장하고 실행 될 기존 프로세스의 PCB의 내용대로 CPU가 다시 세팅됨

인프런워밍업클럽3기CS1주차미션운영체제

[워밍업스터디3기][발자국][1주차] 읽기 좋은 코드

먼저, 느낀 점생각보다 1주차는 깊게 집중하지 못한 것 같다. 진도가 조금 밀리면서 듣긴 했지만강의도 열심히 듣고, 과제도 제출했지만 일방적인 학습만 했지, 이 과정을 돌아볼 시간을 못들였다. 이제 시작이니 2주차부터는 더 진심으로 달려보자. 다음, 배운 점이번주 가장 인상깊은 내용은 '섣부른 추상화'는 오히려 독이라는 것이다.예시로는 발성기관에 음을 붙여 하는 무슨 행위..를 하는 공간으로 '노래방'과 '지름방' 이라는 단어를 사용하는 두 화자가 나왔다. 지름방이라는 네이밍(추상화의 가장 중요한 요소중 하나!!) 을 한 사람도, 기존에 장황하게 쓰던 단어를 더 편하고 간결하게 쓰고 싶었을 것이다.다만 더 넓은 (다른 동네, 다른 도시) 범위의 사람들과 통하지 않는, 너무 코앞의 문제해결만을 위한 행위였다는 점이 의사소통의 실패를 가져온 것이 아닐까 한다.우리도 코드를 작성할 때, 중복되는 내용 또는 공통으로 필요할 내용을 리팩토링 하고 싶은 욕구가 생긴다.자주 쓰이는 값 (ex, order.getId(), order.getStatus()) 을 변수로,비슷한 로직 (validation, pre-processing) 을 메서드로,이러한 값과 행위를 클래스로 묶어보며 더 클린한 코드를 만들고자 노력한다.하지만 미래는 예측하기 어렵고, 경험까지 부족하다면 클린한 코드가 중복되는 이상한 현상이 발생하게 된다.어떤 Util을 만들었더니, 사실 A-Util이고 비슷한 로직이 추가되면 B-Util, C-Util이 되는..이런 실력은 많은 의식적인 경험과, 이를 돌아보는 프로세스를 반복하며 서서히 쌓이는 것 같다고 느꼈고,그래서 이번주 아쉬움이 앞서 말한 형태로 남았나 싶다. 

백엔드클린코드워밍업스터디

인프런 워밍업 클럽 스터디 3기 - 백엔드 클린 코드, 테스트 코드 1주차 발자국

학습 내용 요약 읽기 좋은 코드가 되기 위해서 고려하여야 할 많은 사항들을 알 수 있었다.공부한 내용들 중 가장 인상 깊었던 내용들을 나만의 방식으로 정리해보려고 하니 두 가지의 카테고리를 만들어 정리할 수 있었다. 1. 맥락(도메인 지식, 클래스)에 맞도록 하고, 필요하다면 의미를 부여한다클래스에 속하는 것 자체로 의미를 내포하게 된다.메서드의 모든 구성요소 (이름 뿐만 아니라 파라미터, 리턴타입도)를 고려해야 한다. 사용되는 관점을 특히 주의매직 넘버, 매직 스트링 사용value object, 일급 컬렉션, enum의 공통점 → 의미 부여를 하고, 해당 의미를 잘 수행하도록(검증 등) 하는 공간(클래스)를 만드는 것조건/행위의 분기가 반복 될 때는 이 또한 다형성을 활용할 수 있다. 2. 읽는 이로 하여금 여러 번 생각하지 않아도 이해하기 쉽도록 한다.누구나 바로 이해할 수 있는 네이밍하기, 팀의 약속 준수추상화 레벨 맞추기부정어 쓰지 않기조건문은 early return을 통해 중첩된 사고를 하지 않도록 유도중첩 그 자체로 표현이 되는 경우에는 그대로 두는 것이 유리할 때도 있다. 다음주엔..솔직히 배웠던 내용들을 개념적으로는 이해를 한 것 같다. 특정 개념들은 감탄하며 재미있게 공부도 했었다. 이걸 코드 레벨에서 강의를 듣지 않고 다시 적용한다 생각하면 할 수 있을까 자신이 없다. 공부한 여러 고려 사항들을 적용해야 하는 부분을 발견하는 과정부터 연습을 다시 해봐야 실력이 늘 것으로 생각된다. 미션 수행 시 고려했던 사항early return메서드 파라미터로 표현되는 내용 네이밍에 포함 시키지 않기order클래스가 내부적으로 로직을 수행하고 메세지를 전달한다고 가정부정연산자 쓰지 않도록 고려한 네이밍 주어진 리턴 타입 준수하기 학습을 더 진행한 후다시 보니 조건/행위의 분기가 반복되는 형태인 것 같다. 어쩌면 다형성을 활용할 수 있겠지만, 리턴 타입이 true/false단순 두개 여서 과할 수도 있겠다는 생각이 들었다.리팩토링 하다보니 나도 모르게 검증 순서가 바뀌었는데, 이걸 함부로 고치면 기존 로직을 수정하지 못한다 가정 시 문제가 생길 수도 있다고 생각된다기존 : 주문 항목 검증 -> 사용자 정보 검증 -> 가격 검증수정 : 주문 항목 검증 -> 가격 검증 -> 사용자 정보 검증로그를 하는 것을 추출하고 싶다는 생각이 들었음출처강의 : Readable Code: 읽기 좋은 코드를 작성하는 사고법https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard

채널톡 아이콘