배움 __IL/TIL 1기

TIL : 7번째- 221207 [12-1-수]

Mo_bi!e 2022. 12. 7. 21:52

※ Keep in mind

 본 내용은 웹개발과정의 강의 중 내용을 복습을 위해서 메모한 것에 불과한 것입니다. 이러한 연유로 강의내용을 오인한 나머지 오기재 및 불기재가 있을 수 있으니 '참고'만 해주시길 바랍니다. 저의 경우에도 본 내용을 단순히 읽은 것이 결코 저의 것이라고 생각하지 않습니다. 본 내용은 복습를 위한 초기 내지 중간 과정에 불과한 것이고, 이후에 내용을 보충 후 인출 및 설명하기 과정이 있어야 비로소 복습의 단추가 어느정도 마무리 되어간다고 볼 수 있습니다.

 따라서 당초에 본 내용은 비공개였습니다. 그럼에도 불구하고 본 내용을 공개한 점은 함께 공부하는 동료들과 나눔을 바탕으로 배움과 성장의 공진화라는 소기의 목적을 달성에 어느정도 도움이 될수 있기 때문이라고 생각합니다.

 

I. git page

 

 

II. INTRO : 지난 시간 복습

4가지 범주 > 연/피연산자 > 입출력위해 콘솔API, 파일API사용 > 사용방법 비슷 > 버퍼란 개념 사용 > 버퍼란 것의 스트림객체 이용 > 문자단위보다 문자열단위로 이용 > 문자열단위 출력,입력시 이용되는 문자열객체 > printstream() & Scanner()

 

이후 절차, 흐름 작성

 

 

III. 제어구조

1. 반복문과 조건문 (조건처리 최소화 해보자)

(1) 조건문

조건문 안에 조건식이 많을수록 좋은코드라고 보기는 어렵다.

 

(2) 반복문

1) while

반복문 while 안에는 이미 조건문이 있다.

while(true) 괄호 안 조건이 참일 때 반복이 계속되는 것으로서, 이 경우 초기 세팅값을 잡아주고 실행하면 된다.

 

결국 이 경우 굳이 조건문을 추가로 쓸 필요가 없다.

 

		int answer = 1; //초기 true 값 세팅
        				//만약 최초에 값을 선언하지않으면 "쓰레기값"이라고 한다
		
		while(answer == 1) { //괄호 안이 조건문
        
     	   }

 

<참고>

scan.nextInt(); 의 경우 문자가 들어가면 오류가 발생한다.

버그를 내포하고있음.

 

이경우 실제 개발에서는 숫자로 받지않고, 문자로받아서 spilt()으로 분리 후 정수화(Integer.parseInt)해서 대입한다.

 

2) do - while

		//형태 1 (while)
        
     	 	System.out.print("국어1:");
			kor1 = scan.nextInt();
			while(kor1 < 0 || kor1 > 100 ) {
				System.out.println("점수를 100까지만 입력해야합니다 \n 다시 입력해주세요");
				System.out.print("kor1:");
				kor1 = scan.nextInt();
			}
			
            
           //형태 2 (do - while)
			do {
			System.out.print("국어2:");
			kor2 = scan.nextInt();
			
			if(kor2 < 0 || kor2 > 100 )
				System.out.println("점수를 100까지만 입력해야합니다 \n 다시 입력해주세요");
			}
			while(kor2 < 0 || kor2 > 100);
            
            //형태3 (while & if문)
			while(true) {
			System.out.print("kor3:");
			kor3 = scan.nextInt();
		
			if(kor3 < 0 || kor3 > 100 )
				System.out.println("점수를 100까지만 입력해야합니다 \n 다시 입력해주세요");
			else break;}
			}

 

while문을 하면은 '입력'을 두번하게 되어서 중복이 되게된다 이런경우 굳이 두번입력하지않고, 먼저 실행(do)시키고 이후에 조건(while 조건)이 맞으면 반복하게끔 하는 방법으로 do-while문을 이용이 가능하다.

 

<참고>

 복붙한 코드에 변수명을 고치는 경우 몇가지 놓치는 경우가 있다. 유의해야한다.

 

2. 메뉴 출력

(1) if문

반복할 때 마다 모든것이 아니라 사용자가 원하는것만 출력하기 위하게끔 해야한다

이경우 메뉴 출력하게 해야함

 

<참고>--

응용프로그램 개발의 중요한 점은 지역화이다. 

왜냐하면 내가 사고, 생각범위가 넓어지면(지역화X)이면 복잡해진다

하고자하는 범위 안에서만 생각해야지 마음에 놓인다.

특히 유지보수를 유용하게 하기위해서...

다만 알고리즘의 경우 효율성을 따지면 지역화와 거리가 어느정도 있을 수있다.

---

(2) 조건문과 반복문 + continue

if 만 여러개이면 if한번 조건만족하면 끝내야하는데, 굳이 계속해서 확인한다. (if-else를 쓰지 않는경우)

우리는 '흐름'을 만드는사람으로서 바람직하지않다.

5개중 하나만 선택인데 배타적실행이 필요하다

 

이경우 continue를 이용하면 반복문 블록내 현재위치에서 반복문 시작점으로 이동한다

(더이상 continue 아래의 코드내용 유무와 관계없이)

 

이러한 경우 외에도 else if / else / switch 문 세가지를 이용이 가능하다.

 

				if(menu == 3) { //3. 파일 성적 입력
//				파일 입력블록
				{
					FileInputStream fis = new FileInputStream("res/data.csv"); //버퍼를 마련함
					Scanner scan = new Scanner(fis); // scan 이름 중복된다. 이경우 벽을 만드는 '지역화'가 가능 함
					System.out.println(scan);
					
					String line = scan.nextLine(); //90,80,70 들을 읽어들임
					System.out.println(line);
					String[] kors = line.split(","); //세개문자를 배열 하나마다 넣는다.
					System.out.println(kors);
					
					//그냥 kor1 에 두면 정수형이라서 에러발생한다.
					kor1 = Integer.parseInt(kors[0]); //90
					kor2 = Integer.parseInt(kors[1]); //80
					kor3 = Integer.parseInt(kors[2]); //70
					System.out.println(kor1);
					
					
					scan.close(); //얘는 수동으로 닫아주어야 > 내가 만들어서
					fis.close(); // 다른거 하기전에 1순위로 가장 먼저 해보기
					continue;
                    //본 continue가 있게되면 3번째 메뉴라고 하더라도 
                    //아래쪽 4번 5번을 더이상 읽지 않게된다.
					}
			}

 

 

 


금일 코드 마무리

//저작자 : 모
//저작일자 : 2022-12-06

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class FileIOAPP {
	
	public static void main (String[] args) throws IOException {
		
		int kor1=0 , kor2=0 ,kor3=0;
		
		
		int answer = 1; //
		
		while(answer == 1) {
		
			int menu;

			{
			Scanner scan = new Scanner(System.in);
			
			
			System.out.println("┌───────────────────────┐"); 
			System.out.println("│                       │");
			System.out.println("│        메뉴 입력        │");
			System.out.println("│                       │");
			System.out.println("└───────────────────────┘");
			
			System.out.println("1. 콘솔 성적 입력");
			System.out.println("2. 콘솔 성적 출력");
			System.out.println("3. 파일 성적 입력");
			System.out.println("4. 파일 성적 출력");
			System.out.println("5. 종료");
			System.out.print(">");
			
			menu = scan.nextInt();
			}
			
			System.out.println("1번검사");
			if(menu == 1) { //1. 콘솔 성적 입력

//				콘솔입력블럭
				Scanner scan = new Scanner(System.in);
				
//				화면출력단 --------------------------------
				System.out.println("┌───────────────────────┐"); 
				System.out.println("│                       │");
				System.out.println("│        성적 입력        │");
				System.out.println("│                       │");
				System.out.println("└───────────────────────┘");
				
					//형태1
					System.out.print("국어1:");
					kor1 = scan.nextInt();
					while(kor1 < 0 || kor1 > 100 ) {
						System.out.println("점수를 100까지만 입력해야합니다 \n 다시 입력해주세요");
						System.out.print("kor1:");
						kor1 = scan.nextInt();
					}
					
					//형태2
					do {
					System.out.print("국어2:");
					kor2 = scan.nextInt();
					
					if(kor2 < 0 || kor2 > 100 )
						System.out.println("점수를 100까지만 입력해야합니다 \n 다시 입력해주세요");
					}
					while(kor2 < 0 || kor2 > 100);
				
					//형태3
					while(true) {
					System.out.print("kor3:");
					kor3 = scan.nextInt();
				
					if(kor3 < 0 || kor3 > 100 )
						System.out.println("점수를 100까지만 입력해야합니다 \n 다시 입력해주세요");
					else break;}
					
			
					}
			
			System.out.println("2번검사");
			if(menu == 2) { //2. 콘솔 성적 출력
				//아래는 콘솔출력부분임
				{
				int total = kor1 + kor2 + kor3;
				double avg = total / 3.0;  //원래는 76점수이나 번역기가 .0을 붙여준다.
				
				
				System.out.println("┌───────────────────────┐"); 
				System.out.println("│                       │");
				System.out.println("│        성적 출력        │");
				System.out.println("│                       │");
				System.out.println("└───────────────────────┘");
				//출력하는 문장에 대한 내려쓰기가 포함된 상태이다.
				
				System.out.printf("국어1 : %5d\n", kor1);
				System.out.printf("국어2 : %5d\n", kor2);
				System.out.printf("국어3 : %5d\n", kor3);
		                        
				System.out.printf("총점 : %5d\n", total);
				System.out.printf("평균 : %6.2f\n", avg);
				System.out.printf("─────────────────────────");
				                
						
				System.out.println("작업완료 ");
				
				continue;
				
				}
			}
			System.out.println("3번검사");
			
			if(menu == 3) { //3. 파일 성적 입력
//				파일 입력블록
				{
					FileInputStream fis = new FileInputStream("res/data.csv"); //버퍼를 마련함
					Scanner scan = new Scanner(fis); // scan 이름 중복된다. 이경우 벽을 만드는 '지역화'가 가능 함
					System.out.println(scan);
					
					String line = scan.nextLine(); //90,80,70 들을 읽어들임
					System.out.println(line);
					String[] kors = line.split(","); //세개문자를 배열 하나마다 넣는다.
					System.out.println(kors);
					
					//그냥 kor1 에 두면 정수형이라서 에러발생한다.
					kor1 = Integer.parseInt(kors[0]); //90
					kor2 = Integer.parseInt(kors[1]); //80
					kor3 = Integer.parseInt(kors[2]); //70
					System.out.println(kor1);
					
					
					scan.close(); //얘는 수동으로 닫아주어야 > 내가 만들어서
					fis.close(); // 다른거 하기전에 1순위로 가장 먼저 해보기
			
					}
			}
			System.out.println("4번검사");
			if(menu == 4) { //4. 파일 성적 출력
//				파일출력단 --------------------------------
				{
				FileOutputStream fos = new FileOutputStream("res/data.txt");
				PrintStream out = new PrintStream(fos); //위 fos를 응용하는 객체가 만들어짐
				
				out.printf("%d,%d,%d\n", kor1, kor2, kor3);	
				
				fos.close();
				
				System.out.println("작업관료 ");
				}
				
			
			}
			
			System.out.println("5번검사");
			if(menu == 5) { //5. 종료
				System.out.println("프로그램을 종료합니다.");
			}
			
			
			
	
		
		
		
		
		
//		---------------------------------------

		
		
//		--------------------------------------
		
		//파일저장 블록

		
		
		{
//		반복문 중지 관련 단
		
		
		//사용자에게 계속할지 유무를 answer에 입력 받는다.
		//계속하시겠습니까 계속1 / 종료 0
		System.out.println("계속하시겠습니다? (계속:1 / 종료 :0)");
		Scanner scan = new Scanner(System.in);
		
		answer = scan.nextInt();
		
		//만약에 그 answer의 값이 0이면 벗어나게한다.
//		if(answer == 1)
//			System.out.println("잘 입력하셨습니다. 반복합니다");
//		else if(answer == 0) {
//			
//			//---------------장난만들기 
//			// 는 아래로 보냄 ( 이유: 조건식이 많을수록 좋은코드라고 보기는 어렵다.
//			
//			break;
//			} //들여쓰기를 해서 종속절이 무엇인지 구분이 필요하다.
//		else {
//			System.out.println("잘못 입력하셨습니다. 0 과 1을 입력해주세요 다시 입력해주세요");
//		}
		
		
		}	
		
		
		
		
		
		
	}for(int i = 0 ; i < 5 ; i++) {
		System.out.printf("Bye Bye my blue %d \n", i+1);
		try {
			Thread.sleep(500); // 0.5초씩 딜레이 주기
		}catch(Exception e) { //예외처리
			System.out.println(e); 
		}
		
	}}}

 

 


1. 보충

(1)  do - while

 

while문의 변형형태이다. 조건식과 블럭식의 위치를 서로 바꾼것이다.

블럭을 먼저 수행 후 > 조건식을 평가하는 방식이다

 

따라서 while의 경우 블럭이 한번도 실행되지 않을수도 있으나,

do-while의 경우 최소한 한번이상은 실행하게된다.

 

(2) break  VS continue

break 의 경우 가장 가까운 반복문을 벗어나서 더이상 반복하지 않는것이라면

continue의 경우 반복문을 벗어나지 않고 다음 반복을 다시수행하는 것이다.

 

 

2. 회고 

(1) 제어구조에서 반복문과 조건문은 '하나의 범주'라는 것을 직접 체감하게 되었다.

나의 경우 while 을 이용할때는 무한loop를 돌리고나서 그 while 블럭안에서 조건 충족시 break 를 작동하는 방식으로 했다. (위 방식1번)

하지만 while의 조건만으로도 충분히 가능하고, 조건은 가급적 덜쓰는것이 바람직한 방식이라는 것을 이해를 넘어 '체감'하게되었다.

 

(2) 상술한 느낀점에 한발짝 더 나아가면 'do-while' 문의 필요성도 체감하게되었다.

앞서 무한loop안에 if조건문을 이용하는 방식보다 do-while문이라는 더 바람직한방식에서 깨달았다.

 

(3) 한편 continue의 경우에도 확실히 이해가 가능해졌다

continue 에 대해서 한번도 필요성을 느낀적이 없었는데, else-if를 쓰지않은 상황에서 반복문을 끊어내고 처음으로 돌아가는 방식에 대해서 이해할수 있게되었다.

 

 

'배움 __IL > TIL 1기' 카테고리의 다른 글

TIL : 9번째- 221209 [12-1-금]  (0) 2022.12.09
TIL : 8번째- 221208 [12-1-목]  (0) 2022.12.08
TIL : 6번째- 221206 [12-1-화]  (2) 2022.12.06
TIL : 5번째- 221205 [12-1-월]  (0) 2022.12.05
4번째- 221202 [11-5-금]  (0) 2022.12.02