ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [whiteship] 온라인스터디 - 4주차. 제어문
    IT 발자취.../JAVA 2020. 12. 12. 01:58
    github.com/whiteship/live-study/issues/4
     

    4주차 과제: 제어문 · Issue #4 · whiteship/live-study

    목표 자바가 제공하는 제어문을 학습하세요. 학습할 것 (필수) 선택문 반복문 과제 (옵션) 과제 0. JUnit 5 학습하세요. 인텔리J, 이클립스, VS Code에서 JUnit 5로 테스트 코드 작성하는 방법에 익숙해

    github.com

    학습할 것 (필수)

    선택문 ( 조건문 )
    반복문

     

    개요

    지금까지의 코드의 실행흐름이 무조건 위에서 아래로 한 문장씩 순차적으로 진행되었지만, 때로는 조건에 따라 문장을 건너뛰고, 때로는 같은 문장을 반복해서 수행해야할 때가 있다.

    이처럼 프로그램의 흐름을 바꾸는 역할을 하는 문장들을 '제어문' 이라고한다.

    제어문에는 '조건문과 반복문'이 있는데, 조건문은 조건에 따라 다른 문장이 수행되도록 하고, 반복문은 특정 문장들을 반복한다.

     

    조건문 if, switch

    조건식의 연산결과에 따라 실행할 문장이 달라진다.

    if문

    if (조건식) {
    	// 조건식이 참(true)일 때 수행될 문장들을 적는다.
    }
    if ( score > 90 ) {
        System.out.println("A학점입니다.");
    }

    if-else문

    if문의 변형인 if-else문의 구조는 다음과 같다. if문에 'else블럭'이 더 추가되었다.

    'else'의 뜻이 '그 밖의 다른'이므로 조건식의 결과가 참이 아닐 때, 즉 거짓일 때 else블럭의 문장을 수행하라는 뜻이다.

    if (조건식) {
        // 조건식이 참 (0이 아닌 값) 일 때, 수행될 문장들을 적는다.
    } else {
        // 조건식이 거짓 (0) 일 때, 수행될 문장들을 적는다.
    }
    if (input >= 0) {
        System.out.println("0보다 크거나 같은 수입니다.");
    } else {
        System.out.println("0보다 작은 수입니다.");
    }

    if - else if문

    if-else문은 두 가지 경우 중 하나가 수행되는 구조인데, 처리해야할 경우의 수가 셋 이상인 경우에는 어떻게 할까?

    그럴 때는 한 문장에 여러 개의 조건식을 쓸 수 있는 if-else if문을 사용하면 된다.

    if (조건식1) {
        // 조건식1의 연산결과가 참일 때 수행되는 결과
    } else if (조건식2) {
    	// 조건식2의 연산결과가 참일 때 수행되는 결과
    } else if (조건식3) {
    	// 조건식3의 연산결과가 참일 때 수행되는 결과
    } else { // 마지막에는 보통 else 블럭으로 끝나며, else 블럭은 생략 가능하다.
    	// 위의 어느 조건식에도 바놎가힞 않을 때 수행될 문장들을 적는다.
    }
    if (input > 0) {
        System.out.Println("0보다 큰 수 입니다.");
    } else if (input < 0)) {
    	System.out.Println("0보다 작은 수 입니다.");
    } else {
    	System.out.Println("0 입니다.");
    }

    중첩 if문

    if문의 블럭 내에 또 다른 if문을 포함시키는 것이 가능한데 이것을 중첩 fi문이라고 한다.

    중첩 횟수에는 거의 제한이 없다.

    if (조건식1) {
    	// 조건식1의 연산결과가  true일 때 수행될 문장들을 적는다.
        if (조건식2) {
        	//조건식1과 조건식2가 모두 true일 때 수행될 문장들
        } else {
        	// 조건식1이 true이고, 조건식2가 false일 때 수행되는 문장들
        }
    } else {
    	// 조건식1이 false일 때 수행되는 문장들
    }
    if (input >=0 ) {
    	if (input != 0) {
        	sign = '+';
        }
    } else {
    	sign = '-';
    }

     

    ---

    if else문과 중첩 if문을 많이 사용하게 되면, 코드 가독성도 좋지 않게되고, 불필요한 코드가 늘어날 수 있다.

     

    기초단계의 학습에는 일단 제어문을 익히는 것이 중요하지만, 추후 리팩토링이 필요할 때는 위의 방법들을 잘 사용하도록 고려를 해야할 것 같다.

     

    유튜브 강의 중 인상 깊었던 강의가 있어서 첨부합니다.

    www.youtube.com/watch?v=bIeqAlmNRrA

    위 강의에서는 if else문을 사용하면 습관적으로 로컬 변수를 지정하게되고, indent가 1이 늘어난다는 이야기를 해주신다. ( 약 35 분경 )

     

    그외 if문이나 if-else 줄이기에 대해서는 다양한 블로그가 있어, 블로그를 참고하거나, 추가적으로 다른 포스터로 이야기를 할까 한다.

    plas.tistory.com/15

     

    코드 리뷰 ABC - if 문 줄이기

    코드리뷰 시리즈 프로그래밍 스타일 - 들여쓰기와 스페이스 프로그래밍 스타일 - 이름 붙이기 코드 리뷰 ABC - if 문 줄이기 (이글) 코드 리뷰 ABC - 반복문 코드 개선 코드 리뷰는 개발자들이 서로

    plas.tistory.com

    sophia2730.tistory.com/entry/Java-ifelse-%EC%A4%84%EC%9D%B4%EB%8A%94-%EC%BD%94%EB%94%A9%EB%B0%A9%EB%B2%95

     

    [Java] if-else 줄이는 코딩방법

    * 무분별한 if-else 줄이는 코딩 방법(Callback Hell 탈출) if-else는 프로그래밍을 하면서 필수적으로 사용된다. 하지만 무분별한 if-else문 남용은 가독성을 떨어트려 이해하기 어려운 코드가 된다. 특히

    sophia2730.tistory.com

    ---

     

    switch문

    if문은 조건식의 결과가 참과 거짓, 두 가지 밖에 없기 때문에 경우의 수가 많아수록 else-if를 계속 추가해야하므로 조건식이 많아져서 복잡해지고, 여러 개의 조건식을 계산해야 하므로 처리 시간도 많이 걸린다.

    switch 문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하므로 알아보기 쉽다.

    그래서 처리할 경우의 수가 많은 경우에는 if문 보다 switch문으로 작성하는 것이 좋다.

    switch (조건식) {
    	case 값1 :
        	// 조건식의 결과가 값 1과 같을 경우 수행될 문장들
        	break;
        case 값2 :
        	// 조건식의 결과가 값 2과 같을 경우 수행될 문장들
        	break;
        default:
        	// 조건식의 결과와 일치하는 case문이 없을 떄 수행될 문장들
    }
    switch (level) {
        case 3:
        	grantDelete(); // 삭제 권한 부여
        case 2:
        	greantWrite();	// 쓰기 권한 부여
        case 1:
        	grantRead();	// 읽기 권한부여
    }

    위 코드는 기존의 java의 swtich 문이고, 꾸준히 스터디를 하여 3주차 스터디를 하였으면, 모던 자바의 switch문 사용에 대해서 연구하였을 것이다.

     

    gintrie.tistory.com/63 > (optional) Java 13. switch 연산자 ( 표현식?)

     

    반복문 - for, while, do-while

    for문

    for문은 반복 횟수를 알고 있을 때 적합하다. 구조가 조금 복잡하지만 직관적이라 오히려 이해하기 쉽다.

     

    직관적으로 알 수 있듯이, i가 1부터 5까지 1씩 증가하면서, 반복실행을 하게 된다.

    for (int i=1, i<=5; i++) {
    	System.out.println("I can do it.");
    }
    
    // 결과
    // i=1, 출력 : I can do it.
    // i=2, 출력 : I can do it.
    // i=3, 출력 : I can do it.
    // i=4, 출력 : I can do it.
    // i=5, 출력 : I can do it.

    for문의 구조와 수행순서

    for (초기화;조건식;증감식) {
    	// 조건식이 참일 때 수행될 문장들을 적는다.
    }

     

    반복문을 사용해서 1부터 10까지 더하는 코드를 작성해보도록 한다.

    ( 저는 가우스같은 천재가 아니라 ... 1부터 10까지 손수 더하는 프로그램을 짜보도록 하겠습니다)

     

    아래 코드는 for문을 돌며 반복적으로 sum에 i를 더해주고, i를 1씩 증가해줍니다.

    실질적으로 컴퓨터가 연산하는 건 아래와 같지 않지만, 시간순으로 더해지는 값들을 아래와 같이 표현하였습니다.

    sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10

    @Test
    public void sumTest() {
        int sum = 0;    // 합계를 저장하기 위한 변수.
    
        for (int i = 1; i <= 10; i++) {
            sum += i;   // sum = sum + i;
        }
        assertEquals(55, sum);
    }
    //////////////////////////////////////////////////////
    // 그냥 똑똑해보이고 싶을 떄 ...
    //////////////////////////////////////////////////////
    @Test
    public void sumGaussTest() {
        // 천재처럼 1부터 10까지 더하기
        // (n+1)*n / 2;
        assertEquals(55, (10 + 1) * 10 / 2);
    }

     

    반복문을 연습하거나 학교에서 배울 때 가장 많이 받는 과제가 있습니다.
    반복문을 이용하여 트리 그리기...
    크리스마스 기념 심심한 분들은 해보면 좋을 것 같습니다 ㅎㅎㅎ

    *
    **
    ***
    ****
    *****
    ******

     

    깨알 팁!!!

    앞으로 배열을 사용할 때, for문을 자주 사용할 것이다.

    IDE로 인텔리제이를 사용한다면, for문을 쉽게 만들 수 있다. 

    ( 이번 스터디에서 구두로 나왔던 내용 )

     

    배열 아래 itar를 입력하고 엔터를 치면 아래 사진과 같이  for문이 자동으로 만들어진다. (~ ̄▽ ̄)~

    itar외에도 여러가지 명령이 있다.

    기타 등등 ...

    while문

    for문에 비해 while문의 구조가 간단합니다. if 문처럼 조건식과 블럭 {} 만으로 이뤄져 있습니다.

    다만 if문과 달리 while문은 조건식이 '참(true)인 동안', 즉 조건식이 거짓이 될 때까지 블럭 {} 내의 문장을 반복합니다.

    while ( 조건식 ) {
    	// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
    }

    for문과 비교

    for문

    // 초기화, 조건식, 증감식
    for ( int i=1, i<=10; i++) {
    	System.out.println(i);
    }

    while문

    int i=1; //초기화
    
    while(i<=10) {	// 조건식
    	System.out.println(i);
        i++; 	//증감식
    }

    while문을 이용하여 무한 루프도 생성할 수 있다.

    while(true) {}

     

    do-while문

    do-while문은 while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블럭{}의 순서를 바꿔놓은 것이다. 그래서 while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가한다. while문은 조건식의 결과에 따라 블럭{}이 한 번도 수행되지 않을 수 있지만, do-while문은 최소한 한번은 수행될 것을 보장한다.

    do {
    	// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
    } while ( 조건식 );	// 끝에 ';'을 잊지 않도록 주의

     

     

    break 문

    반복문에서 break문을 사용할 수 있는데, switch문에서 그랬던 것처럼, break문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 주로 if문과 함께 사용된다.

     

    int sum = 0;
    int i = 0;
    
    // 1. 외부 while문
    while (true) {
        if(sum>100) {
            System.out.println("외부 while문");
            break;
        }
        // 2. 내부 while문
        while(true) {
            ++i;
            sum+=i;
            // 3. 합이 10 초과면 내부 while문은 빠져나온다.
            if (sum > 10) {
                System.out.println("내부 while문");
                // 4. 내부 while문에서 벗어난다.
                break;
            }
        }
    // 5. 내부 while문에서 break가 발생하였어도, 외부 while문은 조건에 맞지 않으므로, 계속 동작한다.
    }

    continue문

    continue문은 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, whiel문과 do-while문의 경우 조건식으로 이동한다.

     

    public void oddNum() {
        for (int i = 0; i <= 10; i++) {
            if (i % 2 == 0)
                continue;
            System.out.println(i);
        }
    }

     

     

     

     

    forEach...

    는 지금 캡터와는 어울리지 않는듯?하다.

    List<String> list = Arrays.asList("a", "b", "c", "d", "e", "f");
    list.forEach(System.out::println);
    
    // 결과
    // a
    // b 
    // c
    // d
    // e
    // f

     

     

    댓글

Designed by Gintire