Python

Python 기초(File, Class) - AWS 풀스택 과정 (예습) 5일차

awspspgh 2024. 7. 6. 01:10

오늘은 Python 기초 마지막 내용입니다. file과 class에 대해서 배워보겠습니다.

목차
1. file
2. class
3. 예제 문제 풀이
4. 느낀점

1. file

◎ r : 읽기

◎ w : 쓰기

◎ a : 추가

◎ encoding = 'UTF - 8' : 한글 깨짐 방지 모드

- 예시 :

f1 = open(r"D:\pythonfile\newFile.txt, "w")
f1 = open("D:/pythonfile//newFile.txt, "w")          
f1.close()

 

◎ readline : 한 줄만 읽음

◎ read : 다 읽음

◎ readlines : 명령어도 무시하고 다 읽음

- 예시 :

# 파이썬 경로: 슬래시(/) + 역슬래시(\\) (= 키보드의 돈(money) 기호) or r역슬래시(\)

f = open("newFile.txt", 'w', encoding = 'UTF-8')
for i in range(0,10):
    data = "%d new File Writer ~!! \n" % i
    f.write(data)
f.close()

 

# strip() : 마지막 \n(enter) 제거

f1 = open("newFile.txt", "r", encoding = 'UTF-8')
line = f1.readlines()
for i in line:
    print(i.strip())       
# while True:
#     line = f1.readline()
#     if not line: break
#     print(line)
f1.close()
f2 = open("newFile.txt", 'a', encoding = 'UTF-8')
for i in range(10,20):
    data = ("%d번째 내용입니다.\n" % i)
    f2.write(data)
f2.close

# with문 : close를 알아서 해줌.
with open("newFile.txt", 'w') as f:
    f.write("test")

 

그러면 문제 하나를 풀어보겠습니다.

- 딕셔너리를 이용하여 학생 5명의 이름과 점수를 입력받고, 학생들의 점수 합계와 평균을 성적표 파일로 따로 출력하시오.

딕셔너리의 dic.key()와 dic.get()을 활용하고 데이터를 누적하는 방법을 이용하면 간단하게 해결할 수 있습니다.

dic = {}

n = 5
num = 0
while num < n:
    name = input("이름: ")
    score = int(input("점수: "))
    dic[name] = score
    num += 1

data = ''
f = open("성적표.txt", 'w')
for i in dic.key():
    # get(key) value return
    data += '%s : %d\n' %(i, dic.get(i)) # 데이터 누적
    sum += dic.get(i)
data += 'sum : %d\n' % sum
data += 'avg : %.2f\n' % (sum/n)
print(data)
f.write(data)
f.close()

 

2. class

: 객체를 만드는 틀이라고 생각하시면 됩니다.(객체 지향 언어)

class의 경우에는 이해하기 힘들 수 있는 개념인데요 init 아래에 있는 self.변수는 class에서 사용된다고 보시면 됩니다.

나머지 부분은 함수랑 거의 비슷합니다.

class Calc:
    
    def __init__(self):    # init - 초기화, 괄호 안에 있는 self 뒤에 넣는 변수들은 클래스의 이름에 쓰일 변수 
        self.result = 0    # __init__(self, name, number) => c = Calc('A'(=name),'B'(=number)) => 즉 클래스의 이름 달아주기임(굳이 필요하지 않음)
    
    def add(self, num):      # add - 함수, num - 외부에서 사용되는 변수
        data = "%d+%d=%d" % (self.result, num, (self.result + num))
        self.result += num
        return data
    
    def sub(self, num):
        data = "%d-%d=%d" % (self.result, num, (self.result - num))       
        self.result -= num
        return data 
    
    def mul(self, num):
        data = "%d*%d=%d" % (self.result, num, (self.result * num))
        self.result *= num
        return data
    
    def div(self, num):
        if num == 0:
            return "error"
        data = "%d/%d=%d" % (self.result, num, (self.result / num))
        self.result /= num
        return data

객체 생성을 할 때는 변수의 이름이 다르다면 개별적으로 운영된다고 생각하시면 됩니다.

# 객체 생성
c1 = Calc()
print(c1.add(5))
print(c1.add(5))
print(c1.add(5))
print(c1.add(5))
# 5 10 15 20
print("---------------------")

# 객체 생성 - c1과 c2는 개별적으로 운영됨!!

c2 = Calc()     
print(c2.add(10))

c3 = Calc()
print(c3.add(70))
print(c3.sub(20))
print(c3.mul(2))
print(c3.div(0))

그렇다면 class를 이용해서 계산기를 한 번 만들어보겠습니다.

class Calc2:
    def __init__(self):
        self.result = 0
        self.num = 0
        self.op = 0
        
    def res(self, num, op):
        if op == '+':
            self.result += num
        elif op == '-':
            self.result -= num
        elif op == '*':
            self.result *= num
        elif op == '/':
            if num == 0:
                return "error"
            self.result /= num
        else:
            return "error"
        return self.result
    
    def calc2Print(self, num, op):
        i = self.result
        self.op = op
        self.num = num
        resResult = self.res(num, op)
        if resResult == 'error':
            return resResult
        data = "%d%s%d=%d" % (i, op, num, self.res(num, op))
        return data
  
c1 = Calc2()
print(c1.res(10,'+'))
print(c1.res(3,'-'))
print(c1.res(3,'*'))
print(c1.res(0,'*/'))

print(c1.calc2Print(10,'+'))
print(c1.calc2Print(5,'-'))
print(c1.calc2Print(7,'*'))
print(c1.calc2Print(0,'/'))

계산기의 원리 자체는 저번에 해본 적이 있으니 계산 함수를 class로 옮기고 정리했다고 생각하시면 될 거 같습니다.

 

class로 한 번 만들면 다른 파일에서도 불러올 수 있습니다.

- 예시 :

# from class02 import Calc2


# c1 = Calc2()
# print(c1.calc2Print(10,'+'))

 

3. 예제 문제 풀이

◎ 문제 1번

- 자동차 시스템 만들기

1. class 이용하기

2. power = 시동, speed = 속도라고 하자

3. 시동은 On /Off로 하며 시동을 바꿀 때마다 출력

4. 시동이 꺼져 있을 때 속도를 증감할 수 없음

5. 속도는 10씩 증가, 감소하고 출력

6. 속도가 0이 아닐 때는 시동을 못 끄고 경고를 출력

7. 속도는 0 ~ 200까지로 제한, 범위를 초과하거나 미만이 될 때 각각 200, 0으로 고정하며 경고를 출력

 

◎ 문제 2번

- TV 리모컨 시스템 만들기

1. name = LG

2. power = 전원 (True / False)

3. ch = 채널

4. vol = 소리

5. 전원이 켜져야 동작하며 전원이 켜지거나 꺼질 때 출력

6. 채널은 0 ~ 20 순환 구조 (ex: 채널 0번에서 내려가면 -1번으로 갈 수 있는 것이 아닌 10번으로 이동함)

7. 소리는 0~10 단일 구조 (ex: 볼륨의 max : 10, min: 0)

8. 채널, 소리가 변동을 할 때마다 출력

◎ 문제 1번 정답

class Car:
    def __init__(self, name, num) -> None:     # '-> None' 유무 상관없음
        self.num = num
        self.name = name
        self.power = False
        self.speed = 0
        
    def powerOnOff(self):
        if self.speed == 0:
            self.power = not self.power   
            if self.power :
                print("시동이 켜졌습니다.")
            else:
                print("시동이 꺼졌습니다.") 
        else:
            print("오류 속도를 줄이세요")

    def speedUp(self):
        if self.power:
            if self.speed >= 200:
                self.speed = 200  
            else:
                self.speed += 10
            print(self.speed)
        
    def speedDown(self):
        if self.power:
            if self.speed <= 0:
                self.speed == 0
            else:
                self.speed -= 10
            print(self.speed)
    
    def carPrint(self):
        print(self.name + "("+self.num+")")       # "+   +" (= 숫자를 출력하고 싶을 때)
    
       
c = Car('Benz', '1234')
c.carPrint()
c.powerOnOff()
c.speedUp()
c.powerOnOff()
c.speedDown()
c.powerOnOff()

◎ 문제 2번 정답

class TV:
    def __init__(self, name) -> None:         # self 뒤에 변수를 넣으면 나중에도 변수의 이름을 바꿀 거라는 뜻(없다면 변수의 이름을 고정하겠다.)
        self.name = name
        self.power = False
        self.ch = 0
        self.vol = 0
        
    def powerOnOff(self):
        self.power = not self.power
        if self.power:
            print("전원이 켜졌습니다.")
            print("현재 채널은 %d입니다." % self.ch)
        else:
            print("전원이 꺼졌습니다.")
    
    def chUp(self):
        if self.power:
            if self.ch == 10:
                self.ch = 0
                print("채널: %d" % self.ch)
            else:
                self.ch += 1
                print("채널: %d" % self.ch)
    
    def chDown(self):
        if self.power:
            if self.ch == 0:
                self.ch = 10
                print("채널: %d" % self.ch)
            else:
                self.ch -= 1
                print("채널: %d" % self.ch)
                
    def volUp(self):
        if self.power:
            if self.vol > 9:
                print("최대 볼륨입니다.")
            else:
                self.vol += 1
                print("볼륨: %d" % self.vol)
    
    def volDown(self):
        if self.power:
            if self.vol < 1:
                print("최소 볼륨입니다.")
            else:
                self.vol -= 1
                print("볼륨: %d" % self.vol)
                
    def tvPrint(self):
        print(self.name + "리모컨")

 

4. 느낀점

마지막에 배운 클래스의 개념이 너무 이해하기 힘들었지만 문제를 계속 풀다 보니 class를 왜 이용하는 지, 어떻게 이용하는지 어느 정도 알게 되었다. 다음 주부터 Java를 배우면서 Python과 어떤 부분이 다른지 같은지 비슷한지 궁금해지기도 했으며, class를 어떤 식으로 배울 지 궁금해지면서 너무 어려울 것 같아 두렵기도 하지만 잘 배울 수 있도록 복습을 틈틈히 해야겠다고 생각하게 되었다.