Programming/온라인 교육 (10) 썸네일형 리스트형 [중고거래장터 - 6] setter 대신 빌더 패턴 사용 / Controller와 Service 계층의 역할 분리 기존 작업물에 대한 리팩토링을 했다. - setter 메소드 대신 빌더 패턴 사용하기 - jUnit 테스트 코드 리팩토링 - 도메인 클래스 lombok 설정 수정 - 구현 세부 내용 숨기기 setter 메소드 대신 빌더 패턴 사용하기 아래 코드는 사용자의 비밀번호 변경 요청을 처리하는 Controller 클래스의 메소드이다. 이 코드에서 가장 먼저 수정해야 할 부분은 setter 메소드를 사용해서 값을 변경하는 부분이라고 판단했다. setter 메소드를 통해 유연하게 값을 받아서 넘겨주는 것이 편하게 느껴질 수 있다. 하지만 이런 로직은 불안하다. 수정자 메소드(setter)의 사용은 불필요한 데이터 변경을 유발한다. 이는 객체의 일관성을 유지하기 어렵게 만든다. 또한 의도치 않은 변경이 발생할 가능성이.. [CS50] 메모리 구조 머신 코드 영역에는 우리 프로그램이 실행될 때 그 프로그램이 컴파일된 바이너리가 저장된다. 글로벌 영역에는 프로그램 안에서 저장된 전역 변수가 저장된다. 힙 영역에는 할당된 메모리의 데이터가 저장된다. 그리고 스택에는 프로그램 내의 함수와 관련된 것들이 저장된다. 힙 영역에서는 메모리가 더 할당될수록, 점점 사용하는 메모리의 범위가 아래로 늘어난다. 마찬가지로 스택 영역에서도 함수가 더 많이 호출 될수록 사용하는 메모리의 범위가 점점 위로 늘어난다. 이렇게 점점 늘어나다 보면 제한된 메모리 용량 하에서는 기존의 값을 침범하는 상황도 발생한다. 이를 힙 오버플로우 또는 스택 오버플로우라고 일컫는다. 출처 https://www.boostcourse.org/cs112/lecture/119035/?isDesc=.. [CS50] 문자열 문자열 아래와 같이 s에 “EMMA”라는 값을 저장한다고 생각해 보자. String str = "COMPUTER"; 문자열은 결국 문자의 배열이고, str[0], str[1], str[2], … 와 같이 하나의 문자가 배열의 한 부분을 나타낸다. 가장 마지막의 \0은 0으로 이루어진 바이트로, 문자열의 끝을 표시하는 약속이다. 변수 str은 결국 이러한 문자열을 가리키는 포인터가 된다. #include int main(void) { char *s = "COMPUTER"; printf("%s\n", s); } 결과) COMPUTER char 포인터를 이용해 문자열을 출력할 수 있다. 문자열 비교 #include int main(void) { char *s = "EMMA"; printf("%p\n", s);.. [CS50] 포인터 C에는 포인터 라는 개념을 통해서 변수의 주소를 쉽게 저장하고 접근할 수 있다. ‘*’ 연산자는 어떤 메모리 주소에 있는 값을 받아오게 해준다. 이 연산자를 이용해서 포인터 역할을 하는 변수를 선언할 수도 있다. #include int main(void) { int n = 50; int *p = &n; printf("%p\n", p); printf("%i\n", *p); } 결과) 0x7ffc3d293cdc 50 위 코드를 보면 정수형 변수 n에는 50이라는 값이 저장되어 있다. 그리고 *p라는 포인터 변수에 &n 이라는 값, 즉 변수 n의 주소를 저장했다. int *p 에서 p앞의 *는 이 변수가 포인터라는 의미이고, int 는 이 포인터가 int 타입의 변수를 가리킨다는 의미이다. 따라서 첫 번째 p.. [CS50] 메모리 C언어로 작성한 코드가 실제로 컴퓨터 메모리에 어떻게 저장되는지 알아본다. 16진수 컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많다. 컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문이다. 16진수와 일상생활에서 우리가 사용하는 10진수와 비교하면 그 차이를 알 수 있다. 16진수를 사용하면 10진수보다 2진수를 간단하게 나타낼 수 있다. 16진수로 값을 표현하는 방법을 이해하고 나면 16진수, 2진수, 10진수를 변환하는 프로그램을 만들어볼 수 있다. 10진수를 16진수로 JPG 이미지 파일은 항상 255 216 255 로 시작되고 이것은 10진수이다. 하지만 실제 컴퓨터 내에서는 10진수를 사용하지 않는다. 컴퓨터는 0과 1.. [CS50] 알고리즘 알고리즘을 실행하는데 걸리는 시간을 표현하면 다음과 같다. 위와 같은 그림을 공식으로 표기한 것이 Big O 표기법이다. 여기서 O는 “on the order of”의 약자로, 쉽게 생각하면 “~만큼의 정도로 커지는” 것이라고 볼 수 있다. O(n) 은 n만큼 커지는 것이므로 n이 늘어날수록 선형적으로 증가하게 된다. O(n/2)도 결국 n이 매우 커지면 1/2은 큰 의미가 없어지므로 O(n)이라고 볼 수 있다. 주로 아래 목록과 같은 Big O 표기가 실행 시간을 나타내기 위해 많이 사용된다. O(n^2) O(n log n) O(n) - 선형 검색 O(log n) - 이진 검색 O(1) Big O가 알고리즘 실행 시간의 상한을 나타낸 것이라면, 반대로 Big Ω는 알고리즘 실행 시간의 하한을 나타내는 .. [CS50] 문자열 문자열(string) 자료형의 데이터는 사실 문자(char) 자료형의 데이터들의 배열이다. string s = "hello";와 같은 문자열 s가 정의되어 있다면, s는 문자의 배열이기 때문에 메모리상에 다음과 같이 저장된다. h e l l o \0 s[0] s[1] s[2] s[3] s[4] s[5] 장 끝의 ‘\0’은 문자열의 끝을 나타내는 NULL 종단 문자이다. string names[4]; names[0] = "EMMA"; names[1] = "RODRIGO"; names[2] = "BRIAN"; names[3] = "DAVID"; printf("%s\n", names[0]); printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[.. [CS50] 컴파일링 C코드를 실행하려면 컴파일링 작업이 필요하다. 컴파일의 전체 과정은 네 단계로 나누어 볼 수 있다. 코드를 작성한 후 make나 clang을 사용해서 프로그램을 실행할 때 아래 네 개의 단계를 거친다. 전처리 컴파일링 어셈블링 링킹 전처리(Precompile) #으로 시작되는 C 소스 코드는 전처리기에서 실직적인 컴파일이 이루어지기 전에 무언가를 실행하라고 알려준다. 예를 들어 #include는 전처리기에게 다른 파일의 내용을 포함시키라고 알려준다. #include 코드가 있다면 전처리기는 stdio.h 파일의 내용을 포함시킨다. 컴파일(Compile) 전처리기가 전처리한 소스 코드를 생성한 후 컴파일 작업을 수행한다. 컴파일러라고 불리는 프로그램은 C 코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파.. 이전 1 2 다음