빠르게 활용하는 파이썬 3.2 프로그래밍 – 5장 클래스

 

Notice : 해당 자료가 저작권등에 의해서 문제가 있다면 바로 삭제하겠습니다.

빠르게 활용하는 파이썬 3.2 프로그래밍
[구매하기]

빠르게 활용하는 파이썬 3.2 프로그래밍 – 1장 파이썬 개요 및 설치, 2장 자료형 및 연산자
빠르게 활용하는 파이썬 3.2 프로그래밍 – 3장 함수
빠르게 활용하는 파이썬 3.2 프로그래밍 – 4장 제어
빠르게 활용하는 파이썬 3.2 프로그래밍 – 5장 클래스
빠르게 활용하는 파이썬 3.2 프로그래밍 – 6장 모듈
빠르게 활용하는 파이썬 3.2 프로그래밍 – 7장 예외처리
빠르게 활용하는 파이썬 3.2 프로그래밍 – 8장 입출력
빠르게 활용하는 파이썬 3.2 프로그래밍 – 10장 문자열이야기
빠르게 활용하는 파이썬 3.2 프로그래밍 – 11장 날짜이야기
빠르게 활용하는 파이썬 3.2 프로그래밍 – 12장 숫자이야기
빠르게 활용하는 파이썬 3.2 프로그래밍 – 13장 파일 시스템을 자유자재로
빠르게 활용하는 파이썬 3.2 프로그래밍 – 14장 데이터베이스

▣ 05장 클래스

5.1 클래스 이야기
객체 지향 언어

왜 객체지향언어인가?
– 절차지향 언어 : 프로그램의 흐름은 데이터를 중심으로 가공하고 처리
-> 단점 : 순서대로 진행하기 때문에 수정이나 추가 삭제에 취약, 전체 순서와 흐름을 알아야함. 대규모와 복잡한 시스템에서는 취약
– 객체지향 언어 : 현실 세계를 잘 반영, 물체나 개념등을 객체로 표현(진짜?)

현실세계의 객체를 모델링 -> 클래스를 정의 -> 클래스를 생성 및 사용

객체 : 실세계의 것을 SW세계의 것으로 표현
멤버함수 : 객체의 기능 및 행위
멤버변수 : 객체의 속성 또는 상태

클래스 : 객체를 프로그램에서 사용할 수 있도록 만든 틀
인스턴스 : 객체를 프로그램 내에서 구체화 하여 사용할 수 있는 실체

– 추상화 : 클래스의 공통된 부분을 추출해 기본 클래스로 작성
– 부모클래스(상위 클래스)
– 자식클래스(하위 클래스)
– 상속 : 부모클래스로부터 공통된 속성을 물려받은 관계
– 다형성 : 동일한 맴버함수에 대한 서로 다른 동작
– 정보은닉 : 객체내부의 정보(맴버변수)을 마음데로 수정하지 못하게 숨김

5.2 클래스 선언
– 선언과 동시에 클래스 객체가 생성 (http://www.pythontutor.com/visualize.html 참고)
– 클래스가 생성되면 메모리에 공간이 할당되고 그 공간안에 멤버변수와 멤버 함수가 생성됨
– 생성된 클래스를 사용하려면 인스턴스 객체를 생성해야 함
– 인스턴스 객체의 데이터가 변경되면 클래스 객체와 데이터를 구별하기위해 인스턴스 객체에 데이터 저장
– 변경되지 않은 데이터와 메소드는 클래스 객체와 공유
– . 연산자로 속성값에 접근(기본으로 public)
– self 현재 인스턴스 객체를 가르킴(this)
– 바운드메소드: (인스턴스에서)메소드를 호출할때 암묵적으로 첫인자로 인스턴스 객체를 넘기는 호출방식
– 언바운드 메소드 : (클래스에서)명시적으로 첫인자로 인스턴스 객체를 전달하는 호출방식

5.3 클래스 객체와 인스턴스 객체의 이름공간
– 클래스 객체와 인스턴스 객체의 이름공간은 다르다.
– 함수나 변수명을 찾는 순서 : 인스턴스 객체 -> 클래스 객체 -> 전역 -> 에러발생(AttributeError)
– 런타임에 클래스나 인스턴스에 멤버변수를 추가하거나 삭제 할 수 있음(python 3.3 에서만 가능/2.7은 안됨)
– 클래스 메서드 내에서 인스턴스(self)를 통하지 않고 변수에 접근하면 전역변수와 클래스 변수명이 동일할 경우 오작동(주의!!)
– 인스턴스 객체가 자신을 생성한 클래스 객체를 참조하기 위해 인스턴스 내장속성 __class__ 를 사용

5.4 클래스 객체와 인스턴스 객체의 관계
– 인스턴스 객체가 어떤 클래스로부터 생성됬는지 확인 isinstance() 내장함수 사용
– 자식 인스턴스 객체도 부모 클래스의 인스턴스로 평가
– python 3.x 이후는 모든 객체는 object 으로 부터 상속

5.5 생성자, 소멸자 메서드
– 인스턴스 객체를 생성시 초기화 작업을 위한 생성자 메소드(__init__()), 종료를 위한 소멸자 메소드(__del__()) 존재
– del 을 사용하더라도 레퍼런스 카운트가 1이상이면 소멸자는 호출되지 않는다..

5.6 정적 메서드, 클래스 메서드
– 정적메소드 : 인스턴스 객체를 통하지 않고 클래스를 통해 직접 호출할수 있는 메소드 (self 인자 선안안함)
– 클래스메소드 : 암묵적으로 첫인자로 클래스 객체가 전달
– 정보은닉을 위한 변수는 __변수명 으로 사용하라(클래스내부에서만 선언한이름으로 사용할수 있음)

5.7 연산자 중복 정의
– 연산자를 오버라이딩해서 사용이 가능(내장 함수인 __메소드__ 를 재정의)
– 기본적으로 제공되는 연산자 중복정의가 없으므로 명시적으로 정의해서 사용해야 함

5.8 상속
– 상속을 통해 부모클래스의 속성을 자식클래스에 물려줄수 있음 – 유지보수하기 좋음
– 다중상속 가능 -> class classname(p_class1, p_class2) :
– 클래스 내부정보는 __dict__ 의 사전객체라ㅗ 관리
– 두클래스간의 상속관계 확인 : issubclass(자식클래스, 부모클래스)
– 부모클래스의 생성자 호출
– 메서드 추가
– 메서드 재정의 : 메소드의 이름만 동일하면 됨 -> 자식 클래스의 이름공간에 생성되기 때문에 가능
– 메소드 확장하기 : 명시적으로 부모클래스의 메소드를 호출후 추가 작업
– 클래스 상속과 이름공간 : 상속관계 검색의 원칙 : 인스턴스 객체 -> 클래스 객체간 상속영역(자식 > 부모) -> 전역 -> 에러발생(AttributeError)
중복된 데이터와 메소드를 최소화해 메모리 사용의 효율을 높이기 위함

– 다중상속한 경우 자식클래스 선언부 헤더에 상복받을 클래스를 순차적으로 나열 -> 다중상속된 클래스 나열의 순서가 영향을 줌(__mro__)
– super() 를 이용한 상위 클래스의 메소드 호출 : 다중상속의 경우 자식 클래스의 생성자에서 명시적으로 부모클래스의 생성자를 호출할 경우 꼬일수 있음 super().__init__();

 

This entry was posted in Python/Ruby/Perl, Reading and tagged , , . Bookmark the permalink.

댓글 남기기