🎁 모든 강의 30% + 무료 강의 선물🎁

블로그

박소연

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

🐾 발자국워밍업 클럽 3기 BE 클린코드 & 테스트 - 1주차를 듣고 작성하는 발자국입니다이번에 들은 강의 바로 가기 ⬇Readable Code: 읽기 좋은 코드를 작성하는 사고법 📃 회고[워밍업 클럽을 듣게 된 이유]대학교 개강을 앞두고 있던 와중 ,,, 개강하면 열심히 살아야겠다는 다짐을 하던 와중인프런 워밍업 클럽을 모집한다는 메일을 발견하게 되었습니다지금까지 인프런에서 강의를 완강하려면 거의 3~4개월이 필요했던 저는 이번 기회를 통해서 공부 습관을 다잡고 하루를 알차게 살아보자라는 생각에강의를 결제하고 워밍업 클럽을 신청하게 되었습니다. [워밍업 클럽 1주차를 들으며 .. ]박우빈 코치님이 짜주신 커리큘럼을 따라서 강의를 듣자는 목표를 세웠습니다.OT 를 참가했을 때 우리가 진행하는 커리큘럼이 굉장히 빡셀 수도 있다라는코치님의 말을 들으면서 내가 할 수 있을까 ,,,, 🧐 라는 생각도 잠시실제로 들어보니깐 힘들긴 했지만 그래도 못들을 정도의 학습량은 아니더라고요 !✔ 커리큘럼이 짜여져 있고✔ 강의를 듣는 사람들이 여러명이고✔ 미션을 통해 강의 내용을 중간중간 확인할 수 있고✔ 강의 내용이 좋아서더욱 열심히 들었습니다 !!이론으로 듣고 실제 코드를 고쳤을 때의 희열도 있었던 것 같아요 ㅎㅎ 👍 1주차에서 잘한 점 날마다 정해진 강의량을 들은 것미션을 빼먹지 않고 참여한 것 👎 1주차에서 못한 점강의를 듣고 난후 나만의 언어로 바꿔서 복습하지 않은 것 🥅 2주차의 목표강의를 모두 들은 후 나만의 언어로 정리해 내 걸로 만들기 !📺 강의 내용 정리섹션2 추상 (抽象)우리가 클린코드를 추구하는 이유 우리는 가독성을 위해서 클린 코드를 추구한다.가독성이 좋아지면 얻을 수 있는 것들이 많다. (이해가 잘되고, 유지보수하기 수월함)클린 코드를 추구하기 위해서 가장 중요한 주제가 바로 추상추상과 구체 중요한 정보는 가려내어 남기고, 덜 중요한 정보는 생략하여 버리는 것이 추상인간은 자연스럽게 추상화 능력을 가지고 있다'잘못된 추상화'는 굉장히 큰 사이드 이펙트를 가져오지만'적절한 추상화' 는 해당 도메인의 문맥 안에서 정말 중요한 핵심 개념만을 남겨서 표현함으로서 굉장히 큰 이점을 얻을 수 있다.이름 짓기이름을 짓는다는 건 추상적 사고를 기반으로 한다단수와 복수를 구분하기 / 이름 줄이지 않기 / 은어, 방어 사용하지 않기 / 좋은 코드를 보고 습득하기 메서드와 추상화잘 쓰여진 코드라면 한 메서드의 주제는 반드시 하나다.메서드의 이름은 구체적인 내용을 추상화해서 잘 나타내야 한다생략할 정보와 의미를 부여하고 드러낼 정보를 잘 구분해야 한다 메서드 선언부 반환타입 메서드명 ( 파라미터 ) 가 메서드 선언부반환타입, 메서드명, 파라미터에 추상화된 정보를 잘 담아야 한다추상화 레벨메서드로 추출한 경우 메서드 내부와 외부로 경계가 생긴다각각의 세계에서는 추상화 레벨이 동등해야 한다  섹션3 논리, 사고의 흐름뇌 메모리 적게 쓰기 최소한의 인지로 최대한의 효율을 내자뇌의 메모리에 적은 정보를 올릴수록 읽기 쉬운 코드가 된다Early returnif - else if - else 를 사용하는 경우 else 까지 오게 되면 If, else if 의 내용을 기억하고 있어야 한다이렇게 복잡한 코드를 사용하는 것이 아닌 조건문이 끝날 때마다 return 을 하게 되면 앞의 코드를 신경쓰지 않아도 된다사고의 depth 줄이기중첩 분기문, 중첩 반복문을 사용하면 사고의 depth 가 굉장히 깊어진다무조건 1 depth 로 만드는 것이 아니라 추상화를 통한 사고 과정의 depth 를 줄이는 것이 중요하다공백 라인을 대하는 자세공백 라인도 의미를 가진다복잡한 로직의 의미 단위를 나누어 보여줌으로써 읽는 사람에게 추가적인 정보를 전달할 수 있다부정어를 대하는 자세부정어구를 쓰지 않아도 되는 상황인지를 체크하고부정의 의미를 담은 다른 단어가 존재하는지 고민하거나 부정어구로 메서드명을 구성한다해피 케이스와 예외 처리사람은 해피 케이스에만 몰두하는 경향이 있지만 예외처리를 꼼꼼히 할수록 더욱 좋은 개발자가 된다예외가 발생할 가능성을 낮추고, 의도한 예외와 예상하지 못한 예외를 구분하자항상 NullPointException 을 방지하는 방향으로 개발해야 한다Optional 은 비싼 객체이기 때문에 꼭 필요한 상황에서 반환타입에 사용한다. 섹션 4 객체 지향 패러다임추상의 관점으로 바라보는 객체 지향 객체 지향 : 객체를 통해 객체간의 협력으로 프로그래밍 객체 : 추상화 된 [데이터 + 코드] 관심사를 분리해 관심사를 한 곳으로 모으면 유지보수에 도움이 된다객체 설계하기관심사가 퍼져 있는 코드에서 관심사를 한 곳으로 모다 객체로 분리해야 한다분리된 객체에서 공개 메서드를 통해서 기능을 제공한다객체의 책임이 나뉨에 따라 객체간의 협력이 강조된다새로운 객체를 만들때에는 1개의 관심사로 명확하게 책임이 정의되었는지 확인한다SRP (단일 책임 원칙)하나의 객체는 하나의 책임만 가져야 한다관심사를 분리해서 높은 응집도, 낮은 결합도OCP (개방-폐쇄 원칙)확장에는 열려있고, 수정에는 닫혀있어야 한다추상화와 다형성을 활용해 OCP 를 지킬 수 있다LSP (리스코프-치환 원칙)상속 구조에서 자식 클래스는 부모 클래스의 책임을 준수해야한다ISP (인터페이스 분리 원칙)클라이언트는 자신이 사용하지 않는 인터페이스에 의존해선 안된다DIP (의존성 역전 원칙)상위 수준의 모듈은 하위 수준의 모듈에 추상화로 의존해야 한다 섹션 5 객체 지향 적용하기상속과 조합상속보다는 조합을 사용해야 한다. 상속은 시멘트처럼 굳어지는 구조이기 때문에 수정이 어렵다Value Object 기본타입을 객체로 감싸서 의미를 부여하고 추상화하는 기법값으로 취급하기 위해서 불변성, 동등성, 유효성 검증 등을 보장해야 한다Entity 는 식별값으로 객체를 비교하지만, VO 는 내부의 모든 값이 같아야 같은 객체로 취급 ✔ 미션DAY2 미션 - 추상과 구체의 예시 미션내용 : "추상과 구체" 강의를 듣고, 생각나는 추상과 구체의 예시가 있다면 한번 3~5문장 정도로 적어봅시다. 미션 수행 내용추상스타벅스에서 음료를 테이크아웃한다구체스타벅스 앱에 접속한다주문할 매장을 선택한다픽업 옵션에서 To-go 를 선택한다슈크림라떼를 선택한 뒤, 원하는 옵션을 추가한다결제 방식을 선택한 후 결제를 완료한다매장에 도착해 주문 번호가 호출될 때까지 기다린다.슈크림라떼를 테이크아웃한다 DAY4미션1 - 코드 리팩토링미션 내용 : 아래 코드와 설명을 보고, [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링해 봅시다.public boolean validateOrder(Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } else { if (order.getTotalPrice() > 0) { if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } else { return true; } } else if (!(order.getTotalPrice() > 0)) { log.info("올바르지 않은 총 가격입니다."); return false; } } return true; }미션 수행public boolean validateOrder(Order order) { if (order.isEmptyOrder()) { showInfoLog("주문 항목이 없습니다."); return false; } if (order.isNotHaveCustomerInfo()) { showInfoLog("사용자 정보가 없습니다."); return false; } if (order.isNotValidPrice()) { showInfoLog("올바르지 않은 총 가격입니다."); return false; } return true; } private void showInfoLog(String msg) { log.info(msg); }Order 객체 내부에 isEmptyOrder, isNotHaveCustomerInfo, isNotValidPrice 메서드를 만들어서 Order 에 대한 행동을 Order 자체에서 제어할 수 있도록 구현isEmptyOrder : 주문이 비었는지 아닌지 확인isNotHaveCustomerInfo : 사용자 정보가 비었는지 확인isNotValidPrice : 올바르지 않은 총 가격인지 확인 DAY4미션2 - SOLID미션 내용 : SOLID에 대하여 자기만의 언어로 정리해 봅시다.미션 수행 S (단일책임원칙)각 객체가 하나의 명확한 관심사(책임)만을 가져야 한다책임을 발견해내는 것은 경험의 영역이기 때문에 객체를 설계할 때마다 현재 객체가 하나의 책임만 가지고 있는지 질문해야 한다ex) MinesweeperGame -> Minesweeper 랑 GameApplication 으로 분리O (개방-폐쇄원칙)확장에는 개방되어 있고, 수정에는 폐쇄되어야 한다새로운 요구사항이 발생되었을 때에도 기존 코드를 직접 수정하지 않고, 확장할 수 있는 방식으로 설계해야 한다ex) 결제 수단을 여러 개 추가해야 하는 경우L (리스코프 치환 원칙)상속구조에서 부모클래스를 자식클래스로 치환할 수 있어야 한다부모클래스에서 사용하는 기능을 자식클래스가 사용하지 않는다면 추가적인 코드 처리가 필요하게 되는데, 이런 경우 사이드 이펙트가 발생할 수 있다ex) Animal 클래스에 fly 메서드가 있는데 Animal 을 상속받는 동물이 사자인 경우I (인터페이스 분리 원칙)인터페이스의 단위를 잘게 쪼개 클라이언트가 사용하지 않는 기능을 사용하지 않도록 해야 한다인터페이스에 클라이언트가 사용하지 않는 기능이 포함되어 있으면 사용하지 않는데 추가적인 코드 작업을 해야하고, 클라이언트 입장에서는 해당 메소드의 의미를 모르게 된다ex) Animal 인터페이스에 fly() 랑 walk() 메서드가 있으면 Fly 인터페이스, Walk 인터페이스 로 분리D (의존성 역전 원칙)상위 수준 모듈은 하위 수준 모듈의 추상화에 의존해야 한다상위 수준 모듈이 하위 수준 모듈의 구체적인 코드를 알 필요가 없다. 추상화를 통해 어떤 기능을 제공하는지만 알려주고 내부적인 코드는 하위 수준 모듈들에서 작성할 수 있도록 해야 한다상위 수준 모듈인 음식점의 경우 하위 수준 모듈로 라면끓이는 법을 아는게 아니라 음식만드는 법이라는 추상화에 의존하면 여러 메뉴를 만들 수 있음

백엔드워밍업클럽워밍업클럽3기클린코드&테스트

송헌욱

1주차 발자국

이번 학습에서는 코드 품질을 높이기 위한 클린 코드 원칙과 리팩토링 기법을 집중적으로 다루었다. 단순히 코드 스타일을 개선하는 것이 아니라, 유지보수성과 가독성을 높이는 것이 궁극적인 목표라는 점을 다시금 깨달았다. 좋은 코드란 결국 팀원들과의 협업이 원활하고, 변경이 용이한 코드라는 점을 실감했다. 클린 코드와 추상화우리가 클린 코드를 추구하는 이유클린 코드의 핵심은 가독성을 확보하여 유지보수를 쉽게 만드는 데 있다. 이를 위해서는 동일한 레벨의 추상화가 필수적이다.가독성은 왜 필요할까? 구현만 해서 사용자로 하여금 기능만 정상적이면 되지 않을까?유지보수 업무를 하면서 느끼게 되었다. 가독성이 좋지 않은 코드는 코드를 이해하는데 오랜 시간이 걸리게 된다.과연, 여기저기 기준없이 작성된 코드를 짠 개발자가 1년뒤에 다시 그 코드를 봤을때, 코드를 이해하는 시간이 짧을까?당연하게도 처음보는 개발자보다는 조금은 빠를 수 있겠지만, 당사자도 오랜 시간이 걸릴꺼라 생각한다.이처럼, 코드는 구현이 끝이 아니다. 우리는 구현된 코드를 다시 만질 일이 언젠가 생긴다. 프로그램의 정의"프로그램 = 데이터 + 코드"결국, 데이터를 어떻게 정의하고 조작할 것인가가 코드의 본질인가 보다. 추상과 구체추상화는 구체적인 경험에서 출발해야 한다. 처음부터 완벽한 추상화를 기대하기보다, 먼저 실체적인 작업을 통해 패턴을 발견하고 점진적인 추상화를 진행하는 것이 효과적이다. 추상: 기계를 정비했다.구체: 기계가 정상적으로 작동하지 않는 것을 발견한 후, 먼저 외관을 육안으로 점검하여 육안으로 보이는 손상여부를 확인하였다. 이후, 전원을 차단하고, 조립된 기계의 볼트와 너트를 분해하면서 기계의 주요 부품들의 마모 상태를 체크하고, 부품의 내부 손상정도를 파악했다. 문제의 원인은 주요 부품의 마모로 인한 진동 발생임을 확인하고, 기존의 부품을 탈거한 뒤, 새 부품을 장착하였다. 이후 다시 조립을 하고, 전원을 연결한 뒤 정상적으로 문제가 해결되었는지 테스트를 거친후 정비를 완료하였다.  이름 짓기적절한 네이밍을 위해 다음과 같은 원칙을 적용하려 노력해본다.단수/복수를 명확히 구분한다의미를 모호하게 만드는 약어를 사용하지 않는다특정 조직이나 개인만 이해할 수 있는 은어, 방언을 사용하지 않는다.좋은 코드에서 네이밍 스타일을 습득한다. 메서드와 추상화글에서 읽기 편안한 글이 되기 위해서는 한 문단이 하나의 주제를 가지면 된다. 마찬가지로 코드에서 메서드도 하나의 주제(책임)만을 가지게 되면 가독성이 좋아진다. 추상화 레벨같은 레벨의 추상화가 유지되지 않으면, 코드의 흐름에 의문이 생기기 마련이다. 따라서 메서드를 추출할 때는 추상화 레벨을 맞추는 것이 중요하다. 매직 넘버와 매직 스트링언어마다 상수를 지정하는 방식이 다르다. 매직 넘버와 매직 스트링을 제거하고 의미 있는 상수로 대체하는 것만으로도 코드의 가독성이 크게 향상된다. SOLIDSOLID 원칙을 통해 코드 작성에 대한 깊은 고민을 할 수 있었다.public class MissionDay4 { public boolean validateOrder(Order order) { if (hasNoItems(order)) { return false; } if (hasInvalidTotalPrice(order)) { return false; } if (isMissingCustomerInfo(order)) { return false; } return true; } private boolean hasNoItems(Order order) { if (order.getItems().isEmpty()) { log.info("주문 항목이 없습니다."); return true; } return false; } private boolean hasInvalidTotalPrice(Order order) { if (order.getTotalPrice() <= 0) { log.info("올바르지 않은 총 가격입니다."); return true; } return false; } private boolean isMissingCustomerInfo(Order order) { if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return true; } return false; } } 주어진 리팩토링 코드를 위와 같이 메서드를 분리하고, 최대한 부정조건을 사용하지 않으려 노력하면서 코드의 가독성이 높아지고 유지보수가 쉬워진다는 점을 경험할 수 있었다. 마치며SOLID 원칙을 코드에 적용해보면서 설계기법의 생각을 해볼 수 있었다.다음은 조금더 객체를 이용하고 객체의 목적과 책임에 맞게 구현하고, Getter, Setter를 무작정 사용하지 않는 연습을 깊이 해보는 것이 목표다.

이선주

[1주차] 인프런 워밍업 클럽 스터디 3기 - CS전공지식 발자국

자료구조데이터를 저장하는 구조이며, 어떤 자료구조를 선택하느냐에 따라 데이터 처리 방식이 달라진다.변수: 가장 단순한 자료구조로, 저장된 데이터를 찾으려면 변수명을 사용.배열: 데이터를 연속된 메모리 공간에 저장하며, 인덱스를 통해 빠르게 접근 가능.유지보수 측면에서 데이터를 배열에 저장하는 것이 일반적으로 유리함.단, 데이터 삽입/삭제 시 오버헤드가 발생하여 성능 저하 가능.연결리스트: 노드(데이터 + 포인터)로 이루어져 있으며, 각 노드가 다음 노드를 가리키는 방식.첫 번째 노드만 알면 전체 리스트를 탐색 가능.데이터 삽입/삭제가 용이(기존 데이터 이동 없이 포인터만 변경).하지만 특정 위치에 접근하는 속도는 배열보다 느림.배열 vs 연결리스트배열: 빠른 검색(O(1)) & 고정된 크기의 연속된 메모리 할당연결리스트: 빠른 삽입/삭제(O(1)) & 동적 메모리 할당시간 복잡도 & 알고리즘 성능알고리즘은 코드 실행 성능을 결정하며, 반복문이 많아질수록 실행시간이 증가.성능을 평가하는 기준:메모리를 줄이는 알고리즘메모리를 많이 사용하지만 속도가 빠른 알고리즘시간 복잡도 (Big-O 표기법)입력 크기(n)에 따라 계산량이 어떻게 증가하는지를 나타냄.빅오(O): 최악의 경우빅세타(Θ): 평균적인 경우빅오메가(Ω): 최선의 경우일반적으로 빅오(O)를 많이 사용.빅오 표기법 예시O(1): 상수 시간 - 입력 크기와 상관없이 일정한 시간 소요 (예: 배열에서 인덱스로 접근)O(n): 선형 시간 - 입력 크기에 비례해 실행 시간 증가 (예: 배열을 순회)O(n²): 제곱 시간 - 중첩 반복문 (예: 버블 정렬)O(log n): 로그 시간 - 이진 탐색자료구조 선택배열: 빠른 조회(O(1)), 삽입/삭제가 비효율적(O(n))연결리스트: 삽입/삭제가 효율적(O(1)), 조회가 비효율적(O(n))메모리 구조가 중요한 경우 운영체제 공부가 필요.추상 자료형 (ADT, Abstract Data Type)자료구조에서 제공하는 기능을 정의한 것.예시:연결리스트의 모든 원소 출력모든 데이터 제거특정 인덱스에 데이터 삽입 정리: 적절한 자료구조를 선택하고, 알고리즘을 통해 데이터를 효과적으로 처리해야 한다. 성능 평가를 위해 Big-O를 사용하며, 특정 작업에 맞는 자료구조를 골라야 한다.

알고리즘 · 자료구조알고리즘자료구조운영체제

하얀종이개발자

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

클린코드 스터디 - 발자국을 통해서 1주동안의 강의와 미션을 통해 무엇을 배웠고, 어떻게 느꼈는지 작성합니다. 섹션1~5 배운 내용섹션 2. 데이터를 추상화추상과 구체이름짓기, 메서드와 추상화, 메서드 선언부, 추상화 레벨, 매직넘버와 스트링 섹션 3. 코드를 추상화인지적 경제성메서드를 리팩토링 하는 방법Early return공백 라인, 부정어예외처리stream API와 Optional() 섹션 4. 객체지향 페러다임객체지향의 특성SOLID 원칙 섹션5. 객체 지향 적용하기상속과 조합Value Object 일급 컬렉션Enum의 특성과 활용 다형성 활용숨겨져 있는 도메인 개념 도출하기  발자국 1주차 회고 💡 배운 점기존에 어설프게 객체지향 코드를 작성했던 부분을 왜 이렇게 작성해야 하는지어떻게하면 더 잘 읽힐 수 있는지를 많이 배운 것 같아요.특히, 인지적 경제성: 최소한의 인지만 가져가서 최대한의 효율을 내보자!! 라는 말을 많이 깨닫게 된 것 같습니다. 🤷‍♂ 잘한 점읽기 좋은 코드를 이해한 상태로 내가 바꿔보고 강의를 보면서 나와 다른점이 뭔지 보면서 많이 느꼈어요.굉장히 재밌어서 그런지, 매일 꾸준히 공부한 부분도 좋았습니다.이제는 코드를 칠 때 한번 더 생각하게 되는거 같아요. 어떻게 작성하면 다른사람이 편하게 읽을 수 있을까를요.₩⚠ 아쉬운 점영어가 약해서 메서드명 짓기가 너무 서투르다는 것을 느꼈어요.다른 사람들이 메서드명을 어떻게 짓는지 많이 보면서 더 읽기 좋은 메서드명을 찾아봐야 할 것 같아요. 🎯 다음 주 목표따로 정리한 내용 한번씩 읽어보기코드를 따라 치는게 아니라 내가 바꿔보고, 강의를 통해서 바뀐 부분 비교하기단순히 원칙만 지키는게 아니라, 더 읽기 좋은 코드를 작성하기 위해 깊게 고민하기   한마디아직 많이 부족하구나 라는 것도 느꼈지만, 더 좋은 코드를 작성할 수 있게 될 거라는 생각에 너무 즐거워요. 🙃다들 다음주도 화이팅입니다.  

백엔드워밍업클럽클린코드박우빈ReadableCode

노을

[인프런워밍업클럽] 1주차 3기 CS 전공지식 미션 발자국

운영체제 운영체제 개요프로세스 관리메모리 관리하드웨어 관리 운영체제의 역사1940년도 애니악 : 미사일 탄도 계산, 전자 디지털 계산기, 속도 느림, 오래 걸림, 하드웨어 비용이 비쌈, 인건비 저렴1950년도 초반 : 직접 회로(IC) 개발, 현재 컴퓨터 모양, 펀치카드로 → 프로그래밍 → 계산 결과1950년도 중후반 : 오퍼레이터의 오버헤드가 너무 느려짐, 싱글스트림 배치시스템입출력을 담당하는 i/o 디바이스 컨트롤러를 만들어 입출력중에도 cpu가 계산하도록 함출력은 i/o 디바이스 컨트롤러를 이용해서 cpu와 분리가 가능하지만, cpu 성능이 떨어짐1960년도 싱글스트림 배치시스템 성능 향상 → 시분할 시스템파일시스템 등장유닉스 운영체제 개발 → 프로그램을 동시에 여러 개 실행시키는 멀티 프로그래밍 프로그램과 프로세스프로그램 : 하드디스크 등과 같은 저장장치에 저장된 명령문의 집합체, 컴퓨터 관점에서 하디디스크 즉, 저장장치 만 사용하는 수동적인 존재ex) 앱, .exe프로세스 : 실행중인 프로그램, 메모리도 사용, 운영체제의 CPU스케줄링 알고리즘에 따라서 CPU도 사용, 필요에 따라 입력과 출력을 하기 때문에 능동적인 존재프로세스의 구조? 코드영역, 데이터 영역, 스택 영역, 킵 영역코드 영역 : 자신을 실행하는 코드가 저장데이터영역 : 전역 변수와 스태틱 변수가 저장스택 영역에서는 지역변수와 함수 호출을 했을 때 필요한 정보들이 저장힙 영역은 프로그래머가 동적으로 메모리를 할당하는데 사용실행중인 프로그램 : 하드디스크에 저장된 프로그램이 메모리에 올라갔을 떄 실행중인 프로그램 → 스레드 멀티프로그래밍과 멀티프로세싱멀티프로그래밍 : CPU가 프로세스를 실행하다가 I.O 작업을 만나면 해당 프로세스에서 발생한 I.O 작업은 기다리면서 다른 프로세스를 실행 → CPU가 쉬는 시간이 적어져 효율성이 높아짐멀티프로세싱 : 멀티프로세서로 작업을 처리하는 것멀티프로세서란?모든 프로세스를 동시에 실행시키는 것처럼 느끼게 하는 기술을 멀티 태스킹여기서 CPU를 한개가 아니라 여러개를 이용할 수 있는데 CPU가 여러개 있다면 이를 멀티프로세서라고 함 PCB운영체제는 여러 개의 프로세스를 전부 다 관리, 공평하게 실행프로세스가 만들어지면 운영체제는 해당 프로세스의 정보를 가지고 있는 PCB를 만들고 저장 컨텍스트 스위칭프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스 상태를 저장하고 다른 프로세스의 상태 값으로 교체하는 작업발생하는 이유?CPU 점유시간이 다 되거나 입출력 요청이 있거나 다른 종류의 인터럽트가 있을 때 발생 자료구조와 알고리즘 자료구조와 알고리즘이란?자료구조 : 데이터가 어떤 구조로 저장, 사용 되는지를 나타냄예) 변수, 배열알고리즘 : 어떤 문제를 해결하기 위한 확실한 방법, 자료구조에 따라 알고리즘이 변경 되기도 함 시간복잡도란?특정 알고리즘이 어떤 문제를 해결하는데 걸리는 시간사용자마다 컴퓨터 사양이 다르기 때문같은 알고리즘이라도 성능이 좋지 않은 컴퓨터와 성능이 좋은 컴퓨터의 실행시간이 다르기 때문에 배열이란?일반적인 배열 : 기본적으로 제공되는 배열, 읽기, 쓰기에 좋음, 삽입, 삭제는 좋지 않음자바스크립트 배열 : 상황에 따라서 연속적, 불연속적으로 메모리 할당하지만 대부분 불연속적으로 할당 연결리스트란?저장하려는 데이터들을 메모리 공간의 분산에 할당, 이 데이터들을 서로 연결 시켜줌 스택이란?먼저 들어간 데이터가 나중에 나오는 규칙 큐란?먼저 들어간 데이터가 먼저 나오는 규칙 덱이란?데이터의 삽입과 제거를 헤드와 테일 두 군데서 자유롭게 할 수 있음 해시테이블이란?해시와 테이블이 합쳐진 자료구조빠른 데이터 탐색, 삽입, 삭제 셋이란?데이터의 중복을 허용하지 않는 자료구조 회고자료구조와 알고리즘 부분이 많이 부족해서 겁을 많이 먹고 있었고, 강의를 듣고 복습을 많이 못한 것 같아서 아쉬웠다.다음주는 진도표 대로 나가면서 1주차에 부족했던 부분들을 따로 복습할 예정이다 미션 해결 과정미션을 받고 다시 개념들을 정리하는 시간들을 가졌다막상 강의를 들을 때는 아~ 이렇게 되는구나 라고 생각이 되지만시간이 지나고 문제를 봤을 때 기억이 잘 나지 않아서미션을 보고 그 부분을 다시 들으면서 미션을 해결해 나갔다.아직 많이 부족하지만 좀 더 열심히 해야 겠다는 생각이 들었다. 

알고리즘 · 자료구조

정혜민

워밍업클럽 - 풀스택 1주차 발자국

풀스택 개발자가 되어 보겠다고 리액트, 자바스크립트, 자바, 스프링부트 이런 것들을 공부하긴 했지만 머릿속으로는 잘 정리가 되지 않았다.실제로 구동하는 웹 사이트를 만들어보며 배우는 게 가장 빠를 것이라 생각하고 워밍업클럽에 참여하게 되었다. 1주차는 supabase를 써서 간단한 투두 리스트를 만드는 것이었다.useState같은 것들은 리액트를 공부하며 미리 봐 두어서 조금은 익숙했다. 과제로는 리스트의 제목 옆에 생성 시간과 완료 시간을 띄워야 했는데, 뭔가 좀 애매하게 돌아갔다.미션으로 생성 시간을 띄우는 건 무난하게 했는데,완료 시간은 새로고침할 때마다 사라지는 걸 보니 데이터베이스에 업데이트는 안 되는 것 같다. 일단 가장 먼저 완료 시간을 기록할 컬럼을 supabase 테이블에 추가했다.그 다음으로는 코드를 봤다.생성 시간과 완료 시간을 띄우는 부분은 todo.tsx에다가 만들었고,저 두 시간은 상태로 관리해야 할 거 같아서 useState도 추가했다.console.log로 변수 이름을 확인하고 checked를 누르면 완료 시간이 찍히도록 해 봤는데여기서 뭔가 많이 놓친 거 같다. 나중에 수정하려고 따로 표시해뒀다.이렇게까지 해서 checked가 변화하면 완료 시간이 뜨는 이상한 기능이 만들어졌다. 보완해야 하는데... 일단 강의를 한 번 더 들어야 할 것 같다... 다른 강의를 들으면서 '버전에 따라 호환이 안 되는 기능도 많으니 버전을 확실히 확인해라'는 말을 여러 번 들었는데, 이번 강의에서 그걸 뼈저리게 느꼈다.어제오늘 합쳐서 7시간동안 왜 에러가 나는지 코드를 찾고 고치고 찾고 고치고, node를 다시 설치해보고 별 걸 다 했던 것 같다밀린 강의를 어제 오늘 몰아들으면서 버전 충돌 때문에 하루 종일 방법을 찾았더니 머리가 아파서 여기까지만 해 보기로 했다 1주차 후기는... 엄청 어려웠다.따라 만들고 기능을 어떻게 돌아가게는 하는 건 어렵지 않은데 처음 배울 때 그 익숙하지 않는다는 점이 어려웠다.그래도 2주차부터는 완전히 새로운 문법보다는 기능 구현이 위주라 다행인 것 같다! 다음 주부터는 강의 안 미루고 열심히 들어야겠다.

jinwoo2511

CS 전공지식 스터디 3기 [1주차] 자료구조와 알고리즘 미션

CS 전공지식 스터디 3기 [1주차] 자료구조와 알고리즘 미션 Q1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요. A1.학생의 정보는 이름, 학번, 성적 등의 필드를 포함하므로, 효율적인 검색과 관리를 위해 해시테이블을 사용하는 것이 적절합니다.그 이유는 학생은 학번이라는 고유 ID를 갖고 있기 때문에, 학번을 키로 사용한다면, 시간복잡도가 평균 O(1)이 되므로 빠른 탐색이 가능해집니다. Q2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요. A2.주문은 FIFO(First-In-First-Out) 방식으로 처리되어야 하므로 큐(Queue)를 사용하는 것이 적절합니다.이유는 스택과 다르게 큐는 먼저 들어온 데이터가 먼저 처리되는 구조이기 때문입니다.주문 처리 과정도 먼저 들어온 주문이 먼저 처리되어야 하는 구조이기 때문에 큐 자료구조를 사용해야 한다고 생각합니다. Q3. 우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요. A3.기존코드#include <iostream> #include <vector> class Stack { private: std::vector<int> data; public: void push(int value) { data.insert(data.begin(), value); // 0번 인덱스에서 삽입 } void pop() { if (!data.empty()) { data.erase(data.begin()); // 0번 인덱스에서 삭제 } } int top() { return data.front(); } }; 변경된 스택 코드#include <iostream> #include <vector> class Stack { private: std::vector<int> data; public: void push(int value) { data.insert(data.begin(), value); // 0번 인덱스에서 삽입 } void pop() { if (!data.empty()) { data.erase(data.begin()); // 0번 인덱스에서 삭제 } } int top() { return data.front(); } };  Q4. 해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요. 힌트: charCodeAt() 함수를 이용 예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력hashFunction(name){ } A4.기존 해시 함수는 등번호를 사용했지만, 이름을 기반으로 해시값을 생성해야 합니다.이름의 각 문자에 charCodeAt() (C++에서는 ASCII 변환) 값을 활용해 해시값을 생성합니다.#include <iostream> #include <string> int hashFunction(std::string name, int tableSize) { int hashValue = 0; for (char c : name) { hashValue = (hashValue * 31 + c) % tableSize; // 31은 일반적으로 좋은 해시 인수 } return hashValue; } int main() { std::string name = "이운재"; int tableSize = 100; // 해시 테이블 크기 std::cout << "Hash value of " << name << ": " << hashFunction(name, tableSize) << std::endl; }  이름의 각 문자를 ASCII 값으로 변환하여 해시값 계산하였습니다.

이승녕

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

회고비전공으로 개발을 시작하여 CS가 부족하다고 느껴 신청했고, 자료구조와 알고리즘은 기존에 배웠던 것들이 많아 보다 쉽게 이해하였다.운영체제 같은 경우에는 프로그램, 프로세스, 스레드 등 안다고 생각했지만 정확한 정의를 말하라고 하면 하지 못하던 것을 이전보다는 쉽게 얘기할 수 있을 것 같다.발자국 가이드에 강의 내용 요약이 있는데 음.. 나는 내가 정리한 내용들을 공유하라는 것 같지는 않아서 그냥 어떤 점을 느꼈는지, 강의가 어땠고 나는 어떻게 했는지 같은 내용을 적을 것 같다. 정리한 내용을 공유한다고 하면 어디까지 할 것인가에 대한 문제가 생겨서 고민하고 싶지 않다.앞으로도 2번 더 작성할텐데, 지금처럼 총평 - 각 강의 회고 순으로 적을 것 같다.자료구조와 알고리즘자료구조와 알고리즘은 간단한 개념 설명과 함께 시간 복잡도를 설명하는 것으로 시작되었다섹션2부터는 배열의 설명을 시작으로 연결리스트, 스택, 큐, 덱, 해시테이블, 셋의 개념과 구현을 진행했다.JS로 수업이 진행되다보니, 유니티 개발자인 나는 조금 다른 구현이 필요하였다.또, 우선 처음에 필요한 함수의 내용을 적어줬었는데(Stack의 경우 push, pop 등) 해당 함수명만 보고 우선 만들어보는 재미도 있었다. 물론 시간은 좀 더 걸렸지만, 강의의 구현과 내 구현이 어떤 차이가 있는지 보는 것도 꽤 유용했다. 처음에는 연결리스트의 노드의 value를 단순하게 int로 만들었는데 나중에 string도 담는 식으로 변하여 object 타입으로 변환하였고, 그에 따라 기존에 구현했던 함수도 마찬가지로 수정이 들어가게 되었다.C#의 로그용 함수인 Console.WriteLine같은 경우 null값이 return되면 아무것도 출력하지 않아 ToString함수를 오버라이딩하여 JsonSerializer.Serialize를 통해 null을 string "null"로 return될 수 있도록 하는 것도 필요했다.마지막으로 미션 때는 오버로딩이 필요했는데 이를 진행하면서 평소에 사용할 일 없던 object 타입을 사용할 때의 불편함이 생겼다. 해시테이블의 키값이 int -> string으로 변하며 발생한 문제였는데 우선은 명시적 변환을 통해 해결했지만, 나중에는 node를 각각 구현해야할지, 구현은 JS로 모두 따라가야할지 고민이 되었다. hint를 주신 것도 JS의 함수였기 때문에 사용할 수 없었고, 해당 함수의 동작을 토대로 비슷한 코드를 만들었다. 따라서 성이 아닌 다른 기준이 되었는데, 이미 미션은 제출했지만 성으로 통일할 방법을 좀 더 고민해봐야겠다.운영체제운영체제는 사실 적을게 많이 없다. 구현을 하며 기술 및 원리를 체화하는 것이 아니어서 그런 것 같다.운영체제는 기존에도 조금씩 찾아보기는 했지만, 그때마다 아예 새로 배우는 것과 같다.섹션 1의 운영체제 개요와 역사는 아주 짧게 지나갔다.아무래도 섹션1은 짧게짧게 나뉜 영상이 많았는데 역사 등은 조금이라도 더 깊게 들어가면 너무 디테일하게 다뤄야하기 때문이라고 추측한다.섹션 2와 3은 아직 제대로 머리에 들어오지 않은 것 같다. 미션을 진행할 때도 영상을 다시 보면서 진행했다.자료구조와 알고리즘은 아무래도 직접 코드를 작성하고, 내가 어디에 적용할 수 있을지 생각하는 것도 있다보니 흥미가 있어서 머리에 잘 들어오는데 운영체제는 전혀 그렇지 않았다.프로세스, 프로그램, 스레드, 레지스터, PCB 등등의 단어가 난무하는데 대부분은 강의를 보며 이해가 조금 됐지만, 레지스터의 개념은 따로 찾아봐야할 것 같다. 익숙한 단어일 수록 이해하기가 쉬웠던 것 같다(PCB는 그냥 그런 단어다 라고 생각하기로 했다).섹션2는 하드웨어 동작의 기본을, 섹션3은 그 동작의 발전 과정을 보여주는 것 같다. 예전 개발자들은 개발자라기보다 기계공학자가 아니었을까 싶다.다음 주 남는 시간 혹은 워밍업 클럽 기간이 끝나더라도 반복해서 봐야 머리에 조금 더 잘 남을 것 같다.

jinwoo2511

CS 전공지식 스터디 3기 [1주차] 운영체제 미션

CS 전공지식 스터디 3기 [1주차] 운영체제 미션 Q1. while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다.1초마다 체크하기 때문에 성능에 좋지 않습니다.이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요? A1.폴링 방식은 일정 주기마다 지속적으로 CPU가 입출력 관리자에게 입출력이 왔는지 확인하는 방식입니다.하지만 일정 주기마다 지속적으로 CPU가 확인하기 때문에 성능이 좋지 않다는 단점이 존재합니다. 이를 해결하기 위해선 폴링 방식을 보완한 인터럽트 방식을 적용해야 합니다. 인터럽트 방식은 출력이 완료되었을 때 CPU에게 신호를 주어 인터럽트 서비스 루틴을 실행하는 방식입니다.인터럽트 여기서 서비스 루틴이란 특정 인터럽트가 들어오면 그 인터럽트를 처리하는 함수입니다.인터럽트 방식을 적용하면 일정 주기마다 지속적으로 CPU가 입출력 관리자에게 입출력이 왔는지 확인하는 것이 아니라,입출력이 올 때마다 CPU에게 신호를 주어 인터럽트 서비스 루틴을 실행하기 때문에 CPU의 사용량을 줄일 수 있습니다. Q2. 프로그램과 프로세스가 어떻게 다른가요? A2.프로그램은 하드디스크 등과 같은 저장장치에 저장된 명령문의 집합체입니다.저희가 플레이하는 게임이나, 뮤직 플레이어 같은 것들이 프로그램입니다. 프로세스는 프로그램이 실행되어 하드디스크에 저장되어 있던 프로그램이 메모리에 올라가게된 프로그램을 의미합니다.프로세스는 코드 영역, 데이터 영역, 스택 영역, 킵 영역을 갖고 있습니다.또한 메모리도 사용하고 운영체제의 CPU 스케줄링 알고리즘에 따라서 CPU도 사용하고 필요에 따라 입력과 출력을 하기 때문에 능동적인 존재이기도 합니다. Q3. 멀티 프로그래밍과 멀티 프로세싱이 어떻게 다른가요? A3.멀티 프로그래밍은 하나의 CPU가 여러 프로세스를 번갈아 실행하는 것을 의미합니다.멀티 프로그래밍의 특징으로는 CPU 이용률 극대화하고 병렬 처리가 아닌 시분할 방식을 사용합니다.또한 비선점형 스케줄링에 많이 사용합니다. 멀티 프로세싱은 여러 개의 CPU가 동시에 여러 프로세스를 처리하는 것을 의미합니다.특징으로는 병렬 처리 가능하고 선점형 스케줄링 적용하며, 다중 코어 시스템에서 사용합니다. Q4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요? A4.운영체제는 프로세스를 관리하기 위해 PCB(Process Control Block) 를 사용합니다.PCB는 운영체제가 각 프로세스를 관리하기 위해 유지하는 데이터 구조체입니다.PCB의 역할로는 프로세스의 상태, 메모리 정보, CPU 레지스터 정보 등을 저장하는 기능을 수행합니다.PCB 의 구조는PID (Process ID)프로세스 상태프로그램 카운터CPU 레지스터메모리 관리 정보입출력 상태 정보우선순위등으로 구성되어 있습니다. 프로그램 카운터가 필요한 이유는 어떤 프로세스가 실행되다가 다른 프로세스에게 CPU를 뺏기고 다시 실행될 때 원래 실행하던 명령어가 실행되어야 하기 때문에 프로그램 카운터가 꼭 있어야 합니다. Q5. 컨텍스트 스위칭이란 뭔가요? A5.컨텍스트 스위칭은 실행 중인 프로세스의 상태(레지스터, 스택, 프로그램 카운터 등)를 저장하고, 새로운 프로세스로 전환하는 과정입니다.주로 CPU가 여러 프로세스를 처리하는 환경에서 발생합니다.하지만 오버헤드가 존재하기 때문에, 빈번한 컨텍스트 스위칭은 성능 저하를 유발할 수 있습니다.

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

모든 내용은 감자님의 그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편) 강좌를 정리한 내용입니다.자료구조와 알고리즘 1일차1⃣ 자료구조자료구조는 데이터가 어떤 구조로 저장되고 어떻게 사용되는지를 나타냅니다.대표적인 예 1) → 변수숫자나 문자열 저장하기 위해 변수 사용let a = 87; 예2) 배열숫자나 문자열 등을 연속적으로 저장접근 → 인덱스let arr = [87, 70, 100]; arr[1] ✅ 일반 변수와 배열의 처리방법의 차이? 🤔let a = 87; let b = 70; let c = 100; let average = (a + b + c) / 3; let arr = [87, 70, 100]; // 평균 변수 초기화 let average = 0; for(let i = 0; i < arr.length; i++) { average += arr[i]; } average /= arr.length; 4개의 숫자의 평균을 구한다고 가정하고 각자의 방법으로 처리하면// 변수를 추가하고 평균 구한 코드도 수정해야함 let a = 87; let b = 70; let c = 100; // 변수 추가 let d = 55; // 평균 구하는 코드 수정 let average = (a + b + c + d) / 4; // 배열에 데이터만 입력하면 평균이 구해진다. let arr = [87, 70, 100, 55]; // 평균 변수 초기화 let average = 0; for(let i = 0; i < arr.length; i++) { average += arr[i]; } average /= arr.length; ✔ 배열의 처리 방법이 유지/보수가 변수의 처리 방법보다 편리하다.2⃣ 알고리즘어떤 문제를 해결하기 위한 확실한 방법배열의 모든 숫자를 더하고 원소의 개수만큼 나눠라데이터가 어떤 자료구조를 하고 있는지에 따라 평균을 구하는 방식이 달라졌다.즉, 자료구조에 따라서 알고리즘이 달라진다.앞서 배열 자료구조의 평균을 구하는 방법에서 여러가지의 알고리즘이 있을 수 있다.✔” 배열의 모든 숫자를 더하고 원소의 개수만큼 나눠라 “✔” 배열의 첫 번째 원소와 두 번째 원소, 세 번째 원소를 더하고 3을 나눠라 “즉, 같은 자료구조에 대해서도 알고리즘은 여러가지가 있을 수 있다.시간복잡도1⃣ 더 좋은 알고리즘의 기준문제를 해결할 때 더 좋은 알고리즘을 사용하는 것이 당연하다.사용자의 요구에 따라 다르지만, 일반적으로 알고리즘의 속도가 성능의 척도가 된다. 이를 시간 복잡도라 부른다.✔ 시간 복잡도란?특정 알고리즘이 어떤 문제를 해결하는 데 걸리는 시간컴퓨터에 성능에 따라 알고리즘을 처리하는데 걸리는 시간이 다르므로, 알고리즘을 평가할 때는 시간을 측정하는 것이 아닌 코드에 성능에 많은 영향을 주는 부분을 평가한다.이는 반복문이다.반복문이 많으면 느려지기 때문이다.예제)// 주어진 배열에서 5를 찾으시오 let arr = [1, 3, 5, 7]; // 최선의 경우 한 번에 찾음 -> Big-오메가 // 최악의 경우 배열의 길이만큼 걸림 -> Big-O // 평균의 경우 배열 길이의 중간만큼 걸림 -> Big-세터 빅오표기법최악의 경우 찾는 데이터가 배열의 끝에 있을 때배열의 길이가 n이라면 최악의 경우 n번 만에 찾을 수 있다. 이를 O(n), 선형시간 알고리즘이다.✔ 입력이 늘어날 때 계산량이 늘어나는 척도를 나타내기 위한 것운영체제가 하는 일1⃣ 프로세스 관리브라우저를 켜 놓고 노래도 들으며 게임을 해도 전부 동시에 실행이 된다.운영체제가 프로세스를 관리하지 않는다면 이 중 한 가지만 실행될 것입니다.2⃣ 메모리 관리3⃣ 하드웨어 관리운영체제는 사용자의 하드웨어에 대한 직접적인 접근을 막는다.특정 영역에 다른 중요한 데이터가 있을 수도 있고 공격을 막기 위해서이다.4⃣ 파일 시스템 관리운영체제의 역사1⃣ 1940년대애니악세계에서 가장 큰 스케일의 전자디지털 계산기입출력 속도가 느리고 입출력 도중에는 계산을 할 수 없음.인력으로 cpu를 대체2⃣ 1950년도 초반직접 회로(IC) 개발CPU, 메모리는 존재했지만 키보드와 모니터는 없었다. 대신 펀치카드를 이용하여 구멍을 뚫어 컴퓨터가 계산을 하게 하고 이를 라인프린터로 출력하는 방식을 사용3⃣ 중후반컴퓨터의 처리속도보다 오퍼레이터가 카드를 넣고 전달하는 과정이 느리게 느껴짐.오퍼레이터의 오버헤드가 큼이를 해결하기 위해 싱글스트림 배치시스템을 도입함.프로그래머가 펀치 카드를 여러 개를 가지고 오면 이를 한 번에 컴퓨터에 전달해주고 컴퓨터는 여러 개의 프로그램을 순서대로 실행해서 결과를 한 번에 확인할 수 있게 하는 시스템이다.1960년대시분할 시스템(시간 분할 시스템)유닉스 운영체제를 개발했는데 이는 멀티 프로그래밍과 다중 사용자와 파일시스템을 개발한 운영체제이다.✔ 문제점메모리 침범 문제70년대개인 컴퓨터 시대애플의 매킨토시 마이크로소프트의 MS-DOS 사용운영체제의 구조✅ 커널프로세스와 메모리, 저장장치를 관리하는 기능 담당사용자는 인터페이스를 통해서만 커널에 접근 가능✔ GUI(Graphic User Interface)그래픽으로 커널과 상호작용(마우스를 이용)✔ CLI(Command-Line Interface)텍스트를 이용해 커널과 상호작용(직접 텍스트 입력)사용자와 어플리케이션은 커널과의 인터페이스로 시스템 콜을 사용, 하드웨어와 커널의 인터페이스로는 드라이버 사용컴퓨터 하드웨어와 구조1⃣ 폰 노이만 구조프로그램 내장 방식애니악과 같이 하드웨어로 프로그램을 만들었기 때문에 프로그램이 달라질 때마다 매번 스위치와 배선을 다시 조정을 해야했다.이를 해결하기 위해 CPU와 메모리(RAM) 사이에 버스(데이터를 전달하는 통로)를 둔다.프로그램은 메모리에 올려서 실행시키는데 프로그램을 메모리에 내장했다고 해서 프로그램 내장방식이라고 한다.2⃣ 컴퓨터 하드웨어메인보드다른 하드웨어를 연결하는 장치3⃣ CPU 구조CPU(Central Processing Unit)는 중앙처리장치라고 부른다.이를 구성하는 장치는 세 가지로 나뉜다.산술논리 연산장치(Arithmetic and Logic Unit, ALU)제어장치 (Control Unit) - 모든 장치들의 동작을 지시하고 제어하는 장치레지스터(변수)4⃣ 메모리 종류메모리는 크게 RAM과 ROM으로 구별할 수 있다.RAM(Random Access Memory)은 랜덤으로 데이터를 읽어도 저장된 위치와 상관 없이 읽는 속도가 같습니다. 전력이 끊기면 데이터도 같이 끊긴다.ROM(Read Only Memory)전력이 끊겨도 데이터를 계속 보관할 수 있지만 데이터를 한 번 쓰면 수정이 불가능주로 부팅과 관련된 바이오스를 저장하는 데 주로 쓰임.3⃣ 중후반컴퓨터의 처리속도보다 오퍼레이터가 카드를 넣고 전달하는 과정이 느리게 느껴짐.오퍼레이터의 오버헤드가 큼이를 해결하기 위해 싱글스트림 배치시스템을 도입함.프로그래머가 펀치 카드를 여러 개를 가지고 오면 이를 한 번에 컴퓨터에 전달해주고 컴퓨터는 여러 개의 프로그램을 순서대로 실행해서 결과를 한 번에 확인할 수 있게 하는 시스템이다.1960년대시분할 시스템(시간 분할 시스템)유닉스 운영체제를 개발했는데 이는 멀티 프로그래밍과 다중 사용자와 파일시스템을 개발한 운영체제이다.✔ 문제점메모리 침범 문제70년대개인 컴퓨터 시대애플의 매킨토시 마이크로소프트의 MS-DOS 사용컴퓨터 부팅과정✅ ROM에 저장된 바이오스 실행주요 하드웨어에 이상이 없는지 체크이상이 있으면 부팅이 되지 않고, 이상이 없다면 하드디스크에 있는 마스터 부트 레코드에 저장된 부트로더를 메모리로 가져와서 실행한다.윈도우나 리눅스 둘 중 하나의 운영체제를 선택하면 부팅이 완료됨.인터럽트1⃣ 폴링(Polling)CPU가 입출력 장치에 데이터를 읽거나 쓰려고 하는 상황을 생각해보면CPU가 입출력 장치에 명령을 내리고CPU관점에서 입출력 명령이 언제 완료될 지 알 수 없기 때문에 주기적으로 학인해줘야한다.이를 폴링방식이라고 한다.이는 성능이 좋지 않다는 단점을 가지고 있다.2⃣ 인터럽트폴링 방식의 단점을 해결한 방식입출력 관리자는 입출력이 완료됐을 때 CPU에게 신호를 주고 CPU는 그 신호를 받아 인터럽트 서비스 루틴(ISR)을 실행시켜 작업을 완료한다.하드웨어 인터럽트입출력 등과 같은 인터럽트가 있다.소프트웨어 인터럽트2⃣ 컴퓨터 하드웨어메인보드다른 하드웨어를 연결하는 장치3⃣ CPU 구조CPU(Central Processing Unit)는 중앙처리장치라고 부른다.이를 구성하는 장치는 세 가지로 나뉜다.산술논리 연산장치(Arithmetic and Logic Unit, ALU)제어장치 (Control Unit) - 모든 장치들의 동작을 지시하고 제어하는 장치레지스터(변수)4⃣ 메모리 종류메모리는 크게 RAM과 ROM으로 구별할 수 있다.RAM(Random Access Memory)은 랜덤으로 데이터를 읽어도 저장된 위치와 상관 없이 읽는 속도가 같습니다. 전력이 끊기면 데이터도 같이 끊긴다.ROM(Read Only Memory)전력이 끊겨도 데이터를 계속 보관할 수 있지만 데이터를 한 번 쓰면 수정이 불가능주로 부팅과 관련된 바이오스를 저장하는 데 주로 쓰임.3⃣ 중후반컴퓨터의 처리속도보다 오퍼레이터가 카드를 넣고 전달하는 과정이 느리게 느껴짐.오퍼레이터의 오버헤드가 큼이를 해결하기 위해 싱글스트림 배치시스템을 도입함.프로그래머가 펀치 카드를 여러 개를 가지고 오면 이를 한 번에 컴퓨터에 전달해주고 컴퓨터는 여러 개의 프로그램을 순서대로 실행해서 결과를 한 번에 확인할 수 있게 하는 시스템이다.1960년대시분할 시스템(시간 분할 시스템)유닉스 운영체제를 개발했는데 이는 멀티 프로그래밍과 다중 사용자와 파일시스템을 개발한 운영체제이다.✔ 문제점메모리 침범 문제70년대개인 컴퓨터 시대애플의 매킨토시 마이크로소프트의 MS-DOS 사용자료구조와 알고리즘 2일차 1⃣ 배열메모리의 특정 크기의 연속된 공간을 미리 할당받는 자료구조JavaScript의 배열은 C언어에서의 배열과는 달리 객체를 가지는 형태이다.2⃣연결리스트불연속적인 메모리 위치에 저장하며, 노드를 생성하여 이 안에 데이터와 다음 노드를 가리키는 포인터를 저장하여 연결하는 자료구조이다.  class Node { constructor(data, next = null) { // this.변수 -> 프로퍼티 this.data = data; this.next = next; } } class LinkedList { constructor() { this.head = null; this.count = 0; } printAll() { let currentNode = this.head; let text = "["; while (currentNode != null) { text += currentNode.data; currentNode = currentNode.next; if (currentNode != null) { text += ", "; } } text += "]"; console.log(text); } // 리스트의 모든 원소를 제거하는 함수 clear() { this.head = null; this.count = 0; } insertAt(index, data) { if (index < 0 || index > this.count) { throw new Error("범위를 벗어났습니다."); } let newNode = new Node(data); if (index == 0) { newNode.next = this.head; this.head = newNode; } else { let currentNode = this.head; for (let i = 0; i < index - 1; i++) { currentNode = currentNode.next; } newNode.next = currentNode.next; currentNode.next = newNode; } this.count++; } // 마지막 데이터 뒤에 삽입하는 기능 insertLast(data) { this.insertAt(this.count, data); } deleteAt(index) { if (index < 0 || index > this.count) { throw new Error("범위를 벗어났습니다."); } let currentNode = this.head; if (index == 0) { let deleteNode = this.head; this.head = this.head.next; this.count--; return deleteNode; } else { for (let i = 0; i < index - 1; i++) { currentNode = currentNode.next; } } let deleteNode = currentNode.next; currentNode.next = currentNode.next.next; this.count--; return deleteNode; } } // 다른 자바스크립트 파일에서 Node 클래스를 참조할 수 있도록 export export { Node, LinkedList }; 3⃣Operating System프로그램은 수동적(코드가 실행되기를 기다림), 프로세스는 능동적(메모리, CPU등 사용)이다.프로세스는 Code, Data, Heap, Stack 영역으로 이루어져있다.생성된 프로세스를 연결리스트 형태인 PCB로 저장한다.자료구조와 알고리즘 3일차1⃣스택FIFO의 특징을 가지는 자료구조이다.2⃣큐FIFO의 특징을 가지는 자료구조로 작업 스케쥴링 등에 활용된다. 3⃣ 해시 테이블 (Hash Table) Key-Value 형태로 데이터를 저장하는 자료구조빠른 검색(O(1))이 가능하지만, 해시 충돌이 발생할 수 있다. 4⃣트리 (Tree) 계층 구조를 이루는 자료구조. 이진 탐색 트리 (BST): O(log n)의 탐색 속도를 가진다.힙 (Heap): 우선순위 큐 구현에 사용된다.트라이 (Trie): 문자열 검색 최적화.5⃣ 그래프 (Graph) 정점(Vertex)과 간선(Edge)으로 구성된 자료구조.최단 경로 탐색 (Dijkstra), 최적 경로 찾기 (A*) 등에 활용된다.\ 자료구조 FCFS 먼저 도착한 순서대로 실행 (대기 시간 증가 가능) SJF 실행 시간이 가장 짧은 프로세스부터 실행 SRTF 남은 실행 시간이 가장 짧은 프로세스부터 실행 RR 일정 시간(Time Quantum)마다 프로세스를 교체 Priority Scheduling 혼합 우선순위가 높은 프로세스부터 실행

CS코테컴퓨터이론알고리즘자료구조

워밍업 3기 1주차 발자국

[ 강의링크 ] [ 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)Intro.사실 클린코드에 대한 관심이 생긴 것은 얼마전 일입니다. 직장동료의 코드를 보며 별다른 설명 없이 코드가 쉽게 읽혀졌다는 점이 인상깊었습니다. 이후, 가독성 좋은 코드를 작성하기 위해 노력하던 중, 직장동료의 추천을 통해 해당강의와 워밍업 클럽을 알게되었고 지식의 빈자리를 메우고 한층 더 성장한 개발자가 되기 위해 시작하게 되었습니다. 1주차 핵심 Keyword.1주차는 JAVA를 보다 JAVA 처럼 쓰기 위한 테크닉과 사고회로를 그려주는 내용을 포함하고 있습니다. 특히, 추상과 구체는 JAVA 뿐만 아니라 다른 언어에서도 유용하게 쓰일 수도 있을 거 같은 강한 인상을 받았습니다. 다음은 추후의 복습하며 다시 생각해보면 좋을 법한 keyword들을 정리 해보았습니다.추상화 / 구체화이름짓기 - 상수, 문자열, 메서드, ! / not / != 등깊이 줄이기 Collection / genericstream / ramda / for-eachOptionalexception / validationstatic factory method(정적 펙토리 메서드)SOLID 1주차 발자국 포스팅을 마치며...이전 보다 더 클린함을 추구하기 위한 사고를 위한 밑 바탕을 배울 수 있었습니다.특히, 어렴풋했던 추상화에 대한 개념이 선명해졌습니다.배웠지만 잊었던 개념에 대해 다시 짚어갈 수 있는 계기가 되었습니다.아직 1주차 밖에 지나지 않았지만, 다음 주차, 그 다음 주차 한주가 거듭할 수록,점차 성장해갈 제 자신이 기대가 됩니다. 

[워밍업 클럽 3기 BE code] 1주차

워밍업 클럽 3기 BE를 시작한 이유최근 '내가 코드를 잘 작성하고 있는가'란 의문이 들었습니다. 최범균 개발자님의 도메인주도설계시작하기 책을 기반으로 정리하면서 어느 정도는 정리할 수 있었습니다. 추가적인 자료나 실질적인 예제가 있을까 찾다가 readable code와 practical test 강의에 흥미가 생겼고, 우연찮게 워밍업 클럽이 있어서 신청하였습니다.  미션2. 추상과 구체추상: 드립 커피를 만든다. 구체: - 물을 끓인다.- 원두를 간다.- 컵 위에 드리퍼를 올리고, 드리퍼 위에 필터를 둔다.- 필터 위에 원두 가루를 담고 평탄화 한다.- 다 끓은 물을 드립 포트에 담고, 원두 가루가 파이지 않도록 조심스럽게 드립 포트의 물을 드리퍼에 가득 채운다.- 물이 다 빠지면 다시 물을 채운다. 총 세 번 물을 채운다. 미션3-1 리팩토링@Slf4j public class Order { private List<Item> items; private Customer customer; public boolean validateOrder() { if (isEmptyItem()) { log.info("주문 항목이 없습니다."); return false; } if (isInvalidTotalPrice()) { log.info("올바르지 않은 총 가격입니다."); return false; } if (isCustomerInfoMissing()) { log.info("사용자 정보가 없습니다."); return false; } return true; } private boolean isCustomerInfoMissing() { return customer == null; } private boolean isInvalidTotalPrice() { return getTotalPrice() > 0; } private boolean isEmptyItem() { return items == null || items.isEmpty(); } private int getTotalPrice() { return items.stream() .map(Item::getPrice) .reduce(0, Integer::sum); } } class Item { private int price; public int getPrice() { return price; } } class Customer {} 미션 3-2 SOLIDSRP(Single Responsibility Principle, 단일 책임 원칙): 하나의 클래스는 하나의 책임만을 가져야 한다. 해당 책임 이외의 이유로 인하여 변경되어서는 안된다.OCP(Open Closed Priciple, 개방 폐쇄 원칙): 확장은 열려있고, 수정에는 닫혀있다. 기능 변경과 확장에 대해서는 유연하도록 구현해야 한다. LSP(Listov Substitution Priciple, 리스코프 치환 원칙): 자식 타입은 부모 타입으로 교체 가능하다. 자식은 상속한 부모의 기능이 의도하는 방향대로 동작해야 한다.ISP(Interface Segregation Principle, 인터페이스 분리 원칙): 클라이언트가 자신이 이용하지 않는 인터페이스에 의존하지 않도록 적정한 수준의 메서드를 가진다.DIP(Dependency Inversion Principle, 의존 역전 원칙): 인터페이스에 의존하며 유연하게 변경할 수 있다. 이번 주 소감생각보다 바쁘고 강의 양도 많아 여유 있게 진행하지는 못하고 있다. 그래도 한 달 간 열심히 해서 잘 마무리해야지^^ 

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

이번주차 학습 부분 [섹션1 - 5]지금까지 나는 클린코드의 원칙들에 대해 왜 이러한 원칙을 지키는 것이 좋은지 깊게 생각해보지 못했고, 가독성 좋은 코드를 작성하고 싶다는 생각이 있었음에도 구체적이고 체계적으로 스스로 생각을 정리해보거나 학습해보지 못했던거 같다. 이번 주차 학습을 진행하며 이러한 생각들이 많이 정리 되었고 구체화 되었다. 가장 좋았던 점은 추상이라는 개념에 대해서 먼저 이해하고 그를 바탕으로 구체적인 원칙들을 학습해나가니 그것들이 왜 필요한지를 자연스럽게 알며 학습할 수 있었다는 점이다. 평소에도 나름 잘 지켜온 원칙들도 있었는데 왜 좋은지에 대한 이유를 명확히 인지하고 강사님과 코드를 통해 구체적인 방법들을 적용해보니 학습하며 뿌듯하고 즐거웠다.  미션기존 코드를 리팩토링 해보는 Day4 미션에서 강의에 나온 원칙들을 충분히 고민하고 적용해보지 못한 것 같아 아쉬움이 남아 다시 진행해보려 한다. SOLID 원칙에 대해서 자신기만의 언어로 바꾸어 설명해보는 미션은 각각 원칙에 대해 내가 생각하기에 가장 중요한 부분을 담고 함축적으로 표현할 수 있도록 아래와 같이 작성해보았다. SRP (단일 책임 원칙) 하나의 클래스는 하나의 책임만 가져야 한다. 즉 하나의 기능에 집중해야 한다. OCP (개방-폐쇄 원칙) 새로운 기능을 추가할 수 있도록 열려 있지만, 기존 코드는 수정하지 않도록 설계해야 한다. LSP (리스코프 치환 원칙) 자식 클래스가 부모 클래스의 기능을 깨뜨리지 않고 확장될 수 있어야 한다. ISP (인터페이스 분리 원칙) 자신이 사용하지 않는 인터페이스에 의존하지 않아야 한다. 하나의 큰 인터페이스보다, 구체적이고 작은 인터페이스 여러 개로 나누는 것이 좋다. DIP (의존 역전 원칙) 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다. 즉, 구체적인 구현이 아니라, 추상화된 인터페이스에 의존해야 한다. 사실 이번주 후반에 여러 스케줄이 겹쳐 학습과정에 충분히 원하는 만큼 시간을 쓰지 못했는데, 주 초반에 미리 미리 시간이 있을 때 해둘 걸 하는 후회를 했다.역시나 시간이 있을 때 해놓아야 미래가 행복하다는 것을 느꼈다. 다음 주는 이런 아쉬움을 동기삼아 더 집중해보아야겠다.

팥우유

[인프런 워밍업 클럽 Full Stack 3기] 1주차

1.강의에서 사용된 기술 요약1.1.Next.js정의: 풀스택 개발에 최적화된 React 프레임워크특징:서버사이드 렌더링으로 SEO 최적화폴더 구조가 URL 라우팅과 일치 (app/movies → /movies)중요 파일: page.tsx(라우트), layout.tsx(레이아웃), route.ts(API)Link 컴포넌트로 클라이언트 사이드 라우팅 지원도구: Server Actions(서버 기능), Metadata API(SEO 최적화)1.2.TailwindCSS정의: 유틸리티 우선 CSS 프레임워크특징: HTML에 직접 클래스 적용으로 빠른 스타일링주요 클래스:레이아웃: flex, grid, flex-col, justify-center크기/여백: w-{n}, h-{n}, p-{n}, m-{n}스타일링: bg-{color}, text-{color}, rounded-{size}, shadow-{size}1.3.Recoil정의: Facebook의 React 상태 관리 라이브러리특징: 간편한 전역 상태 관리, 높은 성능주요 개념:atom: 상태 기본 단위useRecoilState: 상태 읽기/쓰기useRecoilValue: 상태 읽기1.4.React Query정의: 서버 상태 관리 라이브러리특징: 데이터 페칭, 캐싱, 동기화 자동화주요 함수:useQuery: 데이터 조회useMutation: 데이터 변경자동 백그라운드 갱신, 캐싱, 에러 처리2.Todo list 개발2.1.미션 해결supabase의 todo 테이블에 completed_at 컬럼을 추가 후 화면에 todo 생성일과 완료일을 함께 표시했습니다.완료일과 생성일의 날짜, 시간을 자연스럽게 표시하기 위해 시간 표시 함수export function getKoreanTime() { const now = new Date(); const koreaTimeDiff = 9 * 60 * 60 * 1000; // 한국 시간대(UTC+9)의 밀리초 const koreanDate = new Date(now.getTime() + koreaTimeDiff); return koreanDate.toISOString(); } export function convertTime(time: string) { const date = new Date(time); const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hours = date.getHours(); const minutes = date.getMinutes(); return `${year}-${month}-${day} ${hours}:${minutes}`; }2.2.추가 개선 사항폴더 구조 및 파일명 변경root/ ├── actions/ # 서버 액션 관련 코드 ├── app/ # 페이지 라우팅 및 레이아웃 ├── components/ # 재사용 가능한 UI 컴포넌트 ├── config/ # 환경 설정 파일 ├── containers/ # 상태 관리 및 비즈니스 로직 ├── public/ # 정적 파일 (이미지, 폰트 등) └── utils/ # 유틸리티 함수 └── supabase/ # Supabase 클라이언트 설정2.3.문제 해결 (런타임 에러)웹브라우저에서 체감상 5분 정도 시간이 흐르면 데브툴 콘솔창에서 아래와 같은 런타임 에러가 표시됐었습니다.제 컴퓨터 웹브라우저의 특정 확장 플러그인이 중복 실행되고 있었던 문제였습니다. 문제의 확장 플러그인이 1번만 실행되게 조치하니 해결됐습니다.Unchecked runtime.lastError: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received3. 회고 이번 Todo 리스트를 개발하면서 추가적으로 시도해보고 싶었던 것들이 있었지만, 대부분 실천하지 못해 아쉬움이 남습니다. 2주 차부터는 더 많은 공부 시간을 확보하고, 이번에 시도하지 못했던 추가 개발 사항들을 더욱 구체화하여 1주 차 결과물보다 더 높은 퀄리티의 결과물을 만들어보고자 합니다. 

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

while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요? 인터럽트 방식을 이용하여 이를 해결할 수 있다. 폴링 방식처럼 계속 주기적으로 체크하지 않고, 스킬을 사용하였을 때에 CPU에게 신호를 주고, 이 신호를 받았을 때만 CPU가 ISR(Interrupt Service Routine)을 실행하여 작업하면, 성능을 높일 수 있다. 프로그램과 프로세스가 어떻게 다른가요?프로그램이란, HDD(하드디스크)와 같은 저장장치에 저장된 명령문의 집합체이다.프로세스란, 실행중인 프로그램으로, 자세히는 HDD에 저장된 프로그램이 메모리(RAM)에 올라가 실행 중인 프로그램을 의미한다. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍이란, 메모리에 하나의 프로세스가 아니라 여러 개의 프로세스를 올려 처리하는 기술이다.멀티프로세싱이란, 여러개의 CPU(멀티프로세서)를 사용하여 여러 작업을 각 CPU가 맡아 동시에 처리하는 기술이다. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요? PCB(Process Control Block)을 통해 프로세스를 관리한다.  컨텍스트 스위칭이란 뭔가요?컨텍스트 스위칭은 프로세스를 실행하는 중에 다른 프로세스를 실행하기 위하여 실행중인프로세스의 상태를 저장하고, 다른 프로세스의 상태값으로 교체하는 작업이다. 

시스템 · 운영체제

수뼈

인프런 워밍업 클럽 스터디 3기 - CS 전공지식(자료구조 & 알고리즘) <첫째 주 미션>

1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.저라면 해시 테이블(Hash Table)을 사용하겠습니다. 교실의 학생들은 번호가 있기 때문에 해당 번호를 키로 빠르게 삽입/탐색/삭제가 모두 가능하기 때문입니다. 아래는 직접 구현해 본 코드입니다. 2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.기본적으로는 FIFO로 작동하는 큐(Queue)가 적절할 것 같습니다. 하지만 중간에 주문이 취소되거나 고객이 배달 요청 시간을 늦춰달라는 등 현실에는 여러 변수가 있을 수 있으므로 이중 연결 리스트(Doubly Linked List)를 활용해 변수에 빠르게 대처할 수 있을 것 같습니다.3. 우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요. 4. 해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요. 

알고리즘 · 자료구조알고리즘자료구조

백엔드-code 발자국 1주차

이번주에 readable-code 추상부터 SOLID까지 학습했따..처음에 강의를 잘못 봐서 Practical-test-code 강의를 듣다가 진도가 살짝 밀렸지만그래도 Day4 미션까지 해낼 수 있었습니다!! 첫번째 섹션에서 추상과 관련된 내용을 학습했는데코드를 통해 직접 메서드를 작성하고, 그 과정에서 메서드명을 지을땐 어떻게 짓는것이 좋은지메서드의 추상화 레벨을 알맞게 설정하기 위한 고민을 해볼 수 있었습니다. 두번째 섹션에서는 논리, 사고의 흐름을 했는데코드의 복잡도를 높일 수 있는 요소들에 대해 고민하고 코드를 작성한 시점이 아닌 유산을 이어받아 작업하는 시점에서 메서드를 빠르게 이해할 수 있는 방법들을 고민해봤습니다! SOLID를 통해 객체 지향 프로그램의 가장 유명한 패러다임을 학습했습니다.각 원칙을 적용하기 위해 해볼만한 고민들을 알 수 있었고 그 중에서 OCP를 적용하기 위한 과정이 살짝 어지러웠지만 잘 이해하고 습득한거 같다. Day2 미션을 진행하면서 학교에서부터 수없이 들었던 추상과 구체에 대한 개념을 나의 언어로 정의하는 것이 쉽지 않았다.그래서 이 강의를 수강하고, 워밍업 클럽에 참여하길 잘했다고 생각함 Day 4 미션을 통해 수강한 수업의 내용들을 종합적으로 정의해볼 수 있었는데 선생님이 강의중 얘기해주신부정어의 사용, 추상화 레벨을 고려하며 코드를 리팩토링했숨 다음주도 빡세게 달려서 꼭 완주하겠다는 의지를 불태우는 한주의 마무리, 이료일입니다!!!!

김동현

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

인프런 워밍업 클럽 3기 백엔드 과정에 참여하게 되었다. kotlin을 이용해서 포트폴리오 사이트를 만들어 보는 프로젝트와 미니 프로젝트를 수행하는 과정이다.처음으로 kotlin을 활용해서 프로젝트를 진행하다 보니 새롭기도 하고 java와 다른 점을 비교하며 공부하니깐 신기하고 재밌었다.강의입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기 강의 | 정보근 - 인프런 미션[미션1] 깃허브 리포지토리에 프로젝트 올리기https://github.com/dongcarry96/kotlin-university[미션2] 테이블 설계하기-> 어떤 프로젝트를 진행할지 고민하다가 대학 시스템으로 결정하였다. 초기에는 단순한 학사 관리 시스템을 생각했지만, 프로젝트를 구상하면서 점점 더 많은 기능을 추가하고 싶은 욕심이 생겼다. 하지만 현실적으로 프로젝트의 범위를 너무 넓히면 완성도 높은 결과물을 내기 어려울 것 같아, 기본적인 기능을 먼저 개발한 후 버전업을 시키는 방향으로 진행하기로 결정했다.프로젝트 회고프로젝트 주제를 선정하는 데 꽤 많은 시간을 들였다. "어떤 프로젝트를 선택해야 가장 많은 것을 배울 수 있을까?"라는 고민이 가장 컸다. 단순한 CRUD 기능을 구현하는 프로젝트보다는 실제 서비스처럼 동작하는 프로젝트를 만들고 싶었기 때문에 대학교 시스템이라는 주제를 선택하게 되었다.하지만, 개발을 진행하면서 점점 더 복잡한 기능을 추가하고 싶은 마음이 생겼고, 어느 순간 범위가 너무 커진다는 문제를 깨닫게 되었다. 그래서 선택과 집중이 필요하다고 판단하여 핵심 기능 위주로 우선 개발하고, 이후 버전업을 통해 기능을 추가하는 방향으로 전환했다.🌟 칭찬할 점✔ 매일 꾸준히 강의를 듣고 과제를 진행했다.✔ 프로젝트의 방향성과 구조에 대해 지속적으로 고민했다.😥 아쉬웠던 점❌ Kotlin에 대한 이해가 아직 부족하다는 것을 실감했다.❌ 주어진 시간을 더 효율적으로 사용할 필요성을 느꼈다.📌 보완할 점📌 지연 로딩(Lazy Loading) 관련 내용이 나왔는데, 아직 완벽하게 이해하지 못했다. 특히 N+1 문제에 대해 좀 더 깊이 공부해야 할 것 같다.🎯 다음 주 목표다음 주에는 시간을 더욱 효율적으로 활용하면서 공부와 프로젝트를 병행할 계획이다.✔ Kotlin과 Spring Boot의 활용도를 높이기 위해 공식 문서와 추가 강의를 찾아볼 예정✔ 프로젝트의 기본적인 CRUD 기능을 완성하고, 지연 로딩(N+1 문제 해결)과 같은 최적화 작업도 함께 진행하기

백엔드

노을

[인프런워밍업클럽] 1주차 3기 CS전공지식 운영체제 미션

운영체제javascript while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다.이 방식은 폴링방식입니다.1초마다 체크하기 때문에 성능에 좋지 않습니다.이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?인터럽트 방식을 사용해야합니다, 폴링 방식과 달리 특정 이벤트가 발생할 때 비동기적으로 코드가 실행 2. 프로그램과 프로세스가 어떻게 다른가요?프로그램 : 하드디스크나 다른 저장장치에 저장된 명령어의 집합체, 저장장치에 저장되어 실행되지 않은 상태로 존재, 수동적예) 앱, .exe 파일프로세스: 프로그램이 메모리에 적재되어 실행 중인 상태, 메모리와 CPU를 사용, 운영체제의 CPU 스케줄링 알고리즘에 따라서 실행, 입력과 출력을 통해 능동적으로 작용예) 실행 중인 앱, 브라우저 3. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍: 한 CPU에서 여러 프로세서를 번갈아 실행하여 CPU의 쉬는 시간을 줄이는 기술멀티프로세싱 : 여러개의 CPU(멀티프로세서)를 사용하여 여러 작업을 동시에 처리하는 기술4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?프로세스의 정보를 가지고 있는 PCB(ProcessControlBlock)를 저장, CPU 스케쥴링 사용 5. 컨텍스트 스위칭이란 뭔가요?프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스 상태를 저장하고 다른 프로세스의 상태 값으로 교체하는 작업발생하는 이유는?CPU 점유시간이 다 되거나 입출력 요청이 있거나 다른 종류의 인터롭트가 있을 때 발생     

알고리즘 · 자료구조운영체제CS전공지식3기1주차미션

gptjddl777

[인프런 워밍업 클럽 3기] PM/PO - 1주차 발자국

섹션1. 프로덕트 매니저의 역할, 고유의 전문성#Unit 2. PM의 역할, PM고유의 전문성 네 가지PM은 뭘 하는 사람일까?PM에게 요구하는 역할은 회사별로 천차만별임'기능을 만들고 출시하는 것을 목표'로 하는 PM과 vs '프로덕트를 성공시키는 것을 목표'로 하는 PM은 매우 다름 (후자의 경우데이터기반 문제해결, 가설수립 및 가설검증, 비즈니스 임팩트, 고객의 입장에서 문제를 정의하고 해결하는 역할을 수행)  용어정리 - PM? PO?한국에서는 보통 PO는 '높은 사람'(전략기획) , PM은 '낮은' 사람(수행역할)으로 정의 (*서비스기획 → PM으로 변화)PO는 원래 스크럼에서 이해관계자 커뮤니케이션. 백로그 관리 역할을 의미함(PO라는 포지션도 별로 없고, 프로덕트 오너십이란 말도 잘 사용하지 않음)PM이 아닌 것들고객과 이해 관계자들의 요구를 충족시키는 제품을 만드는 사람?이해 관계자와의 커뮤니케이션이 주 역할? (손발역할)상세한 화면 설계서, 기능 명세서를 만드는 역할→ 인 경우 '기능 출시' 역할의 PM에서 벗어나기 힘들고, 전문성을 쌓기 힘듦진짜 PM이라면PM 역할의 정의성공적인 프로덕트란? → 고객에게도 가치 있고, 우리 사업에도 도움이 되는 제품성공적인 프로덕트를 만들려면? → 고객이 요구하는 기능을 만드는 게 아님, 고객의 문제를 잘 이해하고 그에 맞는 솔루션을 제공하는 제품이어야 함성공적인 프로덕트의 네가지 조건 - By. <인스파이어드>1) Valuable (가치) : 고객이 구매하고자 하는 제품, 유저가 사용하고자 하는 제품2) Usable (사용성) : 사람들이 사용법을 익히고, 사용할 수 있는 제품3) Feasible (구현가능성) : 우리가 가진 기술력으로 구현할 수 있는 제품4) Viable (사업적 타당성) : 예산 내에서, 법률과 규제에 저촉되지 않고, 사업적으로 타당한 제품 제품조직이 마주하는 네가지 리스크1) Value Risk: 고객들이 원하지 않고, 유저가 사용하고 싶어하지 않는 제품2) Usability Risk : 사용자들이 이용하기 어려운 제품3) Feasibility Risk : 기술적으로 구현하기 어려운 제품3) Business Viability Risk : 사업적으로 타당하지 않은 제품 (비용이 효율적이지 못하거나, 법/규제에 저촉되는)→ PM이 특히 초점으로 삼는 것은 Value risk, Viable risk + 제품의 성과 전반→ 'PM은 제품의 성과 전반을 책임지는 사람 ' (프로덕트가 성공하기 위해 필요한 각종 매니지먼트를 담당)PM 고유의 전문성은?1) 우리 사용자와 고객에 대한 심층적인 지식 (우리 고객에 대한 전문가여야 함)2) 데이터에 대한 심층적인 지식- 유저 데이터 분석툴을 사용해서 우리 프로덕트가 어떻게 이용되고 있는지 알고 있어야 함- 데이터 변화 파악3) 비즈니스에 대한 심층적인 지식- 우리 회사의 go-to-market 전략을 이해- 우리 사업의 수익모델, 다양한 이해관계자들의 니즈를 이해- 마케팅, 매출, 비용 요소, 개인정보, 보안 등을 고려해야 4) 산업에 대한 심층적인 지식- 경쟁사 및 산업 주요 동향 파악, 기술 트렌드, 고객의 행동/기대 파악[1주차 강의 회고]좋은점다른 플랫폼에서 들은 PM 강의에서는 PM이 알아야 할 하드스킬, 실무지식 등을 주로 다뤘는데 김민우 멘토님의 강의를 들으면서는 PM의 본질적인 역할과 정의에 대해 알고 생각해 볼 수 있었다. PM으로의 직무전환을 위해 해당 강의를 듣게 되었는데, 직무전환이라는 단기적인 목표와 더불어 어떤 PM이 되고 싶은지에 대해 고민해 보게 되는 1주차 강의였다.<인스파이어드>는 PM의 필독서라고 해서 전에 읽었으나 내용이 잘 이해되지 않았는데, 강의에서 들으니 내용이 새롭게 다가왔다. 멘토링 기간 동안 다시 읽어봐야겠다고 다짐!아쉬운 점 1주차에 목표로 했던 범위까지 학습을 마무리하지 못했다. 2주차에는 매일 조금씩 시간을 분배해서 목표로 하는 학습 범위를 완료해야겠다.2주차 목표강의 듣기 (~섹션 4까지)강의 내용을 듣고 → 체화시키기인스파이어드 읽기2주차 발자국 + 미션 완료  

기획 · PM· POPMPO기획

노을

[인프런워밍업클럽] 1주차 3기 CS전공지식 자료구조와 알고리즘 미션

자료구조와 알고리즘1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요. 해시테이블을 사용키 - 값 구조로 되어있기 때문에 학생의 번호, 이름을 키로 설정하면 O(1)로 조회 할 수 있음새로운 학생을 추가하거나 삭제하기 쉬움 2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다.주문은 들어온 순서대로 처리됩니다.이 때 여러분이라면 어떤 자료구조를 선택하실 건가요?이유를 함께 적어주세요. 큐를 선택주문이 들어온 순서대로 처리되어야 하기 때문에 선입선출의 기능을 가지고 있는 큐를 사용 3. 우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요.class Node { constructor(data, next = null) { this.data = data; this.next = next; } } class Stack { constructor() { this.head = null; this.count = 0; } isEmpty() { return this.count === 0; } getLastNode() { if (this.isEmpty()) return null; let current = this.head; while (current.next !== null) { current = current.next; } return current; } push(data) { let newNode = new Node(data); if (this.head === null) { this.head = newNode; } else { let lastNode = this.getLastNode(); lastNode.next = newNode; } this.count++; } pop() { if (this.isEmpty()) { throw new Error("스택이 비어있습니다."); } if (this.count === 1) { let deletedData = this.head.data; this.head = null; this.count--; return deletedData; } let current = this.head; while (current.next.next !== null) { current = current.next; } let deletedData = current.next.data; current.next = null; this.count--; return deletedData; } peek() { if (this.isEmpty()) { throw new Error("스택이 비어있습니다."); } return this.getLastNode().data; } printAll() { let current = this.head; let result = "["; while (current !== null) { result += current.data; current = current.next; if (current !== null) result += ", "; } result += "]"; console.log(result); } } 4. 해시테이블의 성능은 해시 함수에 따라 달라집니다.수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다.이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요.힌트: charCodeAt() 함수를 이용예시:name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력 hashFunction(name){ } 수정한 코드function hashFunction(name, hahSize = 100) { let hash = 0; for (let i = 0; i < name.length; i++) { hash += name.charCodeAt(i); return hash % hashSize; } 

알고리즘 · 자료구조자료구조알고리즘

채널톡 아이콘