[Python] 클래스 대신 튜플(Tuple) 사용하기

2023. 2. 7. 20:42파이썬(Python)

반응형

파이썬으로 클래스 구현

 

[Python] 클래스(Class) - 클래스 정의, 정보 저장, 값 변경, 객체 리스트

1. 클래스(Class)란? - 새로운 형태를 하나 정의한 후, 형태를 이루기 위한 요소로 새로운 값을 정의하는 것. - 예를 들어, 두 학생의 국어, 수학, 영어 점수가 각각 (50, 60, 70), (70, 80, 90)이라 하자. kor1

kdh9797-devwiki.tistory.com

 

1. Tuple

- 파이썬에서 새로운 형태를 정의할 때 복잡하지 않은 경우는 클래스(class)를 만들지 않고 튜플(tuple)을 이용하여 해결할 수 있다.

- 함수를 구현할 때 2개 이상의 값을 반환하는 경우는 다음과 같다.

 

def two_numbers():
    return 1,2

print(two_numbers())

 

결과

(1, 2)

 

- 이처럼 튜플은 소괄호로 둘러싸인 형태로 정의되어 있다.

- 튜플은 리스트와 비슷하지만 차이점이 존재한다.

1. 튜플에 있는 값은 수정할 수 없다.

2. 튜플에 값을 추가할 수 없다.

3. 튜플 내에 값을 삭제할 수 없다.

4. 리스트는 mutable 하지만 튜플은 immutable 하다.

 

● 기능적으로 보면 리스트가 튜플보다 더 좋지만 튜플이 필요한 경우가 있다.

1. 리스트는 동적 배열이다.

- 동적 배열은 초기값을 최소한으로 설정해 배열을 생성한다.

- 배열 내에 원소가 가득 차면 원소를 추가하여 사이즈를 늘린다.

2. 리스트는 가변 객체이다.

- 리스트는 mutable 하기 때문에 연산을 진행하면 새로운 메모리 공간을 할당해주어야 한다.

- 따라서 immutable 한 튜플보다 오버헤드가 크다.

 

● 이러한 특징 때문에 리스트는 튜플보다 무거운 성격을 지니고 있다.

● 따라서 튜플은 리스트와 비교하여 메모리 용량을 아끼고 수행 시간이 빨라 성능을 향상하는데 도움이 된다.

 


2. 패킹과 언패킹

a,b=(1,2)
print(a)
print(b)

 

결과

1
2

 

- 위와 같이 코드를 진행하면 a, b를 각각 1, 2라는 값을 받게 된다.

- 이것을 튜플 언패킹 (Tuple Unpacking)이라 한다.

- 언패킹을 활용하면 여러 개의 반환값을 갖고 각각의 변수에 할당할 수 있다.

 

c=1,2,3,4,5
print(c)

 

결과

(1, 2, 3, 4, 5)

 

- 위와 같이 여러 개의 값하나의 변수에 넣으면 튜플 형식으로 묶어서 값을 넣을 수 있다.

- 이것을 튜플 패킹 (Tuple Packing)이라 한다.

 


3. 클래스 대신 튜플 사용하기

student=(50,70,80)
kor,math,eng=student
print(f'학생의 국어 성적은 {kor}')
print(f'학생의 수학 성적은 {math}')
print(f'학생의 영어 성적은 {eng}')

 

결과

학생의 국어 성적은 50
학생의 수학 성적은 70
학생의 영어 성적은 80

 

- 위와 같이 튜플 형태로 값을 저장한다.

- 튜플을 이용하는 경우 각 값이 무엇인지 알기 어렵다.

- 따라서 언패킹을 통해 적절한 변수 이름을 붙인다.

 


student=(0,0,0)
kor,math,eng=student
print(f'학생의 국어 성적은 {kor}')
print(f'학생의 수학 성적은 {math}')
print(f'학생의 영어 성적은 {eng}')

 

결과

학생의 국어 성적은 0
학생의 수학 성적은 0
학생의 영어 성적은 0

 

- 튜플은 클래스와 같이 기본값이라는 개념이 없다.

- 원하는 값이 정해지지 않았으면, 초기값을 직접 넣어 생성한다.

 


student=(0,0,0)
kor,math,eng=student
print(f'학생의 국어 성적은 {kor}')
print(f'학생의 수학 성적은 {math}')
print(f'학생의 영어 성적은 {eng}')

student=(kor,80,90)
kor,math,eng=student
print(f'학생의 국어 성적은 {kor}')
print(f'학생의 수학 성적은 {math}')
print(f'학생의 영어 성적은 {eng}')

 

결과

학생의 국어 성적은 0
학생의 수학 성적은 0
학생의 영어 성적은 0
학생의 국어 성적은 0
학생의 수학 성적은 80
학생의 영어 성적은 90

 

- 튜플은 immutable 하기 때문에 원소 값을 바꿀 수 없다.

- 값을 바꾸기 위해서는 새로운 튜플을 생성해야 한다.

 


- 만약 1개의 값만 필요하다면 언패킹을 할 때 필요 없는 곳은 '_'를 사용한다.

- 예를 들어 국어, 수학, 영어 점수 중 수학 점수만 필요한 경우는 다음과 같다.

student=(70,80,90)
_,math,_=student
print(f'학생의 수학 성적은 {math}')

 

결과

학생의 수학 성적은 80

 


4. 튜플을 사용한 객체 리스트

- 학생 3명의 국어, 수학, 영어 점수를 관리하는 정보는 다음과 같다.

students=[(10,20,30),(40,50,60), (60,70,80)]
n=2
student=students[n-1]
kor,math,eng=student

print(f'{n}번째 학생의 국어 점수는 {kor}')
print(f'{n}번째 학생의 수학 점수는 {math}')
print(f'{n}번째 학생의 영어 점수는 {eng}')

 

결과

2번째 학생의 국어 점수는 40
2번째 학생의 수학 점수는 50
2번째 학생의 영어 점수는 60

 

- 3명의 학생의 국어, 수학, 영어 점수를 입력하여 관리하는 방법은 list comprehension을 사용하면 다음과 같다.

students=[tuple(input(f'{i+1}번째 학생의 국, 수, 영 점수는? ').split()) 
        for i in range(3)
        ]
n=2
student=students[n-1]
kor,math,eng=student

print(f'{n}번째 학생의 국어 점수는 {kor}')
print(f'{n}번째 학생의 수학 점수는 {math}')
print(f'{n}번째 학생의 영어 점수는 {eng}')

 

결과

>> 1번째 학생의 국, 수, 영 점수는? 10 20 30
>> 2번째 학생의 국, 수, 영 점수는? 20 30 50
>> 3번째 학생의 국, 수, 영 점수는? 60 30 40
2번째 학생의 국어 점수는 20
2번째 학생의 수학 점수는 30
2번째 학생의 영어 점수는 50