인터넷

파이썬에서 클래스를 사용하는 주된 이유는 무엇인가요? 6강

idcjw 2025. 8. 31. 08:19
반응형

 



 

파이썬에서 클래스를 사용하는 주된 이유는 무엇인가요?

파이썬에서 클래스를 사용하는 주된 이유는 반복되는 변수와 메서드를 하나의 틀(설계도)로 묶어 미리 만들어 놓음으로써, 동일한 구조의 객체를 여러 개 생성할 때 효율적이기 때문 입니다.

 

 


💡 클래스 외에 파이썬에서 코드를 재활용하고 관리하는 다른 방법들은 무엇인가요?

  • 모듈: 미리 만들어 놓은 파이썬 파일(함수, 변수, 클래스 포함)을 다른 파일에서 가져다 쓰는 것입니다.
  • 패키지: 여러 개의 모듈을 묶어서 제공하는 것으로, 라이브러리와 유사한 개념입니다.
  • 예외 처리: 오류 발생 시 프로그램이 중단되지 않고 특정 방식으로 처리되도록 미리 정의하는 것입니다.
  • 내장 함수: 파이썬 내부에 이미 정의되어 있어 별도의 임포트 없이 바로 사용할 수 있는 함수입니다.
  • 외장 함수: 라이브러리에서 가져다 쓰는 함수로, 임포트하여 사용합니다.

 

이 글는 파이썬 프로그래밍핵심 개념인 클래스, 모듈, 패키지, 그리고 예외 처리를 깊이 있게 다룹니다. 단순히 문법을 나열하는 것을 넘어, 왜 이러한 개념들이 필요한지, 그리고 실제 코드에서 어떻게 활용되는지를 구체적인 예시와 비유(과자 틀, 설계도)를 통해 명확하게 설명합니다. 특히, 뮤터블/이뮤터블 자료형의 차이부터 메서드 오버라이딩, 클래스 변수와 객체 변수의 차이까지, 초보자가 혼동하기 쉬운 개념들을 명쾌하게 해설하여 파이썬을 한 단계 더 깊이 이해하고 싶은 학습자에게 실질적인 통찰을 제공합니다. 복잡한 개념들을 실제 프로젝트에 어떻게 적용할 수 있을지 감을 잡고 싶은 분들에게 강력히 추천합니다.

 

1. 뮤터블(Mutable)과 이뮤터블(Immutable) 자료형의 이해

 

1.1. 이뮤터블(Immutable) 자료형

  1. 개념: 변하지 않는 자료형을 의미한다.
  2. 종류: 정수, 실수, 문자열, 튜플 등이 이에 해당한다.
  3. 특징:
  4. 함수내에서 값을 변경하려 해도 원본은 변하지 않는다.
  5. 새로운 객체를 생성하여 할당하는 방식으로 동작한다.
  6. 예시: a = 1일 때 함수내에서 a + 1을 해도 바깥의 a는 여전히 1이다.
  7. 함수내의 변수( 지역 변수)와 바깥의 변수( 전역 변수)는 서로 다른 것으로 취급된다.

 

1.2. 뮤터블(Mutable) 자료형

  1. 개념: 변할 수 있는 자료형을 의미한다.
  2. 종류: 리스트, 딕셔너리, 집합 등이 이에 해당한다.
  3. 특징:
  4. 함수내에서 값을 변경하면 원본도 변한다.
  5. 함수주소값을 넘겨주어 해당 주소의 객체를 직접 조작한다.
  6. 예시: 리스트 bappend를 하면 b가 실제로 변한다.
  7. 지역 변수전역 변수의 이름은 같을 수 있지만, 실제로는 같은 주소값을 바라보며 객체를 변화시킨다.

 

2. 클래스(Class)의 이해와 활용

 

2.1. 클래스 정의 및 필요성

  1. 정의: 반복되는 변수메서드를 하나의 틀(설계도)로 묶어 미리 만들어 놓은 것이다.
  2. 메서드: 클래스안에 있는 함수를 의미한다.
  3. 필요성:
  4. 반복적인 코드 작성 방지: 동일한 기능을 여러 번 구현해야 할 때 코드가 길어지고 복잡해지는 것을 방지한다.
  5. 객체 생성의 용이성: 하나의 설계도( 클래스)를 통해 동일한 형태의 여러 객체(인스턴스)를 쉽게 찍어낼 수 있다.
  6. 예시: 계산기 기능을 여러 개 만들어야 할 때, 클래스를 사용하면 각 계산기를 독립적으로 관리하며 효율적으로 생성할 수 있다.
  7. 비유: 클래스과자 틀이나 설계도와 같아서, 한 번 만들어두면 여러 개의 과자( 객체)를 쉽게 찍어낼 수 있다.

 

2.2. 클래스 기본 구조 및 사용법

  1. 클래스 선언: class 키워드 뒤에 대문자로 시작하는 클래스이름을 작성한다.
  2. 클래스 내용: 클래스안에는 변수함수( 메서드)를 정의한다.
  3. 객체(인스턴스) 생성: 클래스이름을 함수처럼 호출하여 객체를 생성하고 변수에 할당한다.
  4. 예시: a = MyCalculator()와 같이 사용한다.
  5. 생성된 객체는 해당 클래스로 만든 인스턴스(instance)라고 불린다.
  6. pass 키워드: 클래스내부에 아무것도 정의하지 않을 때 사용한다.

 

2.3. 클래스 메서드와 self 매개변수

  1. 메서드 정의: 클래스내부에 def 키워드를 사용하여 함수를 정의한다.
  2. self 매개 변수:
  3. 클래스 메서드를 정의할 때 가장 첫 번째 매개변수self를 반드시 포함해야 한다.
  4. self메서드를 호출하는 객체 자기 자신을 의미한다.
  5. 메서드호출 시 self에는 자동으로 해당 객체가 전달된다.
  6. 객체변수에 접근하거나 값을 할당할 때 self.변수명 형태로 사용한다.
  7. 메서드 호출: 객체명.메서드명(인수) 형태로 호출한다.
  8. 예시: a.set_data(4, 2)를 호출하면 a 객체self로 전달되고, 4first, 2second로 전달되어 객체 변수에 저장된다.

 

2.4. 생성자(Constructor) __init__ 메서드

  1. 정의: __init__클래스객체를 생성할 때 가장 먼저 자동으로 실행되는 특별한 메서드이다.
  2. 특징:
  3. 메서드이름 앞뒤에 언더바(_) 두 개가 붙어 있어 특별한 기능을 가진다.
  4. 객체생성 시 필요한 초기값을 설정하는 데 주로 사용된다.
  5. __init__ 메서드에 매개 변수가 있다면, 객체생성 시 해당 매개 변수를 전달해야 한다.
  6. 관례적으로 클래스코드의 맨 앞에 작성하는 것이 좋다.

 

2.5. 클래스 활용 예시

  1. 게임 캐릭터: 게임 캐릭터는 모두 비슷한 기본 기능을 가지므로, 캐릭터 클래스를 만들어 여러 NPC(Non-Player Character)를 찍어낼 수 있다.
  2. 다양한 객체 생성: 여러 개의 유사한 객체를 만들 때 클래스를 활용하면 효율적이다.

 

3. 클래스 상속(Inheritance)

 

3.1. 상속의 개념 및 필요성

  1. 개념: 기존에 만들어 놓은 클래스(부모 클래스)의 기능을 그대로 물려받아 새로운 클래스(자식 클래스)를 만드는 것이다.
  2. 필요성:
  3. 코드 재활용: 이미 구현된 기능을 처음부터 다시 만들 필요 없이 재활용하여 개발 시간을 단축한다.
  4. 기능 확장 및 변형: 부모 클래스의 기능을 그대로 사용하면서 추가적인 기능을 넣거나 기존 기능을 변형할 수 있다.
  5. 예시: 일반 계산기 클래스상속받아 공학용 계산기 클래스를 만들면, 기존 계산기 기능에 복잡한 기능을 추가할 수 있다.

 

3.2. 상속 구현 방법

  1. 자식 클래스 선언: class 자식클래스명(부모클래스명): 형태로 선언한다.
  2. 부모 기능 활용: 자식 클래스에서는 부모 클래스에 정의된 메서드나 생성자(__init__)를 별도의 구현 없이 그대로 사용할 수 있다.
  3. 예시: FourCal 클래스상속받은 SafeFourCal 클래스FourCal__init__add 메서드를 그대로 사용할 수 있다.

 

3.3. 메서드 오버라이딩(Method Overriding)

  1. 개념: 자식 클래스에서 부모 클래스에 있는 동일한 이름의 메서드를 재정의하여 덮어쓰는 것을 의미한다.
  2. 우선순위: 자식 클래스에 재정의된 메서드가 부모 클래스메서드보다 우선적으로 실행된다.
  3. 필요성: 부모 클래스의 기능을 그대로 사용하되, 특정 상황에서 자식 클래스만의 특수한 동작을 구현하고 싶을 때 사용한다.
  4. 예시: FourCaldiv (나누기) 메서드SafeFourCal에서 0으로 나누는 경우를 처리하도록 오버라이딩할 수 있다.
  5. 부모 클래스div는 0으로 나눌 때 오류가 발생하지만, 자식 클래스에서 오버라이딩div는 0을 반환하여 오류를 회피한다.

 

4. 클래스 변수와 객체 변수

  1. 클래스 변수:
  2. 클래스내부에 직접 선언되는 변수로, 모든 객체가 공유하는 공통적인 값이다.
  3. 클래스명.변수명 형태로 접근하거나 변경할 수 있으며, 변경 시 모든 객체에 영향을 미친다.
  4. 예시: Family 클래스lastname = "김"으로 선언하면, 이 클래스로 생성된 모든 객체lastname은 "김"이 된다.
  5. 객체 변수:
  6. __init__ 메서드내에서 self.변수명 형태로 선언되는 변수로, 객체마다 독립적인 값을 가진다.
  7. 객체마다 다른 값을 가져야 할 때 사용한다.
  8. 예시: self.first, self.second와 같이 각 계산기 객체마다 다른 초기값을 가질 때 사용한다.

 

5. 모듈(Module)

 

5.1. 모듈의 개념 및 활용

  1. 개념: 미리 만들어 놓은 파이썬 파일을 의미한다.
  2. 포함 내용: 함수, 변수, 클래스등을 포함할 수 있다.
  3. 활용: 다른 파이썬파일에서 import 키워드를 사용하여 모듈내의 기능을 가져다 쓸 수 있다.
  4. 코드 재사용성: 다른 사람이 만들어 놓은 유용한 기능을 쉽게 가져다 쓸 수 있어 개발 효율을 높인다.
  5. 예시: module_one.py 파일에 add 함수를 정의하고, hello.py에서 import module_one으로 가져와 module_one.add() 형태로 사용할 수 있다.

 

5.2. 모듈 임포트(Import) 방법

  1. 전체 모듈 임포트: import 모듈이름 형태로 모듈전체를 가져온다.
  2. 사용 시 모듈이름.함수명 형태로 호출한다.
  3. 특정 함수/클래스 임포트: from 모듈이름 import 함수명 형태로 모듈내의 특정 기능만 가져온다.
  4. 사용 시 함수명 형태로 바로 호출할 수 있다.
  5. 모듈의 모든 기능을 가져오지 않아 속도나 용량 면에서 효율적일 수 있다.

 

5.3. __name__ 속성 활용

  1. __name__의 의미: 파이썬파일이 직접 실행될 때는 __name__ 값이 __main__이 되고, 다른 파일에서 모듈로 임포트될 때는 __name__ 값이 해당 모듈의 이름이 된다.
  2. 활용 목적: 모듈이 임포트될 때 특정 코드가 실행되는 것을 방지하기 위해 사용한다.
  3. 구현: if __name__ == "__main__": 구문 안에 직접 실행될 때만 동작할 코드를 작성한다.
  4. 이 구문 안에 있는 코드는 모듈로 임포트될 때는 실행되지 않는다.

 

5.4. 모듈 경로 설정

  1. 기본 임포트 경로: 파이썬은 기본적으로 현재 실행 중인 파일과 같은 경로에 있는 모듈만 찾을 수 있다.
  2. 다른 경로의 모듈 임포트: 다른 폴더(하위 폴더 등)에 있는 모듈을 임포트하려면 sys 모듈을 사용하여 sys.path에 해당 경로를 추가해야 한다.
  3. import sys를 먼저 선언한다.
  4. sys.path.append('경로') 형태로 경로를 추가한다.
  5. 경로를 추가하지 않으면 ModuleNotFoundError가 발생한다.

 

6. 패키지(Package)

 

6.1. 패키지의 개념 및 구조

  1. 개념: 여러 개의 모듈(파이썬 파일)을 묶어 놓은 것으로, 라이브러리와 유사한 개념이다.
  2. 목적: 관련된 모듈들을 체계적으로 관리하고 배포하기 위함이다.
  3. 구조:
  4. 일반적으로 폴더 형태로 구성되며, 각 폴더는 패키지또는 서브 패키지가 된다.
  5. 패키지폴더 안에는 __init__.py 파일이 존재해야 한다.
  6. __init__.py는 해당 폴더가 패키지임을 알리는 역할을 하며, 패키지관련 설정을 할 수 있다.
  7. 파이썬3.3 버전 이후로는 필수는 아니지만, 이전 버전과의 호환성을 위해 사용하는 것이 일반적이다.
  8. 예시: game 패키지안에 soundgraphic 서브 패키지가 있고, 각 서브 패키지안에 모듈파일들이 있는 구조.

 

6.2. 패키지 임포트(Import) 방법

  1. 전체 경로 임포트: import 패키지명.서브패키지명.모듈명 형태로 임포트한다.
  2. 사용 시 패키지명.서브패키지명.모듈명.함수명 형태로 호출한다.
  3. from을 이용한 임포트:
  4. from 패키지명.서브패키지명 import 모듈명: 특정 모듈만 가져온다.
  5. 사용 시 모듈명.함수명 형태로 호출한다.
  6. from 패키지명.서브패키지명.모듈명 import 함수명: 특정 모듈내의 특정 함수만 가져온다.
  7. 사용 시 함수명 형태로 바로 호출한다.
  8. as를 이용한 별칭 부여: import 모듈명 as 별칭 또는 from 모듈명 import 함수명 as 별칭 형태로 임포트한 모듈이나 함수에 별칭을 부여하여 사용할 수 있다.

 

6.3. * (모든 것) 임포트와 __all__ 속성

  1. <em> 임포트: from 패키지명.서브패키지명 import </em> 형태로 사용하면 해당 경로의 모든 모듈을 가져온다.
  2. __all__ 속성: * 임포트 시 가져올 모듈을 명시적으로 지정하기 위해 __init__.py 파일 내부에 __all__ = ['모듈1', '모듈2'] 형태로 리스트를 정의한다.
  3. __all__에 명시되지 않은 모듈* 임포트 시 가져오지 않는다.

 

6.4. 상대 경로 패키지 임포트

  1. 개념: 현재 모듈의 위치를 기준으로 다른 모듈을 임포트하는 방법이다.
  2. .. (점 두 개): 현재 폴더의 상위 폴더를 의미한다.
  3. from ..서브패키지명 import 모듈명: 현재 모듈이 속한 폴더의 상위 폴더로 이동하여 다른 서브 패키지내의 모듈을 임포트할 때 사용한다.
  4. 예시: graphic 폴더 안의 render 모듈에서 sound 폴더 안의 echo 모듈을 가져올 때 from ..sound import echo와 같이 사용한다.

 

7. 예외 처리(Exception Handling)

 

7.1. 예외 처리의 개념 및 필요성

  1. 개념: 프로그램 실행 중 오류(예외)가 발생했을 때 프로그램이 강제로 종료되지 않고, 미리 정해놓은 방식으로 오류를 처리하여 정상적으로 계속 실행되도록 하는 기법이다.
  2. 필요성:
  3. 프로그램 안정성 확보: 예상치 못한 오류로 인해 프로그램이 갑자기 멈추는 것을 방지한다.
  4. 오류 상황 대응: 오류 발생 시 사용자에게 적절한 메시지를 보여주거나, 다른 조치를 취할 수 있도록 한다.
  5. 예시: 파일을 열 때 파일이 없거나, 숫자를 0으로 나눌 때 발생하는 오류 등을 처리할 수 있다.

 

7.2. 예외 처리 기본 구조: try, except, else, finally

  1. try 블록:
  2. 오류가 발생할 수 있는 코드를 작성하는 부분이다.
  3. if 문과 유사하게 시도하는 구문이다.
  4. except 블록:
  5. try 블록에서 오류가 발생했을 때 실행되는 코드이다.
  6. 특정 오류 유형을 지정하여 해당 오류만 처리할 수 있다.
  7. except 오류유형 as 변수명 형태로 오류 내용을 변수에 담아 활용할 수 있다.
  8. 모든 오류 처리: except Exception as e: 형태로 사용하면 모든 종류의 오류를 잡을 수 있다. Exception은 모든 오류의 부모 클래스이다.
  9. else 블록:
  10. try 블록에서 오류가 발생하지 않았을 때 실행되는 코드이다.
  11. if-else 구조의 else와 유사하다.
  12. finally 블록:
  13. try 블록에서 오류 발생 여부와 관계없이 항상 마지막에 실행되는 코드이다.
  14. 주로 파일을 닫거나 리소스를 해제하는 등 반드시 수행되어야 하는 작업에 사용된다.
  15. finally 블록은 코드의 거의 맨 마지막에 위치하는 것이 일반적이다.

 

7.3. 여러 개의 오류 처리

  1. 개별 오류 처리: except 블록을 여러 개 사용하여 각기 다른 오류 유형에 대해 개별적으로 처리할 수 있다.
  2. except ZeroDivisionError: (0으로 나눌 때)
  3. except IndexError: (인덱스 오류)
  4. 각 오류에 맞는 메시지를 출력하거나 다른 조치를 취할 수 있다.

 

7.4. 오류 회피 및 강제 발생

  1. 오류 회피: except 블록 내부에 pass 키워드를 사용하여 오류가 발생해도 아무것도 하지 않고 지나가도록 설정할 수 있다.
  2. 오류 강제 발생: raise 오류이름 구문을 사용하여 일부러 오류를 발생시킬 수 있다.
  3. 활용: 프로그래머가 특정 기능을 반드시 구현하도록 강제하거나, 특정 조건에서 오류를 발생시켜야 할 때 사용한다.
  4. 예시: 부모 클래스raise NotImplementedError를 사용하여 자식 클래스에서 해당 메서드를 반드시 오버라이딩하도록 강제할 수 있다.

 

8. 내장 함수(Built-in Functions)

  1. 개념: 파이썬인터프리터에 기본적으로 포함되어 있어 별도의 임포트 없이 바로 사용할 수 있는 함수들이다.
  2. 특징:
  3. 자주 사용되는 범용적인 기능들을 제공한다.
  4. 모든 내장 함수를 외울 필요는 없으며, 필요할 때 검색하여 사용하는 것이 일반적이다.
  5. 주요 내장 함수 예시:
  6. abs(): 숫자의 절대값을 반환한다.
  7. all(): 리스트나 튜플의 모든 요소가 참(True)인지 검사한다. (0은 거짓으로 간주)
  8. any(): 리스트나 튜플의 요소 중 하나라도 참(True)인지 검사한다.
  9. chr(): ASCII 코드를 입력받아 해당 문자를 반환한다.
  10. ASCII 코드: 0부터 127 사이의 숫자를 특정 문자와 1:1로 대응시킨 코드이다.
  11. dir(): 객체가 가진 메서드나 속성 목록을 보여준다.
  12. divmod(): 두 숫자의 몫과 나머지를 동시에 반환한다.
  13. enumerate(): 리스트나 튜플을 순회할 때 인덱스와 값을 함께 반환한다.
  14. eval(): 문자열로 된 파이썬표현식을 실행한다.
  15. filter(): 특정 함수를 사용하여 리스트의 요소들을 필터링하여 참인 요소들만 남긴다.
  16. id(): 객체메모리 주소값을 반환한다.
  17. input(): 사용자로부터 입력을 받는다.
  18. int(): 문자열을 정수로 변환한다.
  19. len(): 문자열, 리스트, 튜플 등의 길이를 반환한다.
  20. list(): 다른 자료형을 리스트로 변환한다.
  21. map(): 리스트의 각 요소에 함수를 적용하여 새로운 리스트를 생성한다.
  22. max(): 리스트에서 최대값을 반환한다.
  23. min(): 리스트에서 최소값을 반환한다.
  24. open(): 파일을 열 때 사용한다.
  25. pow(): 거듭제곱을 계산한다.
  26. range(): 특정 범위의 숫자를 생성한다.
  27. round(): 숫자를 반올림한다.
  28. sorted(): 리스트를 정렬한다.
  29. str(): 다른 자료형을 문자열로 변환한다.
  30. tuple(): 다른 자료형을 튜플로 변환한다.
  31. type(): 객체자료형을 반환한다.
  32. zip(): 여러 리스트의 요소들을 묶어준다.

 

9. 외장 함수(External Functions)

  1. 개념: 파이썬에 기본적으로 포함되어 있지 않고, 라이브러리 형태로 제공되어 import를 통해 가져다 쓰는 함수들이다.
  2. 특징:
  3. 특정 목적을 위한 전문적인 기능들을 제공한다.
  4. 필요한 라이브러리를 설치한 후 import하여 사용한다.
  5. 모든 외장 함수를 외울 필요는 없으며, 필요할 때 검색하여 문서를 찾아보고 적용하는 것이 가장 좋은 학습 방법이다.
  6. 주요 외장 함수(라이브러리) 예시:
  7. sys 모듈: 시스템 관련 기능을 다룬다.
  8. pickle 모듈: 파이썬 객체를 파일 형태로 저장하고 불러올 수 있게 한다.
  9. time 모듈: 시간 관련 기능을 제공한다.
  10. time.time(): 1970년 1월 1일 이후 경과된 초를 반환한다.
  11. time.sleep(초): 지정된 시간(초)만큼 프로그램 실행을 일시 중지시킨다.
  12. random 모듈: 난수(무작위 숫자)를 생성하는 기능을 제공한다.
  13. 로또 번호 생성 등 무작위 선택이 필요할 때 사용한다.
  14. webbrowser 모듈: 웹 브라우저를 제어하는 기능을 제공한다.
  15. webbrowser.open('URL'): 지정된 URL을 웹 브라우저로 연다.

 

파이썬 7강 바로가기

 

반응형