//////
Search
🦁

곽철민

작성일
2022/10/13
곽철민
클래스
2
사람
1 more property
1.

알고리즘

7,2,3,9,28,11의 수를 오름차순 정렬하세요.
Markdown
복사

접근 방식

1.
i = 0 (초기 행 인덱스)
array[0] vs array[1]
7
2
3
9
28
11
array[0] vs array[2]
2
7
3
9
28
11
array[0] vs array[3]
2
7
3
9
28
11
array[0] vs array[4]
2
7
3
9
28
11
array[0] vs array[5]
2
7
3
9
28
11
열의 개수만큼 반복을 마치면, 가장 작은 숫자가 인덱스 0인 자리에 오게 됩니다.
이 후, 행 인덱스가 +1 증가하도록 합니다.
2.
i = 1 (행 인덱스 +1)
array[1] vs array[2]
2
7
3
9
28
11
array[1] vs array[3]
2
3
7
9
28
11
array[1] vs array[4]
2
3
7
9
28
11
array[1] vs array[5]
2
3
7
9
28
11
3.
i = 2
위와 같은 논리를 계속 반복하면, 3번째로 작은 숫자가 2번 인덱스에 위치하게 됩니다.
2
3
7
9
28
11
4.
i = 3
위와 마찬가지로, 4번째로 작은 숫자가 3번 인덱스에 위치하게 됩니다.
2
3
7
9
28
11
5.
i = 4
위와 마찬가지로 5번째로 작은 숫자가 4번 인덱스에 위치하게 됩니다.
2
3
7
9
11
28
6.
i = 5
이미 오름차순 정렬이 되었습니다.
2
3
7
9
11
28

실습 1. 위의 접근 방식을 코드로 표현해 보세요.

요구사항
static method는 main 말고 사용하지 말기
int형 array를 return 하고 int형 array를 받는 sort() 메소드를 만들기
코드
잘못된 코드

실습 2. 버블정렬의 원리

버블 정렬

(오름차순의 경우)
인접한 두 요소를 비교하며, 앞의 요소가 뒤의 요소보다 더 크면 바꿔주는 정렬 방식
배열의 원소가 하나 남을 때 까지, 인접한 요소들의 값을 비교하는 방식
데이터를 ‘비교’하면서 찾기 때문에 “비교 정렬”
아래 그림은 버블 정렬이 동작하는 원리를 나타낸 것입니다.
위와 같이 인덱스가 하나씩 증가하며 인접한 두 요소들을 계속적으로 비교해줍니다.
이를 자신보다 큰 원소가 모두 뒤에 있을 때 까지 반복해줌으로써, 오름차순 정렬이 이뤄지게 됩니다.

버블정렬의 장점

추가적인 메모리 소비가 작습니다.
정렬의 대상이 되는 데이터(우리의 경우 정수형 배열)외에 추가적인 공간을 필요로 하지 않기 때문입니다. <버블 정렬 : 제자리 정렬 (in-place sort)>
선택정렬, 삽입정렬에 비해 구현하기 쉽습니다.
안정 정렬이 가능합니다.
코드

Software Testing?

본격적으로 테스트 클래스를 만들기 앞서 Software Testing에 대해 간략히 짚고 넘어 가봅시다.
Software Testing?
“시스템 또는 구성요소가 지정된 조건에서 실행되고, 결과가 관찰되며 시스템 또는 구성 요소의 측면에 대해 평가가 이루어지는 활동”
테스트의 종류에는 단위 테스트, 통합 테스트, 시스템 테스트, 인수 테스트가 있습니다.
단위 테스트 : 최소 단위인 모듈이나 컴포넌트에 초점을 맞춰 테스트 하는 것
통합 테스트 : 모듈 간 혹은 통합된 컴포넌트 간의 상호작용을 테스트 하는 것
시스템 테스트 : 개발된 소프트웨어가 컴퓨터 시스템에서 완벽하게 수행되는가?를 점검하는 테스트
인수 테스트 : 개발한 소프트웨어가 사용자의 요구사항을 충족하는지에 중점을 두는 테스트
알파 테스트와 베타 테스트가 있습니다.

TDD란?

Test Driven Development의 약자로, 테스트 주도 개발 이라는 의미를 가지고 있습니다.
TDD 개발 주기
Red : 실패하는 테스트 코드를 먼저 작성 (필요한 기능이 아직 구현되어 있지 않기 때문에 실패하는 것이 당연합니다.)
Green : 테스트 코드를 성공시키기 위한 실제 코드를 작성
Yellow : 중복 코드 제거 , 일반화 등 리팩토링을 수행해줍니다.
TDD 개발 방식
테스트 코드를 작성하기 전에 반드시 디자인(설계) 단계에서 무엇을 테스트 할지 (테스트 케이스)를 정해야 합니다.
테스트 코드를 작성하는 중 발생하는 예외 사항 (버그, 에러)들은 테스트 케이스에 추가하고, 설계를 개선해줍니다.
이 후, 테스트가 통과된 코드 만을 코드 개발 단계에서 실제 코드로 작성합니다.
✅ TDD는 이러한 과정을 반복함으로써, 보통의 개발 방식에 비해 코드의 버그를 줄여주고, 기능 개발을 명확하게 해줍니다.
BASIC
복사
보통의 개발 방식
“요구사항 분석 → 설계 → 개발 → 테스트 → 배포”의 개발 주기
위의 개발 주기는 소프트웨어 개발을 느리게 하는 잠재적 위험이 존재합니다.
고객의 요구사항이 언제든 변경될 수 있기 때문입니다.
만약, 고객의 요구사항이 개발 마무리 직전의 단계에서 변경된다면, 초기 설계 내용을 재설계해야할 것입니다.

TDD 장점

튼튼한 객체 지향적인 코드 생산
TDD 코드의 재사용 보장을 명시 → TDD를 통한 소프트웨어 개발 시 기능 별 철저한 모듈화가 이뤄짐
재설계 시간 단축
테스트 코드를 먼저 작성 → 개발자가 무엇을 해야하는지 분명이 정의하고 개발을 시작
디버깅 시간 단축
자동화된 Unit Testing을 통해 쉽게 특정 버그를 찾아낼 수 있다.
테스트 문서의 대체 가능
추가 구현의 용이함

TDD의 단점

생산성의 저하
실제 코드를 작성하는 것 뿐만 아니라 테스트 코드를 작성해야 하는 또 다른 비용이 발생합니다.
출처

파일 입출력 실습 : 서울시 병의원 데이터. csv 파일 활용

Gradle 프로젝트 생성

프로젝트를 Gradle로 빌드해 봅시다.
위와 같이 Gradle Project를 하나 생성해줍니다.

Test 클래스 만들기

위와 같이, 테스트 하고 싶은 클래스에 들어가 ctrl+shift+t 를 눌러주면 위와 같은 화면을 볼 수 있습니다.
JUnit5로 설정한 뒤, ok 버튼을 눌러 테스트 클래스를 생성해줍니다.
이제 테스트 클래스를 작성할 수 있습니다.

Getter 메소드 생성하기

이제 sql 파일을 만들기 위한 작업을 수행해보도록 하겠습니다.
Hospital 클래스에서 데이터들을 외부에서 활용하기 위해 getter 메소드를 만들어줍니다.
alt+insert : Generate 단축키

Test 코드 작성

테스트 코드에서 parse() 메소드의 기능이 잘 동작하는지 검사할 것입니다.
그 전에, 올바른 파싱 형식을 유지하기 위해 replaceAll() 메소드를 통해, 큰 따옴표를 제거해줍니다.
Test Code
위 코드는 Hospital의 id 필드가 잘 파싱되었는지 테스트 할 수 있는 아이디 테스트 메소드 입니다.
테스트 메소드를 실행하면 위와 같이 테스트가 잘 수행되었으므로, 아이디 값이 잘 파싱되었음을 알 수 있습니다.

Hospital 클래스의 모든 fieid 테스트 하기

우리가 SQL 파일을 만들기 위해선, id, 주소, 구, 카테고리, 응급실 운영 여부, 병원명 등의 필드가 필요합니다.
이러한 필드값들이 parse() 메소드를 통해 파싱이 잘 이뤄지고 있는지 테스트 메소드를 통해 검증할 수 있습니다.
address 필드 파싱 테스트
district 필드 파싱 테스트
category 필드 파싱 테스트
emergencyRoom 필드 파싱 테스트
name 필드 파싱 테스트

Test 클래스 추상화

위의 테스트 코드를 유심히 보면, 동일한 로직이 거의 반복되고 있는 것을 볼 수 있습니다.
Assertion을 통해 검증을 하는 부분을 제외하면, 거의 동일한 로직이 많이 보입니다.
이를 추상화 해보도록 하겠습니다.
위와 같이 동일하게 필요했던 HospitalParser, Hospital 클래스 객체를 생성하고, 검증하는 부분은 메소드로 분리해줌으로써 추상화시켜줄 수 있습니다.
위의 그림을 통해 추상화 된 테스트 클래스가 정상적으로 실행된 것을 알 수 있습니다.

SQL 파일을 생성해보자

이전 단계에서 우리는 parse() 메소드의 정상 동작을 테스트 클래스를 통해 검증했습니다.
이제, 파일을 읽어 필요한 데이터를 파싱한 뒤, sql 파일을 생성해 봅시다.

파일 생성 메소드

파일 쓰기 메소드

SQL INSERT 문으로 만드는 메소드

이 부분은 제가 작성한 코드로 설명하도록 하겠습니다.
제가 작성한 코드의 클래스 다이어그램입니다.
코드
제 로직이 과연 괜찮은 로직인지 궁금합니다!

Intellij

Intellij 에서 화면 분리하기
split 하고 싶은 실행 중인 파일을 우클릭 → split Right를 클릭해줍니다.
위와 같이 화면이 분리 된 것을 볼 수 있습니다.
Intellij의 단축키들
alt + 1 → 프로젝트 구조로 이동
이 때, Alt+Insert로 새로운 파일 생성 가능
ctrl + e → 열었던 파일 목록
ctrl + tab → 이전 파일
ctrl + tab tab → 전전 파일
shift + shift → 모든 항목 검사

나가면서

오늘은 서울시 병의원 정보 라는 대용량 데이터 파일을 활용한 실습을 진행해보았습니다. 파일을 읽어오는 과정에서, 인코딩 문제 등 까다로웠던 부분이 있었던 것 같습니다. 실습 시간을 통해 몰입감 있게 해낼 수 있어 좋았던 것 같습니다.
또한, 파일을 읽어오고 생성하는 과정에서 효율적인 로직을 어떻게 구축할 수 있을지 고민해볼 수 있었던 유익한 시간 이었던 것 같습니다.