상세 컨텐츠

본문 제목

3. 프로그래밍의 꽃 Java 제어문 Part 1 (조건문)

How To Java/Java Tutorial

by 카페코더 2020. 2. 19. 18:27

본문

반응형

취업 준비를 하며 복습한다는 마음으로, 이것을 보는 누군가에게 도움이 되었으면 하는 마음으로
Java-Tutoral을 작성해 봅니다. 입문서와 순서가 잘못되었을 수 있고, 제가 아는 정보가 틀렸을 수 있습니다.
이 글에 대한 잘못된 정보나, 오탈자 등 수정해야 할 항목 혹은 추가해야 할 항목은 댓글로 알려주시면 감사하겠습니다.

이 자료가 올라가는 저장소 :
https://github.com/hwk0911/Java-tutorial

 

hwk0911/Java-tutorial

Java tutorial. Contribute to hwk0911/Java-tutorial development by creating an account on GitHub.

github.com

개인적인 생각으로 제어문은 프로그래밍의 꽃이라 생각한다. (+ 포인터)

이번 포스팅은 Java의 제어문을 알아보려 한다.
Part 1, Part 2 로 나누어 조건문, 반복문으로 진행하려 한다.

이번 포스팅부터는 진행 한 항목의 내용에 맞는 문제를 Beakjoon Online Judge(BOJ) 에서 찾아 같이 포스팅하려한다.
(문제 + 해설)

제어문

제어문은 프로그래밍의 논리의 기본이라 생각한다. 모든 자료구조, 알고리즘에 반드시 포함된다.
많은 내용이 중요하지만, 특히 중요한 파트라 생각된다.

1. 조건문

모든 제어문이 마찬가지지만, true 와 false 를 통하여 프로그래밍의 진행 방향을 정해준다.

기차의 진행방향을 정하는 갈림길

위 사진과 비슷한 느낌을 갖는다. 기차는 기본적으로 한 방향으로 진행하는데, 선로 변경을 통하여
도착할 목적지를 변경하는것 과 같다.

다시 말하지만, 조건문은 프로그래밍의 앞으로의 진로를 변경해 주는 문법이다.

1.1 if

if는 단순 번역으로 만약 혹은 만일 ... 이라면 으로 해석이 가능하다.
프로그래밍에서의 if는 만일 ... 이라면 으로 해석하는것이 더 맞다.

가장 기본적인 조건문이자, 가장 많이 쓰이는 문법 중 하나인 if에 대해 알아보자.

if의 구조

if문의 방식은 간단하게 위의 다이어그램으로 나타낼 수 있다.

조건문의 내용이 true, false 에 따라 특정 실행문을 실행하는 방식이다.

코드로 한번 살펴보자.

public class Main {
    public static void main(String[] args) {
        boolean condition = true;

        if(condition){
            System.out.println("condition = " + condition);
        }

        System.out.println("condition = " + condition);
    }
}
/*
결과 :
condition = true
condition = true

Process finished with exit code 0
 */

condition이라는 이름으로, boolean 변수를 선언하여 true 값으로 초기화 해 선언했다.

if (조건문) {
    실행문
}

의 기본 구조를 갖는데, 이 때 조건문이 true 일 경우 실행문이 실행된다.
이 때 false인 경우 실행문을 실행하고 싶다면, ! 를 통하여 값을 반전시켜주면 된다.

public class Main {
    public static void main(String[] args) {
        boolean condition = true;

        if(!condition){
            System.out.println("condition = " + condition);
        }

        System.out.println("condition = " + condition);
    }
}
/*
결과 :
condition = true

Process finished with exit code 0
 */

결과가 한 줄만 출력된 것을 볼 수 있다. 조건문이 not true = false 이므로 if 내부의 실행문이 무시된 채 
그 다음 실행문을 실행한 결과다.

하지만 우리는 한가지의 조건으로 프로그래밍 할 순 없다. 
if 의 조건문이 아닌 경우에 이 경우도 필요하다 싶을 때, else or else if를 사용하면 된다.

다음 코드를 보자.

public class Main {
    public static void main(String[] args) {
        String str = "Hello";

        if(str.equals("hello")){
            System.out.println("hello");
        }
        else if(str.equals("hi")){
            System.out.println("hi");
        }
        else{
            System.out.println("Hello");
        }
    }
}
/*
결과 :
Hello

Process finished with exit code 0
 */

Java의 자료형 포스팅에 String의 비교는 equals로 해야한다 설명했다.
추가로 null이 들어올 경우가 있는 변수는 비교의 대상으로 선언해준다.
ex ) str.equals(null)

위에서 프로그래밍의 if는 만일 ... 이라면 으로 해석하는것이 더 맞다 설명했다.

그것에 맞춰 위의 코드를 해석해보면 다음과 같다.

  1. String 변수 str을 "Hello"로 초기화 하여 선언
  2. 만일 str이 "hello" 라면 "hello"를 출력한다.
  3. 만일 str이 "hello" 가 아니고, "hi" 라면 "hi"를 출력한다.
  4. 만일 str이 "hello"도 아니고, "hi"도 아닌 모든 조건에 만족하지 않는다면, "Hello"를 출력한다.

위의 내용을 범용적으로 간단하게 표현해보면 다음과 같다.

  1. if : 혹시 이거(조건문)야? OK 그러면 이거(실행문).
  2. else if : 아 그거 아니면 혹시 이거(조건문)야? OK 그럼 이거(실행문).
  3. else : 아.. 전부 아니야? 그러면 이거(실행문)

세상에.. 내가 생각해도 정말 비유를 잘 했다. 개인적으로 프로그래밍 할때 저런식으로 생각하면서 짠다 ㅋㅋㅋ

if의 조건문은 true or false로 나타낼 수 있으면, 무엇이든 사용가능하다.

하지만 생각해야 할 조건이 많다면, 각 항목마다 새로운 실행문이 필요할 때 else if를 여러 줄 선언하기에는 너무
비효율적이다. 그래서 우리는 switch case를 사용해야 한다.

1.2 switch case

스위치 혹은 스위치 케이스문으로 불린다.

일단 if와 switch의 코드를 비교해보자.

public class Main {
    public static void main(String[] args) {
        int condition = 5;

        //if
        if(condition == 1){
            System.out.println(1);
        }
        else if(condition == 2){
            System.out.println(2);
        }
        else if(condition == 3){
            System.out.println(3);
        }
        else if(condition == 4){
            System.out.println(4);
        }
        else if(condition == 5){
            System.out.println(5);
        }
        else{
            System.out.println("Over Value");
        }
        
        
        //switch case
        switch (condition){
            case 1:
                System.out.println(1);
                break;
            case 2 :
                System.out.println(2);
                break;
            case 3 :
                System.out.println(3);
                break;
            case 4 :
                System.out.println(4);
                break;
            case 5 :
                System.out.println(5);
                break;
            default:
                System.out.println("Over Value");
        }
    }
}
/*
결과 :
5
5

Process finished with exit code 0
 */

코드의 길이를 보면 비슷해보이지만, switch case는 특정 케이스에 대해 분류하는데 특화된 조건문을
표현하고 싶었다. 알아줬으면 좋겠다...

switch case의 기본적인 구조를 살펴보자.

switch case문의 기본 구조다.[ case (비교 대상) : ] 에서 비교 대상과 일치할 때 실행문을 실행한다.

switch case의 구조를 보면, 실행문의 뒤에 break; 가 붙는것을 볼 수 있다.
이것은 switch case의 특징 중 하나인데, break; 가 없다면, 일치하는 시점부터 마지막 default 까지 
모든 실행문을 실행한다.

public class Main {
    public static void main(String[] args) {
        int condition = 1;
        
        switch (condition){
            case 1 :
                System.out.println(1);
            case 2 :
                System.out.println(2);
            case 3 :
                System.out.println(3);
            case 4 :
                System.out.println(4);
            case 5 :
                System.out.println(5);
            default:
                System.out.println("Over Value");
        }
    }
}
/*
결과 :
1
2
3
4
5
Over Value

Process finished with exit code 0
 */

상황에 따라 break;를 사용할지, 사용하지 않을지 생각하여 프로그래밍 하도록 하자.
때로는 버그의 주 원인이 될 수 있고, 때로는 효율적인 프로그래밍의 시작이 될 수 있다.

 

조건문 문제

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 34905 19836 18183 58.078%

문제

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때 이다.

예를들어, 2012년은 4의 배수라서 윤년이지만, 1900년은 4의 배수이지만, 100의 배수이기 때문에 윤년이 아니다.

하지만, 2000년은 400의 배수이기 때문에 윤년이다.

입력

첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.

출력

첫째 줄에 윤년이면 1, 아니면 0을 출력한다.

예제 입력 1

2000

예제 출력 1

1

출처 : https://www.acmicpc.net/problem/2753

 

2753번: 윤년

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때 이다. 예를들어, 2012년은 4의 배수라서 윤년이지만, 1900년은 4의 배수이지만, 100의 배수이기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.

www.acmicpc.net

 

더보기
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Integer A;
        Scanner sc = new Scanner(System.in);

        A = sc.nextInt();

        if(A % 4 == 0 && A % 100 != 0)
            System.out.println(1);
        else if(A % 400 == 0)
            System.out.println(1);
        else
            System.out.println(0);
    }
}

조건 1. 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력
조건 2. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때

코드 분석

  1. A변수를 선언한다.
  2. Scanner 클래스를 통해 년도를 입력받아 A에 저장한다.
  3. 조건 2에 맞춰, A를 4로 나눴을 때 나머지가 0이면서, 100으로 나눴을때 나머지가 0이 아닌 경우 체크
    1. true : 1출력
    2. false 다음 조건 확인
  4. 3번이 false 일 경우 A를 400으로 나눈 나머지가 0인 경우인지 확인한다.
    1. true : 1출력
    2. false : 다음 조건 확인
  5. 3번과 4번에 해당하지 않는 모든 경우를 윤년이 아니라고 판단하여, 0을 출력한다.

 

개인적으로 조건문을 익히는데 윤년 문제와, 각 월 마다 28일, 29일, 30일, 31일 인지 체크하는 문제가
최고라 생각한다. 

+추가

나는 고1 부터 프로그래밍을 시작했다. C언어로 시작했고, 당연히 대학교 입학해서도 나는 코딩을 잘 하는 편에
속했다. 하지만 군 전역 후 개발자에 대한 꿈이 접혔다가 같이 개발자를 준비했던 친구의 도움으로
다시 개발자의 길을 걷게 되었다. 

입대 부터 전역까지 3년을 프로그래밍을 쉬었더니 아무것도 못하는 상태가 되어있었다. 
조건문 이후로는 기억에 아무것도 없었다.

하지만 다시 개발자의 길을 걷고자 돌아온 학교였기때문에, 열심히 해야했다.
선배님 께서 권해주신 알고리즘 스터디에 참여하여 공부를 하였고, 지금 이 포스팅도 내 복습 겸
그 때 받은 가르침을 나처럼 개발자를 희망하는 분들에게도 알려주고 싶어 포스팅을 하고있다.

동아리에서의 실력은 당연히 바닥을 쳤고, 나는 물어보는 입장밖에 안됐다.
이 때 멘탈이 진짜 박살이 났었다. 그래도 1학년 때는 과에서 프로그래밍 하나는 꽉 쥐고 있었고,
복학해도 당연히 나는 상위권을 예상했다.

하지만 매일 공부 시간을 계속 늘렸고, 모르면 물어보기 보단 직접 찾아보는 방법을 선택했다.
내 기억으론 프로그래밍 실력이 가장 많이 늘었던 시기라 생각한다.

멀리 돌아오긴 했지만.. 여기서 하고싶은 얘기는 문제를 못 풀었다 해서 너무 좌절하지 않았으면 한다.
아니, 좌절하고, 그것 때문에 멈추지 않았으면 좋겠다. 

"나를 죽이지 못한 모든 시련은 나를 한층 더 강하게 만든다. 살아있는 한, 나는 점점 더 강해질 것이다."
- 니체

 

반응형

관련글 더보기

GitHub 댓글

댓글 영역