테스트 코드와 Thread이해
👉 Test 코드
# 의도대로 정확히 작동하는지 검증까지 하기위해 사용.
# 장점
- 개발 과정 중 예상치 못한 문제를 미리 발견할 수 있다.
- 작성한 코드가 의도한 대로 작동하는지 검증할 수 있다.
- 코드의 변경, 추가, 삭제 시 사이드 이펙트를 줄일 수 있다.
(마음편히 변경, 추가, 삭제, 리펙터링 가능)
# Annotation
- `@Test` : 테스트 메서드임을 나타냄. 실행 가능
- `@BeforeEach` : 각 메서드 전에 실행됨을 나타냄.
- `@BeforeAll` : 현재 클래스의 모든 메서드보다 먼저 실행되어야하는 메서드 표시.
- `@AfterAll` : 현재 클래스의 모든 메서드보다 나중에 실행되어야하는 메서드 표시.
- `@RepeatedTest` : 메서드 반복 호출을 함을 표시.
- `@DisplayName` : 사용자 지정 표시 이름을 선언.
- …
# 좋은 테스트 코드를 작성하는 방법
- 간단하게 만들기
- 엣지 케이스 테스트 (잘못 발생하지 않는 항목 테스트)
- 버그를 수정하기 전에 테스트 작성
- 설명이 포함된 이름 사용
- 한 번에 하나의 요구 사항 테스트
# Test 훈련
// @BeforeAll , @BeforeEach
...
class PracticeTest {
@BeforeAll
static void setUp() {
System.out.println("@BeforeAll - executes once before all test methods in this class");
}
@BeforeEach
void init() {
System.out.println("@BeforeEach - executes before each test method in this class");
}
}
//@AfterEach @AfterAll
...
@AfterEach
void tearDown() {
System.out.println("@AfterEach - executed after each test method.");
}
@AfterAll
static void done() {
System.out.println("@AfterAll - executed after all test methods.");
}
}
//Assertions → 찐 기능 검증
...
@Test
@DisplayName("람다 사용")
void lambdaExpression() {
List<Integer> numbers = Arrays.asList(1, 2, 3);
assertTrue(numbers.stream()
.mapToInt(Integer::intValue)
.sum() > 5, () -> "Sum should be greater than 5");
}
...
//구현 클래스
...
public class Practice {
public Integer sumInt(int a, int b) {
return a + b;
}
public Double average(List<Integer> integers) {
return integers.stream().mapToInt(Integer::intValue).average().getAsDouble();
}
}
//테스트
...
@Test
@DisplayName("sum 메소드 성공 테스트")
void sumTest() {
Integer sumInt = practice.sumInt(1, 2);
assertNotNull(sumInt);
assertEquals(sumInt, 3);
}
@Test
@DisplayName("average 메소드 성공 테스트")
void average() {
Double average = practice.average(Arrays.asList(1, 2, 3, 5, 6));
assertNotNull(average);
assertEquals(average, 3.4);
}
👉 스레드 Thread
# JVM 구조 복습
![](https://blog.kakaocdn.net/dn/45ucq/btrSKuUXEuC/dTO5HayVgp8g76tvMhGQmk/img.png)
# JVM Call Stack
- main stack frame에서 일어나는 일 들 / Stack 자료구조! Last-In, First-Out / LIFO 구조
...
int main(void){
func1(); // func1() 호출
return 0;
}
void func1(){
func2(); // func2() 호출
}
void func2(){
}
...
- 프로그램이 실행되면, 가장 먼저 main() 함수가 호출되어 main() 함수의 스택 프레임이 스택에 저장.
- func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장.
- func2() 함수를 호출하면 해당 함수의 스택 프레임이 추가로 스택에 저장.
- func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임만이 스택에서 제거.
- func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거.
- main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료.
# Thread와 Multi Thread 프로그래밍
- Main Thread
모든 자바 프로그램은 메인 스레드가 psvm을 실행하며 시작.
main 스레드는 작업 스레드들을 만들어 병렬로 코드들을 실행.
- 프로세스의 종료
싱글 쓰레드 : 메인 쓰레드가 종료하면 프로세스도 종료.
멀티 쓰레드 : 실행 중인 쓰레드가 하나라도 있다면, 프로세스 미종료.
# Thread Scheduling
- 컴퓨터가 동시에 처리할 수 있는 최대 작업 수는 CPU 코어(core) 수와 같다.
스레드의 개수가 코어의 수보다 많을 경우, 스레드를 어떤 순서로 동시성을 실행할 것인가 결정하는 스레드 스케줄링.
- 자바의 스레드 스케줄링은 우선 순위(Priority) 방식과 순환 할당(Round-Robin) 방식 사용. 기본 메커니즘은 Queue 구조를 가짐
- 우선 순위 방식 : 우선 순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링. : 1~10까지 값을 가질 수 있으며, 기본은 5.
- 순환 할당 방식 : 시간 할당량(Time Slice)을 정해서 하나의 스레드를 정해진 시간만큼 실행.
![](https://blog.kakaocdn.net/dn/bEaDxs/btrSHLxmmm4/vjPe13n0jpWSvbj0zOz1e1/img.png)
![](https://blog.kakaocdn.net/dn/5WaZ2/btrSM49gnNd/UdnA0m1Wt8K7oVEB54a3qk/img.png)
![](https://blog.kakaocdn.net/dn/dj2gpa/btrSIpUW67D/yiHKZ30urLw6kSumYghKqK/img.png)
👉 osi 7계층
# 네트워크 : 정보가 전송되는 경로.
# 글로벌 네트워크 구성을 위해 전세계 모든 컴퓨터를 연결하기 위해서는
- 통신 장비(LAN 장비, WAN 장비) / 통신 역할(서버, 클라이언트) / 통신 규칙(TCP/IP 규칙) 필요
# LAN vs WAN
- LAN (Local Area Network) : 사무실이나 빌딩처럼 비교적 좁은 범위의 네트워크를 말한다.
- WAN (Wide Area Network) : 서로 떨어져 있는 LAN 사이를 전용선 등으로 연결한 광역 네트워크를 말한다.
![](https://blog.kakaocdn.net/dn/dpZ1gi/btrSM42u8L6/HYAJr7wA5DloprNgtzTQ41/img.png)
# 클라이언트 vs 서버
- 클라이언트 : 네트워크상에서 서버에게 서비스를 요청하는 장비 : 컴퓨터, 노트북, 핸드폰, 아이패드 등…
- 서버 : 네트워크상에서 서비스를 제공하는 장비 : 공유기, 도메인 관리기(DNS), IP 할당기(DHCP), 시간관리기(NTP), 게이트웨이 등…
# OSI 7계층
- 규칙이 없어 난장판이었던 네트워크를 OSI 7계층 모델을 만들어서 네트워크 기본 구조를 가이드로 만든것
🙋♂️ 소감 :
오늘 강의들은 CS적인 이해가 많이 필요한 강의들이었다.
그냥 단순히 코드를 짜고, 결과가 나오면 되는것이 아니라,
어떻게 하면 비용을 아끼면서 효율적으로 코드를 짤 수 있을까를 고민해야하는데,
아직은 그 수준에 한참 미치지 못해서, 당장은 그냥 아웃풋만 나와도 좋다.
언젠간 효율성을 생각하면서 코딩하는 날이 오겠지....ㅎㅎ
'❤️🔥TIL (Today I Learned)' 카테고리의 다른 글
[TIL] 2022-12-06(27day) (0) | 2022.12.05 |
---|---|
[TIL] 2022-12-05(26day) (0) | 2022.12.05 |
[TIL] 2022-12-01(24day) (0) | 2022.12.01 |
[TIL] 2022-11-30(23day) (0) | 2022.11.30 |
[TIL] 2022-11-29(22day) (0) | 2022.11.29 |
댓글