배움 __IL/TIL 1기

TIL : 6번째- 221206 [12-1-화]

Mo_bi!e 2022. 12. 6. 21:53

※ Keep in mind

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

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

 


I. INTRO : 흐름

- 지난 시간 복습 (flow 이해)

컴퓨터 프로그래밍 > 자바이용 > 왜 자바이용 > 번역기를 이용 > 자바번역기의 특징(자바의 원래 목적) > 번역기로 컴파일러 사용이유 > OS 이용하지않고 자바플랫폼 이용 이유 > 이것을 이용해서 프로그램을 만듬 > 프로그램은 언어 플랫폼으로 나누어짐 > 언어는 장치에 준해서 이용함 >

 

언어가 가진 능력은 어떤 장치가 가지고있는 능력으로 개발하는가 (CPU, 메모리) > 언어만 가지고 프로그램해도 계산만 할 수있음 > 이경우 입출력장치가 필요하다 > 입출력장치는 간접적으로 사용하는데 간접사용위해 함수로 이용하는데 이것이 인터페이스 > 인터페이스로 API 이용 > 플랫폼 기능많이 알수록 풍성한 프로그램 만들기 가능

 

언어의 4대 필수범주 > 값 / 연산자 > 파일,콘솔 다루는 API 다룸 (왜 지금? 연산하기 위한 코딩을 스스로 하고 결과를 보기 위해서 입출력을 먼저 붙여줌) > 파일,콘솔 입출력 두가지로 언어를 마스터하고 > 이후 언어를 마스터 함

 

 

II. 콘솔출력하기

1. 실습

// :

/* */ :  코드 사이에도 넣을 수있다.

 

2. 문자열 출력

System.out.write(3); 

는 스트림에 넣을 때 계속된 반복을 여러번 해야한다.

우리는 그래서 실제로 문자열 출력함수를 이용한다.

 

"Hello" 를 write()를 하면 한글짜씩 5번을 반복해야한다.

이를 반복해주는 함수가 있어서 이 함수를 쓰면된다.

 

(1) PrintStream과 객체 생성

 

System 클래스에 out이라는 객체에 write, print() 등의 함수가 있다

 

system.out > print() > write(), flush()

이 순서로 해서 print(65) > write(6) write(5) 이렇게 된다.

 

System.out = new PrintStream(new outputStream());

  outputStream으로 받아서 응용해서 PrintStream 으로 문자열 출력한다.

 

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

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

public class FileIOAPP {
	
	public static void main (String[] args) throws IOException {
		
//		화면출력단 --------------------------------
		
		//consoleOutputStream out = new consoleOutputStream();
		// 콘솔에 해당하는 출력스트림은 만들 수 없다
		// 왜냐하면 필수 콘솔이기 떄문에,
		// 프로그램만들면서 이용되는 콘솔은 무조건 있어야하는데 만들지않아도 만들어준다.
		// 따라서 우리는 만들어주는 것을 써야한다.
		// 만들수도 있으나, 만들면 혼선이 있을 수 있어서
		
		
		//out 은 시스템에 있는 클래스파일에 별도로 있다.
		// 그래서 아래의 파일입출력과 다른방식으로 System에서 불러온다.
		System.out.write('A');
		System.out.write('B');
		System.out.write('B');
		System.out.println("HELLO");
		
		System.out.flush();
		
//		System.out.p
		
		
		// out.close(); //만들지도 않은 것을 할 수없다.
		
		System.out.println("작업관료 ");
		
		
//		파일출력단 --------------------------------
		FileOutputStream fos = new FileOutputStream("res/data.txt");
		PrintStream out = new PrintStream(fos); //위 fos를 응용하는 객체가 만들어짐
		
		fos.write('A');
		fos.write('B');
		
		fos.flush();
		out.println("Hello File"); //" " 는 문자'열'
		fos.close();
		
		System.out.println("작업관료 ");
		
	}
}

 

(2) print 매개변수 관련

 		int kor1 = 60;
		int kor2 = 80;
		int kor3 = 90;

		int total = kor1 + kor2 + kor3;
		double avg = total / 3.0;  //원래는 76점수이나 번역기가 .0을 붙여준다.
		//이경우 .0이아니라 3.0으로 나누어주면된다.
		//하지만 total연산할 때 서로 dobule(3.)과 float(total) 서로 사이즈가 다르다.
		// avg 자료를 double로 바꾸어 주어야한다.
		
		
		System.out.printf("total is " + total);
		//괄호안에 변수가 사용되면 값인지, 문자인지 구별해야함
		//출력할 때 변수가 출력되는게 아니라 변수의 값이 출력이 된다.
		//변수는 값이 되고, 값을, "250"문자로 출력한다.
		
		System.out.printf("avg is %f", avg);

 

(3) 이스케이프문자 : 문자열 사이에 꽂아 넣을 수있는 명령어

이스케이프 문자

\b t n f r ` " \

 

이런 경우 문자열안에 이런애들은 '예외'적으로 포함시켜

즉 " " 는 문자열 기호인데 문자열 안에 " 를 넣는 방법

혹은 \를 별도로 넣기 위에 앞에

\를 넣고 본래 넣고자 하는 중복 기호를 넣는다

 

\n 은 뉴라인 인데

print 에다가 뒤에 ln (line 의미)를 넣어주면 된다.

 

캐리지리턴이란

가나다라마바사 다음 가 위치로 다시 가게끔 (제일 왼쪽위치로)

이경우 \n은 \r이 포함되어있다 왜냐하면 덮어쓰기가 되기 때문에

 

3. 숫자 출력

(1) 숫자를 출력하려면

 

성적출력 : 숫자 출력하기도 벅찬데, 출력포맷이 있다.....

print 에다가 f 추가해서 print + f (format)

 

엑셀의 서식과 같이 형태만 고정하고 값만 바꾸고 싶을 때!

2013 - 07 -23

ex : System.out.printf("%d - %d - %d " , 2013, 7, 23);

 

%x : 16 진수를 쓸 수 있다.

%d : 10진수 정수에 대해서

%f : 실수에 대해서

 

		System.out.println("┌───────────────────────┐"); 
		System.out.println("│                       │");
		System.out.println("│        성적 출력        │");
		System.out.println("│                       │");
		System.out.println("└───────────────────────┘");
		//출력하는 문장에 대한 내려쓰기가 포함된 상태이다.
		
		System.out.printf("국어1 : %d\n", kor1);
		System.out.printf("국어2 : %d\n", kor2);
		System.out.printf("국어3 : %d\n", kor3);
                        
		System.out.printf("총점 : %d\n", total);
		System.out.printf("평균 : %f\n", avg);
		System.out.printf("─────────────────────────");

 

4. 형식지정자 옵션

(1) 고정길이 출력하기

1) 형식 지정자 옵션을 이용한 출력

두자리수 점수(80점)가 아니라 세자리수 (100점)가 있을 때 고정길이가 필요하다

 

%d 에다가 %10d로 10칸 고정길이 해주기

%f 에다가 %6.1f 는 6칸 고정길이에 소수점 첫째자리까지 출력하기

 

 

 

5. 파일입출력의 경우

파일입출력의 경우에도 동일한 원리로 이용이 가능하다.

<코드>

		FileOutputStream fos = new FileOutputStream("res/data.txt");
		PrintStream out = new PrintStream(fos); //위 fos를 응용하는 객체가 만들어짐
		
		out.println("┌───────────────────────┐"); 
		out.println("│                       │");
		out.println("│        성적 출력        │");
		out.println("│                       │");
		out.println("└───────────────────────┘");
		//출력하는 문장에 대한 내려쓰기가 포함된 상태이다.
		
		out.printf("국어1 : %5d\n", kor1);
		out.printf("국어2 : %5d\n", kor2);
		out.printf("국어3 : %5d\n", kor3);
                 
		out.printf("총점 : %5d\n", total);
		out.printf("평균 : %6.2f\n", avg);
		out.printf("─────────────────────────");
		fos.close();
		
		System.out.println("작업관료 ");

<결과>


out.printf("%d,%d,%d\n", kor1, kor2, kor3);

(참고: 아래 csv파일로부터 ,를 기준으로 나눌 때 오류가 있었던 적이 있다.)

에서 kor 사이 콤마를 csv라고 한다.

csv (comma seperate values)

 

data.txt > data.csv

 

III. 콘솔입력하기

1. intputStream과 객체생성

키보드로 변수받는데, 키보드 직접사용하는게 아니라 콘솔입력버퍼를 이용한다

read() / skip()을 이용한다 (콘솔 입력스트림)

 

System.in

in이 객체명 / System 파일명

 

int code = System.in.read();

 

(1) System.in.read();

1) 프롬프트 위치관련

 

이 경우 대뜸 무엇을 입력할지 모르니 '라벨'을 이용해서 사용자에게 요구한다.

없으면 예의가 없다!

프롬프트가 아무것도 뜨지않고 첫 위치에 있게 됨

 

2) 입력 값 관련

는 문자하나만 읽는 녀석이여서 90을 입력하면 9만 읽음

이 경우 출력은 9의 문자가 아니라 9의 코드값 57이 출력된다.

 

특히 아래경우

		System.out.print("kor1:");
		int kor1 = System.in.read();
		System.out.print("kor2:");
		int kor2 = System.in.read();
		int kor3 = 90;

콘솔에 90 을 입력하면 따로 있어도 9와 0에 대한 값이 나오고, 두번째 입력에 대한 요구가 안나온다

왜냐하면 아직 버퍼에 9입력후 0이 아직 남아있어서

 

 

그렇다면,  세번하면은 90을 입력하면 될까?

		System.out.print("kor1:");
		int kor1 = System.in.read();
		System.out.print("kor2:");
		int kor2 = System.in.read();
		System.out.print("kor3:");
		int kor3 = System.in.read();

9 / 0 / 그리고 의문은 13이 출력된다

여기서 13은 엔터값에 대한 값이다.

9 0 enter

 

 

(2) 문자열 단위로 입력받는 응용객체

nextline() 은 라인을 통째로 읽는다.

 

new Scanner(System.in) > nextline() > read() / skip()

 

netline 친구들 : next() / nextint() / nextFloat() / nextDouble()

각각 가져올때 기능이 조금씩 다르다.

 

 

<실습>

		Scanner scan = new Scanner(System.in); //객체 선언
	 	
		System.out.println("┌───────────────────────┐"); 
		System.out.println("│                       │");
		System.out.println("│        성적 입력        │");
		System.out.println("│                       │");
		System.out.println("└───────────────────────┘");
		
		System.out.print("kor1:");
		int kor1 = scan.nextInt(); //int 로 해서 정수형태로 받아들인다.
		System.out.print("kor2:");
		int kor2 = scan.nextInt();
		System.out.print("kor3:");
		int kor3 = scan.nextInt();
		scan.nextLine(); //혹시모를 오류 방지를 위해서 비워내기 작업을 해 준다.

------

<함수>

긴코드가 무엇 어느정도 자르는것이 바람직한지 생각이 필요하다

이것에 대한 고민을 IBM 에서했다

-----

import 자동 : 컨 + 쉬 + o(영문자)

 

<지역화>

{ } : 지역화를 해서 Scanner 의 참조에 대한 변수에대한 가시영역 지정가능

영역을 넘어서도 메모리를 쓸필요가 없을 수 있다.

가시영역 / 생명주기 점에서 지역화의 장점이 있다.

 

(3) 파일(csv)입력받아서 콘솔단에다가 출력하기 ( 콘솔입력과 상관없이)

파일입력을 받은 값을 바탕으로

 

		{
		FileInputStream fis = new FileInputStream("res/data.csv"); //버퍼를 마련함
		Scanner scan = new Scanner(fis); // scan 이름 중복된다. 이경우 벽을 만드는 '지역화'가 가능 함
		
		String line = scan.nextLine(); //90,80,70 들을 읽어들임
		String[] kors = line.split(","); //세개문자를 배열 하나마다 넣는다.
		
		//그냥 kor1 에 두면 정수형이라서 에러발생한다.
		kor1 = Integer.parseInt(kors[0]); //90
		kor2 = Integer.parseInt(kors[1]); //80
		kor3 = Integer.parseInt(kors[2]); //70
		
		
		scan.close(); //얘는 수동으로 닫아주어야 > 내가 만들어서
		fis.close(); // 다른거 하기전에 1순위로 가장 먼저 해보기
		
		}

<문제점> 

csv파일은 ,를 기준으로 나누어진다

그러나 nextLine을 입력받으면 전체한줄이 읽혀서 문제가 발생한다.

 

<방법>

두가지 방법이 있다. 

csv 파일을 다른파일로 바꾸나, csv파일의 입력을 나누어서 이용하기

 

<채택>

우선 String line 에다가 scan.nextLine 까지 문자열로 모두 입력을받는다.

입력받은 line 문자열에다가 .split(",") 쉼표를 기준으로 잘라서 문자열 배열에 하나씩 대입을한다.

이후 각 배열 주소 0번째 부터 차례대로 kor1에 대입해준다

 

다만, 이 경우 kors1[0] 은 문자열인데 이를 정수형값으로 형변환해서 입력해준다.

 

 

 

<현재 상황>

연산자 피연산자 입출력 끝냄

 

 

IV. 제어구조

CPU는 계산, 흐름제어 두가지 기능을가진다

제어구조 나오면 흐름을 따라갈 수있어야한다.

1. 컴퓨터의 프로그램의 기본흐름과 그것을 제어하는 명령어의 종류

(1) 대부분의 컴퓨터 프로그램의 기본흐름 

기본적으로 컴퓨터는 일정한 방향으로 흐른다

이러한 흐름을 반복할수 있는데 이경우 반복문이라는 제어구조를 이용한다.

 

Q. if 문으로 while문 종료시키기

	Scanner scan = new Scanner(System.in);
		
		
		
		int answer = scan.nextInt();
		
		
		if(answer == 1)
			System.out.println("잘 입력하셨습니다. 반복합니다");
		else if(answer == 0)
			break;
		else 
			System.out.println("잘못 입력하셨습니다. 0 과 1을 입력해주세요 다시 입력해주세요");

 

 

 


 

 

1. 보충

(1) System.out = new PrintStream(new outputStream()); 에 대한 이해

응용받아서 문자열 출력하는 과정에 대한 이해

 

PrintStream이란?

 

기반스트림 보조스트림 두가지로 나누어진다.

기반스트림은 outputStream이다. 기반스트림은 버퍼기능이 없다. 이경우 성능차이는 상당함

버퍼를 이용한 보조스트림(PrintStream)으로 성능향상이 가능함

 

이경우 보조스트림은 자체적으로 데이터입출력을 할수있는 기능은 없음, 기반스트림을 이용해서 받아들임

 

 

(2) String / split() / Integer.parseInt() 에 대한 이해

1) String

char[]의 배열에서 더 편리한 기능(함수)를 추가한 형태이다.

 

2) split()

입력받은 문자를 특정문자를 기준으로 나누어 '배열'에 넣어서 리턴함

 

3) Integer.parseInt() 

Integer 클래스의 parsInt함수를 이용하는 방법임

이경우 '숫자'형 문자 를 받아서 문자를 숫자로 변환시켜 줌

 

2. 회고 

(1) 버퍼의 개념을 깨닫게 됨

버퍼의 필요성 속도등으로서 버퍼없이 하면은 제대로 입력도 안되고 이용의 어려움을 알게 되었음

 

(2) 기반스트림에서 보조스트림으로 이어지는 이유가 버퍼에 의한 것을 알게되었다.

 

(3) 파일입출력에 대해서 지금까지 내용이 어렵다고 생각해서 공부하는 것을 회피해 왔음

이번 기회를 바탕으로 그 흐름과 필요성을 알게되었다 향후에 제대로 공부해고싶다.

 

 

 

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

TIL : 8번째- 221208 [12-1-목]  (0) 2022.12.08
TIL : 7번째- 221207 [12-1-수]  (0) 2022.12.07
TIL : 5번째- 221205 [12-1-월]  (0) 2022.12.05
4번째- 221202 [11-5-금]  (0) 2022.12.02
3번째- 221201 [11-4-목]  (0) 2022.12.01