[Refactoring] 12 ~ 14. 반복되는 switch 문 / 반복문 / 성의없는 요소
·
ETC
반복되는 switch 문(Repeated Swithces)반복해서 동일한 switch 문이 존재할 경우=> 새로운 조건을 추가하거나 기존의 조건을 변경할 때 모든 switch 문을 찾아서 코드를 고쳐야 할지도 모름반복해서 등장하는 것이 아니라면 굳이 리팩토링을 적용할 필요는 없다=> 이전 시간에 사용한 "조건부 로직을 다형성으로 바꾸기(Replace Conditional with Polymorphism)" 리팩토링 적용요즘에는 switch 문이 arrow function 형태로 세련되게 나오기 때문에 이를 사용하는 것을 권장한다 (ex. jdk 17 버전 이상)이를 switch 문이 아니라, switch-expression 이라고 한다.// switch 문 (아래 코드엔 break가 없어서 버그 존재)p..
[Refactoring] 11. 기본형 집착
·
ETC
기본형 집착(Primitive Obsession)애플리케이션이 다루고 있는 도메인에 필요한 기본 타입을 만들지 않고 프로그래밍 언어가 제공하는 기본 타입을 사용하는 경우가 많음ex) 전화번호, 좌표, 돈, 범위, 수량 등기본형으로는 단위(인치 vs. 미터) 또는 표기법을 표현하기 어렵다관련 리팩토링 기술"기본형을 객체로 바꾸기(Replace Primitive with Object)""타입 코드를 서브 클래스로 바꾸기(Replace Type Code with Subclasses)""조건부 로직을 다형성으로 바꾸기(Replace Conditional with Polymorphism)""클래스 추출하기(Extract Class)""매개변수 객체 만들기(Introduce Parameter Object)"기본형을..
[Java] 자바 컬렉션 프레임워크
·
Java
Collections framework컬렉션(collection)여러 객체(데이터)를 모아 놓은 것을 의미프레임웍(framework)표준화, 정형화 된 체계적인 프로그래밍 방식컬렉션 프레임웍(collections framework)컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스 제공java.util 패키지에 포함. JDK1.2부터 표준화되어 제공.컬렉션 클래스(collection class)다수의 데이터를 저장할 수 있는 클래스(예. Vector, ArrayList, HashSet)Collection Framework의 핵심 인터페이스List순서가 있는 데이터의 집합, 데이터의 중복 허용구현 클래스: ArrayList, LinkedList, ..
[Algorithm] 정수론
·
Algorithm
소수소수(prime number): 양의 약수가 1과 자기 자신 두 개 뿐인 자연수1은 소수도 아니고 합성수도 아님 => 예외 처리 필요!가장 단순한 소수 판별 방법n이 주어졌을 때, 2 ~ n-1까지 모든 수를 순회하면서 이 중 n의 약수가 있는지 확인최적화 포인트: 합성수 n이 p * q로 표현될 때, 한 수는 항상 sqrt(n) 이하, 다른 한 수는 항상 sqrt(n) 이상이다.=> n-1까지 순회하지 않고 sqrt(n)까지만 순회하도록 최적화 가능입력의 개수가 작은 경우에만 사용 가능 (32비트 정수)public static boolean isPrime(int n) { // 맨 처음에 1 이하의 수와 2를 예외 처리 if (n 많은 수에 대해 소수 판단을 해야 하는 경우?=> 에라토스테..
[Refactoring] 8 ~ 10. 산탄총 수술 / 기능 편애 / 데이터 뭉치
·
ETC
8. 산탄총 수술(Shotgun Surgery)어떤 한 변경 사항이 생겼을 때, 여러 모듈을 (여러 함수 또는 여러 클래스를) 수정해야 하는 상황"뒤엉킨 변경" 냄새와 유사하지만 반대의 상황임원인은 동일 -> 낮은 응집도 & 높은 결합도결과는 반대 -> 뒤엉킨 변경은 여러 가지 이유로 하나의 클래스를 계속해서 손보는 것 / 산탄총 수술은 하나의 일로 여러 곳을 손보는 것ex) 새로운 결제 방식을 도입하려면 여러 클래스의 코드를 수정해야 함변경 사항이 여러 곳에 흩어진다면 찾아서 고치기도 어렵고 중요한 변경사항을 놓칠 가능성도 생김관련 리팩토링 기술 -> 대체로 묶는 기술을 사용"함수 옮기기(Move Function)" 또는 "필드 옮기기(Move Field)" -> 필요한 변경 내역을 하나의 클래스로 모..
[Refactoring] 7. 뒤엉킨 변경
·
ETC
뒤엉킨 변경(Divergent Change)소프트웨어는 변경에 유연하게(soft) 대처할 수 있어야 함어떤 한 모듈이(함수 또는 클래스가) 여러가지 이유로 다양하게 변경되어야 하는 경우, (= 낮은 응집도, 너무 많은 책임)ex) 새로운 결제 방식 도입하거나 DB 변경할 때 동일한 클래스에 여러 메서드를 수정해야 하는 경우서로 다른 문제는 서로 다른 모듈에서 해결해야 함모듈의 책임이 분리되어 있을수록 해당 문맥을 더 잘 이해할 수 있으며 다른 문제는 신경쓰지 않아도 됨=> 단일 책임 원칙(SRP), 모듈의 높은 응집도 & 낮은 결합도관련 리팩토링 기술"단계 쪼개기(Split Phase)" -> 서로 다른 문맥의 코드를 분리 가능"함수 옮기기(Move Functions)" -> 적절한 모듈로 함수를 옮기기..
[Refactoring] 6. 가변 데이터
·
ETC
가변 데이터(Mutable Data)데이터를 변경하다보면 예상치 못햇던 결과나 해결하기 어려운 버그가 발생하기도 함이를 방지하기 위해 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달함 => 부수효과(Side Effect)가 없음하지만, 그밖의 프로그래밍 언어는 데이터 변경을 허용 => 변경되는 데이터 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋음관련 리팩토링"변수 캡슐화하기(Encapsulate Variable)" -> 데이터를 변경할 수 있는 메서드를 제한하고 관리 가능"변수 쪼개기(Split Variable)" -> 여러 데이터를 저장하는 변수를 분해"코드 정리하기(Slide Statements)" -> 데이터를 변경하는 코드를 분리하고 피할 수 있음"함수..
[Java] 자바 API 클래스
·
Java
Object 클래스모든 클래스의 최고 조상 클래스로, 모든 Java 클래스는 Object를 상속받음오직 11개의 메소드만을 가지고 있음notify(), wait() 등은 쓰레드와 관련된 메소드clone() 메소드는 단지 필드의 값만 복사하므로, 필드가 배열이나 객체인 경우 제대로 복제되지 않음. 이를 위해 해당 클래스에서 clone() 메소드 오버라이딩 필요protected로 표시된 메소드는 오버라이딩이 필요equals()는 객체 자신과 주어진 객체를 비교하며, 기본적으로 객체의 주소를 비교함. 따라서 객체의 인스턴스 변수 값을 비교하려면 equals()를 오버라이딩 필요hashCode()는 객체의 해시코드를 반환함. equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 함. equals..
[Java] 예외 처리
·
Java
오류의 종류컴파일 에러(compile-time error)프로그램을 컴파일할 때 발생하는 에러로, 컴파일러가 코드의 문법 및 타입 오류를 감지함.종류구문 에러: 문법적으로 잘못된 코드 (예: 세미콜론 누락).타입 체크 에러: 데이터 타입이 맞지 않을 때 발생 (예: 문자열과 숫자 연산 시도).컴파일 최적화 실패: 컴파일러가 코드를 최적화하는 과정에서 발생.런타임 에러(runtime error)프로그램 실행 중 발생하며, 프로그램이 비정상적으로 종료됨.예시NullPointerException: null 참조를 호출할 때 발생.ArrayIndexOutOfBoundsException: 배열의 범위를 벗어난 인덱스를 접근할 때 발생.ArithmeticException: 0으로 나누기.논리적 에러(logical ..
[Refactoring] 5. 전역 데이터
·
ETC
전역 데이터전역 데이터는 애플리케이션 전반에 걸쳐 접근 가능하고 변경 가능한 데이터 (ex. 자바의 public static 변수)전역 데이터는 아무 곳에서나 변경될 수 있다는 문제어떤 코드로 인해 값이 바뀐지 파악하기 어려움..클래스 변수(필드)도 비슷한 문제를 겪을 수 있음=> "변수 캡슐화하기(Encapsulate Variable)"을 통해 접근을 제어하거나 어디서 사용하는지 파악하기 쉽게 만들 수 있음물론, final 키워드나 불변 데이터의 경우 이런 리팩토링을 적용할 필요가 없다변수 캡슐화하기(Encapsulate Variable)메서드는 점진적으로 새로운 메서드로 변경할 수 있으나, 데이터는 한번에 모두 변경해야 함 => 데이터를 변경하는 것은 어려움..데이터 구조를 변경하는 작업을 그보다는 ..