분류 전체보기
-
7. 컬렉션 : 중첩을 제거하는 구조화 테크닉Study/내 코드가 그렇게 이상한가요? 2024. 1. 16. 21:48
이 장에서는 배열과 List와 같은 컬렉션에서 발생할 수 있는 다양한 문제 사례들을 알아본다. 1. 이미 존재하는 기능을 다시 구현하지 말기 바퀴의 재발명 이미 널리 사용되고 있는 기술과 해법이 존재하는데도, 이를 전혀 모르거나 의도적으로 무시하고 비슷한 것을 새로 만들어 내는 것 대부분의 언어에서는 표준 컬렉션 라이브러리에 많은 기능이 구현되어 있다. 반복문을 사용해서 컬렉션을 직접 조작하고 있다면, 잠시 멈추고 표준 라이브러리에 같은 기능을 하는 메서드가 있는지 확인해보자. // 반복문을 사용하여 List를 직접 조작하는 예시 boolean hasPrisonKey = false; for (Item each : items) { if (each.name.equals("prisonKey")) { hasPr..
-
6. 조건 분기 : interface 활용하여 복잡한 조건 분기 제거하기Study/내 코드가 그렇게 이상한가요? 2024. 1. 6. 20:59
조건 분기는 조건에 따라 처리 내용을 전환하는 꼭 필요한 구조이지만, 조건이 복잡해지면 코드의 동작을 이해하기 힘들고 유지보수 시 여러 버그를 만들 수 있다. 이 장에서는 조건 분기를 잘 다루어 버그가 없는 설계를 만드는 방법을 설명한다. 1. 중첩되는 조건 분기 제거하기 코드를 보다보면 if 조건문이 여러 개 중첩되어 사용된 경우가 있다. 조건 분기의 중첩은 코드의 가독성을 크게 떨어뜨린다. if (조건) { // ... if (조건) { // ... if (조건) { // ... if (조건) { // ... } else { // ... } } } } 중첩 구조 사이사이에 수많은 코드가 섞여 있으면, 각 조건문의 범위를 찾기도 매우 힘들고, 각 조건에 따라 어떤 로직이 처리되는 지 알기 힘들다. 이런..
-
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)Programming/기타 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 접속을 했을 때 포트 오픈이 되어 있다면 해당 서..
-
[Git] fork 후 작업하기Programming/Git 2022. 4. 9. 02:51
fork 와 clone 의 차이점 fork fork 는 다른 사람의 repository 에 내가 어떤 부분을 수정하거나 추가하고 싶은 경우에 해당 repository 를 내 계정의 repository 로 복제하는 기능이다. 이때, fork 해온 저장소는 원본 저장소와 연결되어 있어서 fetch, rebase 등을 통해 원본 저장소의 변경 사항을 내 저장소에 반영할 수 있다. 이후 내 저장소에서 작업을 진행한 후 변경 사항을 원본 저장소에 적용하고 싶으면 해당 저장소에 Pull Request(PR) 을 해야 한다. PR 이 원본 저장소의 관리자로부터 승인되면, 나의 변경 사항이 원본 저장소에 commit, merge 되어 반영된다. PR 이 승인되기 전까지는 변경 사항이 fork 한 내 저장소에만 존재한다..
-
[Git] Git 으로 작업하기Programming/Git 2022. 4. 9. 02:17
사용자 설정 Git 을 설치하고 사용자 정보를 설정해두면, Git 은 커밋할 때마다 이 정보를 사용한다. 한 번 커밋한 후에는 정보를 변경할 수 없다. $ git config --global user.name "사용자 이름" $ git config --global user.email "사용자 이메일" // git 사용자 설정 확인 $ git config --list --global 옵션은 한 컴퓨터 당 단 한 번만 하면 작업하는 모든 프로젝트에 적용된다. 만약 프로젝트마다 다른 이름과 이메일 주소를 사용하고 싶으면 해당 프로젝트 내에서 --global 옵션을 빼고 위 명령을 실행한다. Git 저장소 생성 작업의 종류에 따라 두 가지 경우가 있다. 1) 이미 존재하는 프로젝트를 받아오는 경우, 2) 새로 ..