1.
4.
5.
알고리즘
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() 메소드를 통해, 큰 따옴표를 제거해줍니다.
•
위 코드는 Hospital의 id 필드가 잘 파싱되었는지 테스트 할 수 있는 아이디 테스트 메소드 입니다.
•
테스트 메소드를 실행하면 위와 같이 테스트가 잘 수행되었으므로, 아이디 값이 잘 파싱되었음을 알 수 있습니다.
Hospital 클래스의 모든 fieid 테스트 하기
•
우리가 SQL 파일을 만들기 위해선, id, 주소, 구, 카테고리, 응급실 운영 여부, 병원명 등의 필드가 필요합니다.
•
이러한 필드값들이 parse() 메소드를 통해 파싱이 잘 이뤄지고 있는지 테스트 메소드를 통해 검증할 수 있습니다.
Test 클래스 추상화
•
위의 테스트 코드를 유심히 보면, 동일한 로직이 거의 반복되고 있는 것을 볼 수 있습니다.
◦
Assertion을 통해 검증을 하는 부분을 제외하면, 거의 동일한 로직이 많이 보입니다.
•
이를 추상화 해보도록 하겠습니다.
•
위와 같이 동일하게 필요했던 HospitalParser, Hospital 클래스 객체를 생성하고, 검증하는 부분은 메소드로 분리해줌으로써 추상화시켜줄 수 있습니다.
•
위의 그림을 통해 추상화 된 테스트 클래스가 정상적으로 실행된 것을 알 수 있습니다.
SQL 파일을 생성해보자
•
이전 단계에서 우리는 parse() 메소드의 정상 동작을 테스트 클래스를 통해 검증했습니다.
•
이제, 파일을 읽어 필요한 데이터를 파싱한 뒤, sql 파일을 생성해 봅시다.
파일 생성 메소드
파일 쓰기 메소드
SQL INSERT 문으로 만드는 메소드
•
이 부분은 제가 작성한 코드로 설명하도록 하겠습니다.
•
제가 작성한 코드의 클래스 다이어그램입니다.
Intellij
•
split 하고 싶은 실행 중인 파일을 우클릭 → split Right를 클릭해줍니다.
•
위와 같이 화면이 분리 된 것을 볼 수 있습니다.
•
alt + 1 → 프로젝트 구조로 이동
◦
이 때, Alt+Insert로 새로운 파일 생성 가능
•
ctrl + e → 열었던 파일 목록
•
ctrl + tab → 이전 파일
•
ctrl + tab tab → 전전 파일
•
shift + shift → 모든 항목 검사
나가면서
•
오늘은 서울시 병의원 정보 라는 대용량 데이터 파일을 활용한 실습을 진행해보았습니다. 파일을 읽어오는 과정에서, 인코딩 문제 등 까다로웠던 부분이 있었던 것 같습니다. 실습 시간을 통해 몰입감 있게 해낼 수 있어 좋았던 것 같습니다.
•
또한, 파일을 읽어오고 생성하는 과정에서 효율적인 로직을 어떻게 구축할 수 있을지 고민해볼 수 있었던 유익한 시간 이었던 것 같습니다.