배움 __IL/TIL 1기

TIL : 5번째- 221205 [12-1-월]

Mo_bi!e 2022. 12. 5. 21:47

※ Keep in mind

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

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

 


 

용어 하나하나의 의미와 그것을 사용해야 하는 이유
 즉, "필요성에 대한 개념"을 설명해주는 부분을 놓치지 마세요.

1. 무엇을(What) 배우게 될 것인가
2. 왜(Why) 그것을 배워야 하는가 그리고 그것의 장/단점은 무엇인가
3. 그럼 그것을 어떻게(How) 사용하면 되는가

 

I. 지난시간 복습

1. INTRO : 물음

자바가 쓰는 API 플랫폼

 

자바언어로는 계산만 가능 / 원하는것 얻기위해 플랫폼 필요 /

 

1. 번역기문제

자바는 기본이 인터프리터를 쓴다. (ZIT 커파일러)

 

인터프리터 : 그때마다 실행(실행기) (-  속도가 느림 / 따라서 반만번역하는 코드를 이용한다 : 중간코드)

컴파일러 : 번역만 하기(번역기) 

 

왜 인터프리터 기반인가? 아무대나 사용하기 위해서.

다양한 기계에서 이용하기위해서는 API가 단일해야한다.

 

2. 자바 언어의 특징

1. 자바의 4가지 구성요소

연산자 / 피연산자(값) / 제어문/ 배열

 

2. 피연산자

정수, 실수

 

-정수 사이즈별 선언?

short / int / long 

 

-실수 사이즈별 선언?

float / double

 

II. 콘솔출력과 문자코드

0. 피연산자 (값)

지난시간

1. 콘솔 입/출력과 문자코드

(1) 시작 

IO -[버퍼]-> 메모리 -> 모니터

 

여기서 버퍼는 왜?

네트워크가 일정한 속도로 보내줄수있다면 필요없으나, 네트워크는 비일정

이때 여분을 둔다.  [적재공간 : like 연탄 전달해서 받기전까지!]

결국 속도차이가 날때 안정적으로 보내기 위한 임시 휴게공간

키보드꺼 다 받아쓰기 어렵기때문에

 

버퍼링을 가능하게 하는 공간 : 버퍼

 

키를 식별하는 코드 : 키코드 (코드 : 사물등을 기호화)

 

so 만약 2 를 누르면 2에대한 keycode(ex : 50) 를 누른다.

 

(2) 유니코드 테이블

키코드처럼 문자를 식별하는 번호를 정의 하고 문자를 보내야겠다

'통신에서 문자를 사용하기 위해서' ASCII 코드를 만들었다.

 

아스키코드는 128보다 하나 적기때문에 127이다 따라서 7bit이다

하나를 더 표현해서 8bit == 1byte code 이다.

 

ASCII + KR(EUC -KR)

ASCII + JP(EUC -JP)

ASCII + CN(EUC -CN)

이렇게 추가로 다른나라 언어(EUC)를 넣는다.

 

그러나 최근 EUC를 안쓴다. 왜냐하면 KR의 코드가 다른 JP CN으로 가면 다른것으로 표현이 된다

그리고 한일 같이 표현을 할 경우도 있다.

즉 번호 대 다른 글짜를 쓸 경우 한 게시글에 두가지언어를 같이 쓸수없다.

따라서 충돌되지 않게끔 UNICODE를 이용한다.

 

ASCII + KR + JP + CN [유니코드 테이블] : 충돌없이 모두 표현할수 있게끔 하기

 

각국의 언어가 한테이블에 표현되게끔 한다.

 

(3)문자출력

System.out.write(3);

 

여기서 3을 출력하기 위해서는 3이라는 문자표를 써야한다.

System.out.write(51);

 

3은 코드

'3'은 3에대한 코드값을 알려준다. == 51 알려줌

 

public class Deploy {
	public static void main(String[] args) {

		int x = '1'; 
		int y = 1;
		
		System.out.println("\n\nx "+x); //49
		System.out.println("\ny "+y); // 1
	}
}

문자는 char에 별도로 담아서 쓴다.

char 는 2byte크기의 데이터 형식이다.

 

char 을 선언해서 'A'를 선언하면 그대로 A가 나온다

char x = 'A';

 

피연산자는 정수 실수 문자 부울

 

III. 연산자

1. 산술 연산자

나머지 연산자 / 연산자와 자료형 / 연산자 우선순위

 

1) 나머지 연산자

몫 외 남는 부분있을 때

 

나머지 언제 주로 씀?

실제로 나눗셈은 실수끼리 일 때 쓰고

나머지는 정수 일 때 쓴다

 

- 나머지 연산자 사용 예

사과를 나누어 주기

 

2) 연산자와 자료형

 

10 / 3

10 / 3.0 -> 모든 연산은 같은 자료형끼리 해야한다. (오류발생 할 수있음 : 번역기가 중대한 하자 치유 [비정상임])

 

정수끼리 나눗셈 연산 시 몫이 나온다

이경우 나머지가 필요하다

 

3) 연산자 우선순위

+-   / () 등의 차이 분별

 

		System.out.println(++i); //6
		
		System.out.println(i++); //6
		
		i++;
		System.out.println(i);
		
		
		System.out.println(i);
		i++;

 

증가 연산자 순서

package test;

public class test {

	public static void main(String[] args) {

		
		int i = 3;
		
		i++; //4
		
		System.out.println(i); //4
		
		++i;
		
		System.out.println(i); //5
		
		
		////////////
		
		System.out.println(++i); //6
		
		System.out.println(i++); //6
		System.out.println(i);
		
		i++;
		System.out.println(i); //8
		
		
		System.out.println(i); //8
		i++;
		
		System.out.println(i); //9
		
	}

}

2. 비교 / 관계 연산자

(1) 연산자

 

1) == / != / > / >= / < / <=

 

2) && / ||

 

(2) 관계연산자를 사용한 비교연산

 

-2 < x  ≤ 2

이거는

code : (-2 < x) && (2 >= x)

할수있다

 

3. 비트 연산자

& :  비트 교집합 연산자

| : 비트 합집합 연산자

^ : 비트 차집합 연산자  (차이가 나는 집합)

~ : 비트 부정 연산자

 

ex) 3 & 7 -> 0011 & 0111 -> 0011

ex) 3 | 7 -> 0011 | 0111 -> 0111

ex) 3 ^ 7 -> 0011 ^ 0111 -> 0100

ex) 7! -> 0111 -> 1000

 

<< : 왼쪽 쉬프트연산자 

>> : 오른쪽 쉬프트 연산자

 

ex) (3 << 2) -> (0011 << 2) -> (1100) -> (12) 

ex) (3 >> 2) -> (0011 >>2) ->  0000 -> (0)

 

이는 비트끼리 연산이 필요할 때 쓴다

정수 실수끼리 연산할 때 너무 커서 작은단위로 쪼개서 써야할 때가 있다.

주로 메타데이터를 이용할 때 쓴다.

 

메타데이터 : 

ex : jpg 는 압축하고있는 이미지 포맷이다.

압축하기 위해서 사용하기 위한 방식이나, 압축데이터 어디있는지 심어주어야한다.

파일에 대한 데이터 설명하는 헤더가 메타데이터이다.

이 경우 헤더를 줄여야한다. 헤더를 줄이기 위해서 정수를 안쓴다.

 

즉 

pos = 7;

ㅁㅁㅁㅁㅁㅁㅁㅁ | ㅁㅁㅁㅁㅁ***

           x                 |              y

 

이경우 y만 쓰고 x 가 비어있음

x를 y에 밀어넣고 y에 값 넣기 

pos = 7<<8; (밀어넣기)

ㅁㅁㅁㅁㅁ* * * | ㅁㅁㅁㅁㅁㅁㅁ

 

이후 y값넣기할 때

pos = 5 하면 그대로 덮어짐

따라서 

pos = pos | 5;

참만 연산이 되어서 심기 가능

 

ㅁㅁㅁㅁㅁ* * * | ㅁㅁㅁㅁㅁ*ㅁ*

           x                 |              y

 

 

4. 복합 대입 연산자

+= / -=  / *= / (/=) / %= / &= / |= / >>= / <<=

~~후 대입

 

IV. 입출력도구

1. 플랫폼

API를 다룬다는 것이고 곳 함수를 쓴다는 것을 의미함

 

입력 : 귀 / 계산 : 머리 / 출력 : 입

입력 : 키보드 (필수콘솔)

 

키도브 , 보조기억, 네트워크 입출력방식은 모두 같다.

 

(1) 객체지향에서는 함수가 객체라는 구조에 포함되어있다.

 

함수는 객체지향 방식으로 한다

 

out.write(30); // 시스템의 출력스트림을 out(객체).(로) 출력하다.

in.read(); //시스템의 입력스트림 in(객체).(로)부터 읽어오다.

 

여기서 객체란

자바는 모든 함수를 묶어놓는 도구가 있다.

함수는 API 를위해서도, 코드를 나누기 위해서 사용되기도 한다.

 

함수는 캡슐화 되어있다.

함수 묶는 도구가 캡슐이다.

 

(2) 출력스트림이란

코드는 버퍼로 간다.

 

출력할 때 결과물은 바로 모니터로 안간다

버퍼를 이용한다.

 

동기화 <-> 비동기화

동기화?

문서 하나를 둘이서 같이 작업 시 각 디자이너, 문서편집자

디자인 편집 시 나머지 하나는 기다림

그 디자이너가 결과물 줄때 편집시 디자이너 기다림 (서로 바톤터치)

서로를 '동기적으로 일한다' == '순서' & '기다림(순서가 아닐 때)'

 

결재시 부장이 자리를 안비움, 그러나 다른사람 결제중 기다림 뒤에도 기다림 (동기적으로 일처리)

순서가 없음 = 비동기 =기다림이 없다.

프로세스 100개가 자기순서 기다리면서 하나만 일하는 것은 바람직 X (동기화 최악, 성능을 떨어드림)

 

비동기화를 가능하게 하는 방법 : 결제'함(box)' 두고 안기다리고 자리에 나두고 감

 

 

CPU메모리(대리) -(결재)> 모니터(부장)

동기화 : 줄을 선다.

이경우 동기화 막기위해 '결제함' 두는데 이거를 '버퍼'를 둔다. (동기를 비동기로 하기위한 방법)

 

 

자바에서는 '출력버퍼'라기 보다는 '출력스트림' 이라고 한다.

물은 위에서 아래로 (단방향)으로 흐른다.

스트림 버퍼는 방향을 표현하고싶어한다.

 

write()를 써서 출력버퍼(outputstream)공간에 쓴다.

 

함수는 대상, 주체가 있고 그것을 바탕으로 일한다. (은는이가 == 개체 == 함수를 묶는 중심)

OOP = 객체를 중심으로 함수를 묶었다.

 

--------------------------------------------------

 

<순서 flow>

app -> java platform -> OS -> 장치드라이버

 

<app 에서>

이경우 콘솔뿐만 아니라 파일을 쓸 때도 버퍼를 쓴다.

new FileOutputStream()

하지만 이경우 어떤것인지 소유격이 부족함

대상없이 함수를 쓸 수없다.

 

FileOutputStream fos = new FileOutputStream()

fos로 이름을 만들어 준다.

자바의 방식으로 무슨이름인지 지정해준다.

이후 fos로 불러준다. 이를 참조라고한다.

 

이경우 참조는 주소(자바는 포인터 개념X)가 아니라 이름을 의미한다.

이름은 객체에 붙여준다.

 

 

FileOutputStream fos = new FileOutputStream()

fos.write(65);

fos.write(66);

 

이렇게 버퍼에 'A' 'B' (각 65, 66)를 넣어주고 다 차기 전까지는 저장장치에 가지 않는다.

왜냐? 효율성을 위해서 (비어서 가기에는 비효율적)

 

이 경우

<java platform>

write();

flsuh(); 

에서 내린다. 꽉 안차도.

 

이경우 자바플랫폼은 돼지코이지 구동할 능력이 없다. 이경우 windonw API (OS) 를이용한다

window API로 장치 드라이버를 이용한다.

 

 

APP > 자바플랫폼 >  윈도우API > 장치드라이버

이경우 한단계 더 거쳐서 가서 느릴 수 밖에없다.

따라서 업무용이지 게임용으로는 부적절하다.

 

(3) 개체(Entity/Class)와 객체(Object)

현실 : 개체란 객체의 type이다. (고양이 : 병국이)

음식점에 메뉴판은 실존하지 않는다. 이경우 주문하면 음식실존한다.

 

k5 개체중 나의 k5는 무엇?

같은 개체(k5) 중 다른차와 식별할수 있는 이름이 객체이다.

new 하면 실존하는 객체이고 이름을 붙여주어야한다.

 

 

class 에 new연산자 쓰면 되고, 여기에 이름을 붙여주면 이것이 참조(변수)이다.

 

(3) 실습 (아래 사항 암기 요망)

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

public class FileIOAPP {
	public static void main(String[] args) throws IOException { //throws 추가해줌
		
		//new FileOutputStream("D:\\Workspace\\data.txt"); 
		//출력할 떄 사용하는 스트림 객체

		FileOutputStream fos = new FileOutputStream("res/data.txt"); //상대위치를 이용한다.
		//fos를 쓰고 앞에 변수 선언하듯이 형식명을 넣어준다
		//즉 빈통 준비하기
		
		fos.write('A');
		fos.write('B');
		fos.write('B');
		// 각각 드럼통에 쏴주기
		fos.flush();
		// 내려보내기
		// 이 경우 flush 안해도 자동으로 된다 ( 그 이유는 main 함수가 끝날 때 자동으로 해준다)
		
		fos.close(); // 다썻으면 해주어야한다
		// 안하면 스스로 정리해야하는데, 시간이 갭이 있다.
		// 언제 찾아가는지 몰라 기다리다가 지우는데, 기다리는 시간이 하부시스템의 시간을 잠식하게 된다.
		
		System.out.println("작업완료");
		
		
	}
}

 

 

 

 

 

 

 


 

1. 보충

(1)

 

 

 

 

2. 회고 

(1) 버퍼에대한 그 이유와 용례(출력스트림)에대해서 이해할 수있었다.

 

(2) API를 이용한다 함 그리고 이는 함수를 이용한다는 것이고 함수의 두가지 갈례를 이해할수 있다.

 

(3) 클래스에 대한 객체를 선언하고, 객체에 대한 참조와 함수 접근을 이용한 용례를 알 수 있다.

 

(4) 동기화 비동기화 그리고 연장선에서 버퍼의 선을 알 수있다

 

 


 

<팀플레이>

 

간접적 

독립적 호환성

 

why : 윈도우 API를 이용하지 않고 굳이 자바API를 이용하는가?

 

A : 윈도우를 API를 직접적으로 사용하기에 무리가 있기때문에 (디바이스, os,  간의 의존성을 줄이고, 호환성을 높이기위한 연유로)이다. 이 경우 자바 언어를 이용해서 자바플랫폼을 작동시키는데 이 경우 간접적으로 사용한다.

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

TIL : 7번째- 221207 [12-1-수]  (0) 2022.12.07
TIL : 6번째- 221206 [12-1-화]  (2) 2022.12.06
4번째- 221202 [11-5-금]  (0) 2022.12.02
3번째- 221201 [11-4-목]  (0) 2022.12.01
2번째- 221130 [11-4-수]  (1) 2022.11.30