파일입출력

파일을 열고닫기

- 파일 입출력 변수는 FILE 형식의 포인터 변수로 선언한다.

- 파일을 열 때는 fopen() 함수를 이용한다.

- 파일을 닫을 때는 fclose() 함수를 이용한다.


파일 열기함수 fopen()

- fopen() 함수는 파일 경로와 접근방식을 설정할 수 있다.

- 기본 경로는 현재 프로그램의 경로이다.

- 접근방식은 아래와같다

+ r = 파일에 접근하여 데이터를 읽는다.

+ w = 파일에 접근하여 데이터를 기록한다.(파일이 이미 존재하면 덮어쓴다)

+ a = 파일에 접근하여 데이터를 뒤에서부터 기록한다.


파일 입출력함수 fprintf(),fscanf()


파일 입출력과정

- 파일 입출력은 열고,읽고/쓰고,닫기 과정을 꼭해야한다.

- 파일 열때 포인터를 이용해 메모리가 동적으로 할당된다.

- 파일 작업후 파일을 닫지않으면 할당된 메모리는 계속 남는다.

+ex) 메모장을 틀어놓고 닫지 않으면 계속 켜져있다.


기본txt파일저장

실습내용


실습결과


기본txt파일불러와출력하기

실습내용


실습결과


#if문
x = -10

if x < 0:
print('x는 0보다 작다.')

x = 10

#else문
if x < 0:
print('x는 0보다 작다.')
else:
print('x는 0보다 크다.')

#if else문
x = 0
b = 5
if x < 0:
print('x는 0보다 작다.')
elif x == 0:
print('x는 0이다.')
#if문 안의 if문 사용법
if b == 5:
print('b는 5이다.')
else:
print('x는 0보다 크다.')

"""
if문 출력결과
x는 0보다 작다.
x는 0보다 크다.
x는 0이다.
b는 5이다.
"""

#in,not의 쓰임
#숫자사용할때는 비추천한다.
#아래 코드는 테스트용
a = [1,2,3]
b = 1
if b in a:
print('in')

if 100 not in a:
print('not in')

boolean = False
if not boolean:
print('True가아니다')

#Flase로 판정되는 것들
#Flase, 0, 0.0, '', [], (), {}, set()
str = ''
if str:
print('OK!')
else:
print('NO')

#리스트가 빈값인지 확일할때
str = []
#len(str) 할 필요없다.
if not str:
print('리스트가 비어있다.')



#while문
count = 0;
while count < 5:
print(count)
count += 1

#break문사용
count = 0;
while True:
if count == 5:
break;
print(count)
count += 1

#continue문사용
#2가출력 안된다.
count = 0;
while True:
if count == 5:
break;

if count == 2:
count += 1
continue
print(count)
count += 1

#while else문
#break가 없을때 else문을 실행해라
count = 0
while count < 5:
print(count)
count += 1
else:
print('끝났다')


#집합형
print('---------------')
a = {1,2,3,4,4,4,5,6}
print(a)
print(type(a))
b = {3,4,5,7}
print(a)
print(b)
#a집합에서 b집합을 뺸것
print('---------------')
c = a - b
print(c)
#b집합에서 a집합을 뺀것
print('---------------')
c = b - a
print(c)
#a와 b집합에 모두 있는것(교집합)
print('---------------')
c = a & b
print(c)
#a와 b집합 합친것(합집합)
print('---------------')
c = a | b
print(c)
#a에만 들어있는것
print('---------------')
c = a ^ b
print(b)


#집합의 메소드
s = {1,2,3,4,5,6}
#집합의 값추가하기
print('---------------')
s.add(7)
print(s)
#집합에 값제거하기
print('---------------')
s.remove(1)
print(s)
#집합에 값모두제거
print('---------------')
s.clear()
print(s)

"""
출력결과
---------------
{1, 2, 3, 4, 5, 6}
<class 'set'>
{1, 2, 3, 4, 5, 6}
{3, 4, 5, 7}
---------------
{1, 2, 6}
---------------
{7}
---------------
{3, 4, 5}
---------------
{1, 2, 3, 4, 5, 6, 7}
---------------
{3, 4, 5, 7}
---------------
{1, 2, 3, 4, 5, 6, 7}
---------------
{2, 3, 4, 5, 6, 7}
---------------
set()
"""


#사전형
#{} 중괄호를 사용한다.
#사전형은 해쉬테이블을 가지고 있어서 검색이 쉽다.
d = {'x': 10, 'y':20}
print(d);
#x값 출력
print(d['x'])
#y값 출력
print(d['y'])

#변경 추가는 숫자,문자 다가능
#x값 변경
d['x'] = 'test'
#z값 추가
d['z'] = 123
print(d)

#다양한 사전형 생성방법
d = dict(a=10,b=20)
print(d)
d = dict([('a',50),('b',40)])
print(d)

print('---------------------')
"""
출력결과
{'x': 10, 'y': 20}
10
20
{'x': 'test', 'y': 20, 'z': 123}
{'a': 10, 'b': 20}
{'a': 50, 'b': 40}
---------------------
"""
#사전형 메소드
print(help(d))
print('키,값 보기 ------------------')
#사전 키값만 보기
print(d.keys())
#사전 값만 보기
print(d.values())
print('업데이트하기 ------------------')
#업데이트하기
d2 = {'a':1000,'z':2000}
print(d)
d.update(d2)
print(d)
print('값출력,꺼내기 ------------------')
#사전에 값출력하기
#값이 없으면 에러난다
#print(d['ss'])
#None이 나오고 에러나지 않는다.
print(d.get('ss'))
print(d.get('a'))

#사전값 꺼내기 값이 없어진다.
print(d)
#d사전에서 a값 꺼내기
a = d.pop('a')
print(a)
print(d)

print('값삭제 ------------------')
del d['b']
print(d)
#값 전체삭제
d.clear()
print(d)

print('사전안에 값검색 ------------------')
d = {'x': 10, 'y':20}
print('x' in(d))

#사전 복사하기
print('사전복사하기 ------------------')
d2 = d.copy()
d2['x'] = 12333
print(d)
print(d2)
"""
출력결과
키,값 보기 ------------------
dict_keys(['a', 'b'])
dict_values([50, 40])
업데이트하기 ------------------
{'a': 50, 'b': 40}
{'a': 1000, 'b': 40, 'z': 2000}
값출력,꺼내기 ------------------
None
1000
{'a': 1000, 'b': 40, 'z': 2000}
1000
{'b': 40, 'z': 2000}
값삭제 ------------------
{'z': 2000}
{}
사전안에 값검색 ------------------
True
{'x': 10, 'y': 20}
{'x': 12333, 'y': 20}
"""


#리스트 복사
i = [1,2,3,4,5]
j = i
print('j = ',j)
print('i = ',i)
print('--------------')
j[0] = 100
#i,j의 주소값이 같으므로 값이 모두 변한다.
#참조전달
print('id(j) = ',id(j))
print('id(i) = ',id(i))
print('j = ',j)
print('i = ',i)
print('--------------')

#리스트 복사하기(두개다 가능)
#copy가 명시적으로 더 잘보임
#수치전달
x = j.copy()
x = j[:]
x[0] = 200
print('id(j) = ',id(j))
print('id(x) = ',id(x))
print('j = ',j)
print('x = ',x)
print('--------------')

"""
출력결과
j = [1, 2, 3, 4, 5]
i = [1, 2, 3, 4, 5]
--------------
id(j) = 4499210056
id(i) = 4499210056
j = [100, 2, 3, 4, 5]
i = [100, 2, 3, 4, 5]
--------------
id(j) = 4499210056
id(x) = 4735167240
j = [100, 2, 3, 4, 5]
x = [200, 2, 3, 4, 5]
--------------
"""

#튜플
#()로 표현한다
#데이타 조작 보다는 읽어 쓸때 사용한다.
#질문 보기등에 사용하기 유용하다.
print(help(tuple))
t = (1,2,3,4,1,2)
print(type(t))
print('--------------')
#값변경 안됌
#t[0] = 100
#에러남

#튜플안에 배열을 넣을수 있다
#배열은 수정가능하다
t = ([1,2,3],[4,5,6])
print(t)
t[0][0] = 200
print(t)
print('--------------')

#튜플의 언패킹
t = (10,20)
print(t)
x, y = t
#x, y = 10,20 과 같다.
print(x, y)
#대표적인 사용예
min, max = 0, 100
print(min, max)
#값변경도 가능
min, max = max, min
print(min, max)
print('--------------')
"""
출력결과
<class 'tuple'>
--------------
([1, 2, 3], [4, 5, 6])
([200, 2, 3], [4, 5, 6])
--------------
(10, 20)
10 20
0 100
100 0
--------------
"""


from typing import List

num = 1
name = '1'

#형변환
num = int(name)

print(num , type(num))
print(name, type(name))

#리스트 메소드 정보보기
#print(help(list))

#배열생성
n = [1,2,3,4,5]
#배열 마지막 값 꺼내기
print(n.pop())
#배열 첫번째 값 꺼내기
print(n.pop(0))
#배열 값 보기
print(n[0])
#배열에 값 추가
n.insert(0,100)
print(n)

#배열에 값 제거
del n[0]
print(n)

#배열에 특정 값 첫번째 제거
n.remove(2)
print(n)

a = [1,2,3,4,5]
b = [6,7,8,9,10]

#새로운 배열에 배열 더하기
x = a + b
print(x)

#기존 배열에 배열 더하기
a += b
print(a)

r = [1,2,3,4,5,1,2,3]

#배열안에 값 위치 확인하기
print(r.index(3))

#배열안에 3 갯수 확인
print(r.count(3))

#두번째 3 위치 확인하기
print(r.index(3,r.index(3)+1))

#if문 배열안에 숫자 있나 확인하기
if 5 in r:
print('5가 있다')

#배열 정렬하기
r.sort()
print(r)
#배열 반대로 정렬하기
r.sort(reverse=True)
print(r)
#한단계 전으로 돌리기
r.reverse()
print(r)

#문자열 특정문자 기준으로 배열만들기
s = 'a b c d'
splitTest = s.split(' ')
print(splitTest)

#배열 문자열로 만들기(특정문자 추가가능)
s = ''.join(splitTest)
print(s)

"""
배열 리스트 출력결과
1 <class 'int'>
1 <class 'str'>
5
1
2
[100, 2, 3, 4]
[2, 3, 4]
[3, 4]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2
2
7
5가 있다
[1, 1, 2, 2, 3, 3, 4, 5]
[5, 4, 3, 3, 2, 2, 1, 1]
[1, 1, 2, 2, 3, 3, 4, 5]
['a', 'b', 'c', 'd']
abcd
"""


식별자(Indentifier)란?


식별자는 무엇을 식별할 수 있는 도구로 변수,상수,함수명등이 포함된다.


식별자 이름은 반드시 글자,$,_로 시작해야한다.

- $사용 대표적예 jquery가 있다.


예약어 const,let,function등을 식별자이름을 사용할 수 없다.


대문자로 시작하지 않는다.(문법적인 오류는 아님)


varName <- carmelCase 형식으로 생성하기

var_name_test <- snakeCase 형식으로 생성하기

_로 시작하는 경우는 내부변수등에 사용한다. (특별한 상황에만 사용한다)


리터럴(literal)이란?

식별자 뒤에 할당되는 값아 value를 말한다.


let a = 30;이라면 30을 뜻한다.


숫자형,문자형등이 있다.


원시타입이란?

변수들이 같는 값(리터럴)이 문자,숫자,boolean(참거짓),null,undefined,심볼일 때를 원시타입이라고 한다.


객체(Object)타입이란?

Array,Date,RegExp,Map,WeakMap,Set,WeakSet등이 있다.


이스케이프란?

특수문자를 있는그대로의 문자로 표현할때 사용한다.

var d = "sss,\"ss\"."; 역슬래시를 사용하여 표현한다.


let,const 미리보기

ES6가 되면서 var의 문제점이 해결된 let을 사용한다.

ex)

let a = 2;

b = 2;

let aa = 100, bb = 200;

등으로 사용가능하다.


기존엔 상수라는 개념이 없었는데

const라는 상수 개념이 생겨났다.


상수란? 변하지않는 값을 말한다.

ex)

const AA_BBC_CC = 200;


상수엔 값을 할당할 수 없기때문에

AA_BBC_CC = 500; 형식으로 하면 에러가 난다.



String,StringBuffer,StringBuilder의 차이


String은 불가변적이다.

StringBuffer,StringBuilder은 가변적이다.


String 객체는 Heap메모리에 생성되면 변하지않는다.

변경하게되면 새로운 객체를 생성해야한다.

ex)

String s = "a";

s = s + "b";


String 는 객체(Heap메모리) s는 reference 값(Stack메모리)이다.

String s = "a";

s(reference값)은 Heap 메모리의 "a"의 주소값을 보고 있다.


s = s + "b"; 를 하게되면 

s(reference값)가 보고있는 "a"값에 "b"를 추가하는것이아닌

"ab"라는 객체를 다시만들고 그 객체의 reference값으로 바꾼다.


ex)StringBuffer ,StringBuilder 동일하다.

StringBuffer s = new StringBuffer("a");

s.append("b");


StringBuilder,StringBuffer 는 객체(Heap메모리) s는 reference 값(Stack메모리)이다.

차이점은 StringBuilder,StringBuffer는 객체를 새로 생성하지않고

기존 객체에 값을 추가한다.


개발시에 문자열 병합이 빈번하게 일어나면 StringBuilder,StringBuffer를 사용하는게 좋다.


StringBuilder,StringBuffer 차이는?


synchronization(동기화)지원여부의 차이다.


synchronization란?

하나에 제한되어있는 데이터를 여러 스레드가 공유가 사용할때

데이터가 깨지지않게 줄을세워 키를 가지고 있는 데이터를 처리하고 나머지데이터는 대기시킨다.

데이터무결성을 보장할 수 있다.


StringBuffer는 동기화를 지원하고

StringBuilder는 동기화를 지원하지 않는다.


멀티스레드를 사용하지 않는다면 

StringBuffer보단 StringBuilder가 빠르다.


자바 메모리영역 Stack,Heap


Stack

- Stack 메모리는 비교적 가벼운데이터들을 말한다.

- primativeData,reference(주소값)이 있다.


Heap

- Heap 메모리는 객체등 무거운데이터가 머물러있다.

- Garbage Collection은 Heap메모리에서 작동한다.


ex)

마트에 갔을때 가벼운 물건들은 바로바로 구매하지만

배송이 필요한 물건은 reference를 보고 구매하면

Heap에서 가져오게 된다.

autoboxing,unboxing이란?


autoboxing,unboxing의 개념은 jdk 1.5 부터 나왔다.


자바에는 크게 2가지 데이터 타입이 있다.

primitive Data,Object Data 두가지!


primitive Data

- boolean, char, byte, short, int, long, float, double

- 아주 가벼운 데이터를 말한다.

- 스택메모리에 머물러있다.


Object Data

- 상대적으로 무거운 데이터이다.

- 실제 데이터는 힙메모리에 공유하고 레퍼런스만 스택메모리에 있다.


Wrapper Class

- primitive Data를 ObjectData화 시킨 Class이다.


jdk 1.5 이전에 서로 호환할려면 개발자가 명시적으로 바꿔줬어야했다.

하지만 jdk 1.5가 나오면서 직접호환이 가능하게 되었다.


primitive Data 에서 Wrapper Class로 자동으로 변환되는걸 autoboxing이라 한다.

가벼운 데이터를 무거운데이터에 넣기에 autoboxing이라고 생각하면 간단하다.


Wrapper Class에서 primitive Data 자동으로 변환되는걸 unboxing이라 한다.

무거운 데이터를 가벼운데이터에 넣기에 unboxing이라고 생각하면 간단하다.


autoboxing이란?

- 컴파일러가 primitive Data를 Object Data로 자동변환하는것이다.

- int a = 42; Integer b =a;

- 과거엔 객체를 생성했어야했다.


unboxing이란?

- 컴파일러가 Object Data를 primitiveData로 자동변환하는것이다.

- Integer a = new Integer(42); int b =a;

- 과거엔 a.intValue();로 생성했어야했다.


+ Recent posts