0404 | 자바프로그래밍_제어구조, 선택문(if), 반복문(if,while), 분기문(switch)

1. 제어구조 : 컴퓨터 프로그램의 기본 흐름. : 흐름을 다루는 사람 == 프로그래머 2. 선택문 - if, else, else if : break;를 통해 빠져나옴 3. 반복문 3-1) if : 다시 입력할 필요가 없이 조건만 확인할 때 3-2

ala-nueva.tistory.com

▲ 기존에 기본적으로 정리해둔 제어구조

 

 

 

[1] 흐름에서 빠져나오는 법

 

✅ 반복흐름을 끝내는 break;
 흐름을 건너뛰면서 계속 이어주는 continue;

 

❓ break로 빠져나올때와 return으로 빠져나올때는 무슨 차이가 있는지...?

✅ break

👉 가장 가까이에 있는 반복문을 빠져나온다. 중첩 if문일경우 가장 가까운 if하나만 빠져나올 수 있다.

 

✅ return

👉 해당 함수를 빠져나온다. 즉, 반복문을 포함하는 메서드 자체를 종료시킴.

👉 메소드 안에서 return문 뒤에 코드가 있어도 실행하지 않고 메서드 종료

👉 리턴 자료형이 없는 void method() 일때만 return; 으로 종료 가능. 

 

 

 

[2] if문과 while문의 차이
: 모든 제어에는 조건이 붙으므로 조건문/반복문은 큰 차이가 없다. 조건문이 더 특화되어있을 뿐.

if 
: 조건에 따른 실행. 참을 만났으면 실행하고 이어가거나 끝남. 단발성 조건에 적합. 즉 if를 while처럼 쓰려면 if{조건문} 구조를 여러번 복사붙여넣기 하거나, 반복횟수를 설정해줘야 한다.

while (true조건)
: 조건에 따른 반복. 참을 만나고 실행 후 조건으로 돌아감. 거짓을 만날때까지 계속 반복.
: 특정 조건을 만드려면 외부 변수를 만들어서 가져와야 하므로 그리 적합하지 않다. ▶ for문을 사용
: 필요한 조건 3가지 (시작점, 종료지점, 증감식)가 흩어져서 파악이 어렵다. ▶ for문을 사용

int i=0;
while(i<18){ // 외부 변수 끌어오게 됨
 i++;
 System.out.println("출력");}

 

 

 


 

 


실습1 ) while문을 이용해 이미지 파일 복사하기

: 이미지의 바이트값을 그대로 복사해와서 동일한 이미지파일 만들기

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Program {

	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("res/pic1.bmp"); // 727,358 bytes
		FileOutputStream fos = new FileOutputStream("res/pic1-copy.bmp");

// 방법 1 -------

		int n = fis.read(); // 최초 값은 받아오고 다음 반복은 조건문 안에서 받아오는게 포인트.
		
        while (n != -1) { 
			fos.write(n);
			n = fis.read();
		}
        
//------------------

// 방법 2----------

		int n = -1;

		while ((n = fis.read()) != -1)
			fos.write(n);

//------------------

		fis.close();
		fos.close();

		System.out.println("작업완료");
	}

}

// 잘못된 코드
// 초기화에서 read()를 읽어올경우 while문 안에서 두번째 read()를 가지고 시작하므로 이미지생성이 되지 않는다.

		int n = fis.read();
		
        while ((n = fis.read()) != -1) { 
			fos.write(n);
			n = fis.read();
		}

 

 

 

실습2 ) 조건문을 이용해 텍스트 마지막열 안나오도록 하기

 

<문제점>

 

: 조건문 없이 scan 값을 println()으로만 출력할 경우 가장 마지막줄이 개행된 상태로 저장된다.

👉 용량이 2바이트 차이나서 동일하게 복제 되었다고 볼 수 없다

👉 조건문을 통해 마지막줄 형태를 지정해준다

 

while (fscan.hasNext()) {
			
    String line = fscan.nextLine();
    fout.print(line);

    if(fscan.hasNext()) { // true값이 반환되면 println()을 출력한다.
        fout.println();
    }
}

 

 

연습1) 오답 정리

❣ 생각의 오류

: 원래 생각했던건 fscan.nextLine()의 String을 읽어와서 null이면 조건문에서 break; 하도록 작성했었는데, 계속 읽을 element가 없다는 오류가 떴었다. 아예 다음 요소 자체가 없으니 읽어올 값이 없고, 그러니 null 체크도 불가한거였다.

 

❣ 정리

:  hasNext()는 T/F를 반환하므로 boolean값을 가지고 조건문에 넣어서 다음 라인의 유무를 판단 후, 읽어오도록 한다.

while(fscan.hasNext()) {
    String name_ = fscan.nextLine();

    String name = (2 <= name_.length()) && (name_.length() <= 3) ? name_ : "오류";

    if (false == fscan.hasNext()) { // 더 좁은 조건을 if문에 넣어주기
        fout.print(name);
        break;

    }else{
            fout.printf("%s%n", name);
        }
    } // while ends

 

 

 


 

 

 

[3] for문

for (변수선언; 조건문; 증감문){

//반복되는 수가 한 눈에 파악 될 수 있도록 하기 - 그래서 0으로 시작하고 1씩 증가시키는 것.

}

//while문으로 반복 횟수가 정해진 반복문 표현하기
int i = 0; // --- 변수 시작점
while (i < 18) { // --- 반복 조건
    fis.read();
    i++; // --- 증감식
}
		
//for문으로 변경
for(int i=0; i<18; i++) { // 한줄에 표현 가능
    fis.read();
}

 

 

+ Recent posts