조건문
보통 if, switch를 많이 사용한다.
조건식의 연산결과에 따라 실행할 문장이 달라진다. 그에따라 프로그램의 흐름이 변경된다.
if문
if(조건식){ 내용} 이렇게 이루어진다. 조건식의 내용이 참이면 내용을 수행한다.
int student_score = 93;
if(student_score>=90){ //student_score은 93으로 90보다 크다(true)
System.out.println("A 입니다."); //조건문이 true이므로 'A 입니다.' 출력된다
}
추가로 if문은 { }생략이 가능하다.
물론 모든경우가 가능한것은 아니고 한줄의 if문만 가능하다.
int student_score = 87;
if(student_score>=90) System.out.println("A 입니다.");
//또는
if(student_score>=90)
System.out.println("A 입니다.");
//불가능한 경우
if(student_score>=90)
System.out.println("A 입니다.");
System.out.println("잘했어요."); //if문과 상관없이 그냥 출력된다.
if-else, else
if문의 변형으로 구조는 다음과 같다. else 는 '그 밖의 다른'이란 의미이다.
아래의 경우에서 B의 조건이 80<=student_score<90 인 이유는 이미 if문에서 90이상을 담당하고있어서 한번 더 언급할 필요가 없다. 이미 아래 else if로 내려온것은 score가 90이 안되기때문이다.
마지막으로 else는 위 조건문의 조건식에 부합하지 않는 모든 값을 다 포괄한다. 따라서 70미만이면 다 else인거다.
public class Main {
public static void main(String[] args){
int student_score = 87;
if(student_score>=90){ //90이상이면 작동
System.out.println("A 입니다.");
}
else if(student_score>=80){ //80이상 90미만이면 작동
System.out.println("B 입니다.");
}
else if(student_score>=70){ //70이상 80미만이면 작동
System.out.println("C 입니다.");
} //70미만이면 작동
else System.out.println("D 입니다.");
}
}
Switch문
단 하나의 조건식으로 많은 경우의 수를 처리할 수 있는 조건문이다.
따라서 많은 경우의 수가 존재하는경우에는 if문보다 switch문으로 작성하는 것이 좋다.
다만 switch문은 제약조건이 있기때문에, 경우의 수가 많아도 if문으로 작성해야 하는 경우가 있다.
public class Main {
public static void main(String[] args){
char grade = 'B';
switch(grade){
case 'A':
System.out.println("90이상입니다.");
break;
case 'B':
System.out.println("80이상입니다.");
break; //break;를 통해서 switch반복문을 빠져나온다
case 'C':
System.out.println("70이상입니다.");
break;
case 'D':
System.out.println("60이상입니다.");
break;
default:
System.out.println("60미만입니다.");
}
//"80이상입니다." 출력
}
}
추가내용
- if문과 switch문의 성능 차이
- 대부분 상황에서 유사한 결과를 제공하지만, 특정 상황에서는 성능 면에서 차이가 발생할 수 있다. if문은 조건을 순차적으로 평가하기 때문에 조건이 많아질수록 실행 시간이 증가하는 반면에 switch문은 값을 통해 분기하기 때문에 조건이 많더라도 효율적으로 처리하게된다.
- switch expression 도입(Java12부터)
- 이거는 https://developerjisu.tistory.com/24 Java 13.switch 연산자 구문 항목에 자세히 설명되어있어 생략하겠다.
- 삼항 연산자(if문 대체)
- 만일 if문이 if와 else만 존재한다고 하면 간단하게 구현가능하다.
- 만일 if문이 if와 else만 존재한다고 하면 간단하게 구현가능하다.
int a = 5;
int b = 10;
a > b ? printf("a가 크다):print("b가 크다 "); // 조건?참일경우실행 : 거짓일경우 실행;
반복문
어떤 작업이 반복적으로 수행되도록 할때 사용한다. for, while, do-while이 있다.
for문
for문은 반복횟수를 알고 있을때 적합한 반복문이다. 아래의 예시를 보면
반복이 1부터 10까지 1씩 증가이므로 총 10회 인것을 알 수있다. 그러면 3번 수행될문장을 총 10번실행하는거다.
- 무한루프
반복문에는 초기화 조건식 증감식이 생략이 가능하다. for(;;){ 수행될문장} 이렇게 말이다.
이런 구문의 경우 반복을 끝없이 하기때문에 따로 조건문을 만들어 continue 또는 break을 통해 반복문을 멈춰줘야한다. 추후에 반복문 설명이 다 끝난 이후에 continue와 break개념을 설명하도록 하겠다.
- for문에서 초기화와 증감식을 한문장이아닌 두문장이상도 사용가능하다. -> 가능하면 쓰지마라
- for(i = 1, j=10; i<=10; i++,j--) 이런식으로 말이다. 하지만 많은 단점이 있어 사용하지않는다.
- 코드 복잡도와 가독성: 코드가 복잡해짐에 따라 가독성이 떨어지고 버그가 발생할 가능성이 높아진다.
- 유지 보수성: 두 개 이상의 초기화와 증감식을 사용하면 코드 변경이 어려워질수있다. 특히나 다른 부분의 코드와 상호작용하는 경우 수정 난이도가 더 올라간다.
- 코드 스타일 가이드: 대부분의 개발팀이 코드 스타일 가이드를 따르고 있는데, 이러한 복잡한 형태의 for문은
스타일 가이드에서 권장하지않는다.
- for(i = 1, j=10; i<=10; i++,j--) 이런식으로 말이다. 하지만 많은 단점이 있어 사용하지않는다.
- 이중 반복문(n중 반복문)
- 이중 반복문 까지는 자주사용하다보니 밑에 예시를 들어 설명하겠다.(tmi: 이중 이후부터는 알고리즘을 안쓰면
기업에서 조인트를 까인다는 소문이있다. 추가로 몇몇 알고리즘문제는 시간복잡도가 이중반복문으로는 통과 못하는 경우가 있다.)
- 이중 반복문 까지는 자주사용하다보니 밑에 예시를 들어 설명하겠다.(tmi: 이중 이후부터는 알고리즘을 안쓰면
for (int i = 2; i <= 9; i++) {
for(int j = 1; j<=9; j++){
System.out.printf("%d x %d = %d\t", i, j, i * j);
}
System.out.println();
}
아래와 같이 출력된다.
While
for문에 비해 구조가 간단하다.
while(조건식){ 수행문장 및 증감식} 아래처럼 작성해주면 된다.
while은 for문과 조건식 생략이 불가능하다. 무한 loop를 돌리고싶은 경우에는 while(true)로 해주면 된다.
do - while
for, while문과 다르게 자주 쓰이지 않아 간략하게 사용방법만 설명하고 넘어가겠다.
do{
//수행될문장 및 증감식
}while(조건식);
continue, break
- continue
- 반복문안에서 어떤 조건을 충족하면 반복문 아랫부분은 읽지않고 다음 반복으로 넘어간다.
for (int i = 1; i <=10; i++) {
if(i%2==0) continue; //2로 나눈 나머지가 0, 한마디로 짝수면 continue작동
//continue작동에 따라 아래는 읽지않고 바로 다음 i++ 반복문으로 넘어간다.
System.out.println(i+" 는 홀수다");
}
- break
- 위에 swtich문에서도 한번 언급했던 break문이다. 자신이 포함된 가장 가까운 반복문을 벗어난다.
for (int i = 1;; i++) { //조건식 생략
if(i == 10)break; //조건식을 대신 수행해줌(10이되면 break -> 반복문을 나간다)
System.out.println(i);
}
//break이후 여기서부터 작동
- n개의 반복문 한번에 탈출하기
- 위에 내용을 이해하고 나면 드는생각이 그러면 이중반복문을 나가고 싶을땐 어떡해야할까?
break를 쓰면 당장 가까운 for문만 탈출하게된다. 이를 해결하고자 반복문 앞에 이름을 붙일수 있다.
- 위에 내용을 이해하고 나면 드는생각이 그러면 이중반복문을 나가고 싶을땐 어떡해야할까?
loop1: for (int i = 1;; i++) { //반복문 이름: loop1
System.out.print(i+"번째줄: ");
for (int j = 0;j<10; j++) {
if(i == 10) break loop1; //조건충족시 loop1이름가진 반복문 탈출
System.out.print(j+" ");
}
System.out.println();
}
continue도 동일하게 반복문이름을 통해 다음 진행반복문을 선택할수있다.
JUnit5
JUnit
정의: 자바 프로그래밍 언어용 유닛테스트 프레임워크이다. JUnit은 테스트 주도 개발면에서
중요하며 SUnit과 함께 시작된 XUnit이라는 이름의 유닛 테스트 프레임워크 계열의 하나이다.
단위테스트를 할수있게 도와주는 테스팅 프로그램이다.
※단위테스트: 애플리케이션을 구성하난 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트 하는것을 지칭하는
용어이다.
JUnit5 구조
- Platform
- 테스트 프레임워크이다.
- TestEngine 인터페이스를 정의한다.
- Jupiter
- TestEngine 구현체이다.
- JupiterAPI를 사용해 작성한 테스트 코드를 실행할때 사용한다.
- Vintage
- TestEngine 구현체이다.
- 기존 JUnit3,4버전으로 작성한 테스트 코드를 실행할때 사용한다.
JUnit사용이유
개발하면서 기능의 개발 및 기능의 변경이 될때마다 서버구동을 하여 일일이 확인하는
불필요한 작업을 수행하거나 수정한 기능을 올리면서 장애가 날까 불안해 하지 않을 수 있게
도와주는 역할을 한다. 또한 파라미터화된 테스트, 조건부 실행, 태깅, 확장, 테스트 인스턴스 라이프사이클 등
다양한 기능을 제공하여 테스트를 보다 쉽게 작성하고 관리할 수 있게 해준다.
※태깅: 특정 태그를 찌정하여 특정기준에 따라 테스트를 그룹하거나 필터링 하는 기능(통합 테스트, 단위테스트
구분 가능)
Annotations
JUnit5에서 제공되는 어노테이션은 상당이 많다.
Test, TestFactory, ParameterizedTest, BeforeAll, BeforeEach, AfterAll, Tag 등등 필요시에 찾아보는것을 추천드린다.
그래서 주요 어노테이션 설명과 사용예시만 보여줄려고 한다.
주요 어노테이션 설명과 사용예시
Test
- 해당 메소드가 단위 테스트임을 명시하는 어노테이션이다
DisplayName
- JUnit5의 Test이름 표시
- method위에 작성해야한다
아래는 단위 테스트임을 명시하는 어노테이션과 테스트이름을 JUNIT TEST로 설정한 모습이다
@Test
@DisplayName("JUNIT TEST")
public void printTest(){
System.out.println("test작동");
}
BeforeAll/ AfterAll
- BeforeAll
- 모든 테스트가 실행되기 이전에 1번 호출된다
- AfterAll
- 모든 테스트가 실행된 이후 1번 호출된다
@BeforeAll
public static void beforeTest(){
System.out.println("test전에 작동");
}
@AfterAll
public static void afterTest(){
System.out.println("test후에 작동");
}
@Test
@DisplayName("JUNIT TEST")
public void printTest(){
System.out.println("test작동");
}
BeforeEach/AfterEach
- BeforeEach
- 각각의 테스트가 실행되기 이전에 호출된다
- AfterEach
- 각각의 테스트가 실행된 이후에 호출된다
@BeforeEach
public void beforeTest(){
System.out.println("test전에 작동");
}
@AfterEach
public void afterTest(){
System.out.println("test후에 작동");
}
@Test
@DisplayName("JUNIT TEST")
public void printTest1(){
System.out.println("test작동1");
}
@Test
@DisplayName("JUNIT TEST2")
public void printTest2(){
System.out.println("test작동2");
}
Test1,2가 각각 작동할때마다 BeforeEach, AfterEach가 작동하는것을 볼 수 있다
ParameterizedTest
- 여러 다른 입력값과 함께 여러 번 실행할 수 있도록 도와주는 어노테이션이다. 보통은 아래 3가지 상황에 사용한다.
- 함수 또는 메소드가 여러 다른 입력에 대해 동일한 동작을 수행해야 할 때
- 다양한 입력 값을 사용하여 테스트를 반복적으로 수행하여 안정성을 확인하려고 할때
- 입력 값에 따라 기대 출력이 다른 테스트 케이스를 작성해야 할때
@DisplayName("JUNIT TEST")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5})
public void printTest1(int testNum){
System.out.println("파라미터로 입력받은 정수는: "+ testNum +"이다.");
}
RepeatedTest
- RepeatedTest 어노테이션 파라미터값으로 넘겨지는 정수 값 만큼 테스트 반복한다
static int i = 1;
@DisplayName("JUNIT TEST")
@RepeatedTest(3)
public void printTest1(){
System.out.println(i+"번째 반복");
i++;
}
ReaptedTest에 3을 주었고 메서드를 3번 반복하는걸 확인할 수 있다
참고
- 조건문과 반복문
자바의 정석(저자: 남궁성) - JUnit
- 과제
'자바(Java)' 카테고리의 다른 글
[자바] 자바 클래스 (0) | 2023.08.14 |
---|---|
[자바] HashSet 중복값 처리 과정, 배열로 변경하는 법 (0) | 2023.08.08 |
[자바] 자바 연산자 (0) | 2023.07.29 |
[자바] 자바의 프리미티브 타입, 변수, 배열 선언 (0) | 2023.07.24 |
[자바] JVM, 자바 실행방법 (2) | 2023.07.16 |