-
8일차 - 클래스AI 솔루션 개발자과정(Java, Python) 2022. 10. 19. 16:46
클래스
자바스크립트, 자바, 파이썬, PHP, C#, C++등 프로그래밍 언어가 많이 사용중인데, 이 중에서 C를 제외한 모든 프로그래밍 언어는 '객체 지향 프로그래밍 언어'이다.
객체 지향 프로그래밍 언어란, 객체를 우선적으로 생각해서 프로그래밍한다는 의미이다.
이 모든 프로그래밍 언어는 클래스 기반의 객체 지향 프로그래밍 언어이다.
클래스 기반의 객체 지향 프로그래밍 언어는 '클래스' 하는 것을 기반으로 객체를 만들고, 그러한 객체를 우선적으로 생각해서 프로그래밍해야 한다.
객체는 여러가지 속성을 가질 수 있는 대상을 의미한다. 예를 들어 학생들의 성적 관리 프로그램을 만든다면 이름, 학번, 과목별 성적 등이 필요하다.
이 속성들을 가지고 있는 대상 즉, 학생을 객체 라고 부른다.
또한 학생 개개인이 아닌 학생들 모두 통틀어 객체라고 할 수 있다.
추상화
프로그램에서 필요한 요소만을 사용해서 객체를 표현하는 것을 추상화 라고 부른다.
포괄적으로 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 추상화라 한다.
클래스 선언하기
클래스는 객체를 조금 더 효율적으로 생성하기 위해서 만들어진 구문이다.
클래스의 이름은 식별자의 작성 규칙에 맞게 각 단어의 앞 글자를 대문자로 만들고 이를 합쳐서 이름을 만드는 캐멀 케이스 규칙을 지켜서 클래스 이름을 짓는 것이 좋다.
클래스는
class 클래스 이름 :
클래스 내용
의 구문으로 생성되는데, 이렇게 만들어진 클래스는 클래스 이름과 같은 함수(생성자)를 사용해서 객체를 만든다.
이러한 클래스를 기반으로 만들어진 객체를 인스턴스 라고 부른다.
Myclass가 클래스의 이름이고 pass가 내용, My는 인스턴스가 되고 Myclass()가 생성자 함수가 된다.
생성자
클래스 이름과 같은 함수를 생성자 라고 부른다.
클래스 내부에 __init__함수를 만들면 객체를 생성할 때 처리할 내용을 작성할 수 있다.
클래스 내부의 함수는 첫 번째 매개변수로 반드시 self를 입력해야 한다.
self는 자기자신을 나타내는 딕셔너리라고 생각하면 된다.
다만 self가 가지고 있는 속성과 기능에 접근할 때는 self.<식별자> 형태로 접근한다.
소멸자.
생성자와 반대로 인스턴스가 소멸될 때 호출되는 함수이다.
소멸자는 클래스 내부에 __del__(self) 형태로 함수를 선언해서 만든다.
메소드
클래스가 가지고 있는 함수를 메소드 라고 푸른다.
클래스 내부에 메소드를 만들 때는 생성자를 선언하는 방법과 똑같다.
클래스의 추가적인 구문
클래스를 사용하는 것은 작정하고 속성과 기능을 가진 객체를 만들겠다는 의미이다.
그래서 파이썬은 그에 따른 부가적인 기능을 지원한다.
- 어떠한 클래스를 기반으로 속성과 기능을 물려받아 새로운 클래스를 만드는 상속
- 상속관계에 따라서 객체가 어떤 클래스를 기반으로 만들었는지 확인하게 해주는 isinstance() 함수
- 파이썬이 기본적으로 제공하는 str() 함수 혹은 연산자를 이용하여 클래스의 특정 함수를 호출하는 기능 등.
어떤 클래스의 인스턴스인지 확인하기.
객체(인스턴스)가 어떤 클래스로 만들어졌는지 확인할 수 있도록 isinstance() 함수를 제공한다.
isinstance() 함수는 첫 번째 매개변수에 객체를, 두 번째 매개변수에 클래스를 입력한다.
인스턴스가 해당 클래스를 기반으로 만들어졌다면 True를, 다른 클래스 기반이라면 False를 리턴한다.
특수한 이름의 메소드
__str__() 함수를 클래스 내부에 정의하였을 때 추후에 str()함수를 호출하면 __str__() 함수가 자동으로 호출된다.
클래스 변수와 메소드
클래스 변수는 class 구문 바로 아래의 단계에 변수선언만 하면 된다.
변수에 접근할 때는 클래스 이름.변수 이름 으로 접근한다.
클래스 함수
클래스 함수 또한 클래스 변수처럼 그냥 클래스가 가진 함수이다. 일반적인 함수로 만드나 클래스 함수로 만드나 큰 차이는 없다. 다만 '클래스가 가진 기능'이라고 명시적으로 나타내는 것이다.
클래스 함수는 이러한 구성을 가지고
를 통해 함수를 호출한다
프라이빗 변수
파이썬은 클래스 내부의 변수를 외부에서 사용하는 것을 막고 싶을 때 인스턴스 변수 이름을 __<변수이름> 형태로 선언한다.
정보 은닉 : 접근 범위를 제한함으로써 안전하게 데이터를 보호하는(숨기는) 기법.
클래스 내부에 프라이빗 변수를 선언하였을 때 클래스 외부에서 변수에 접근하게 되면 오류를 출력한다.
반지름에 제한이 없어서 음의 숫자가 들어가게 된다면 넓이는 제곱해서 지장이 없지만 둘레는 음수가 되어버린다.
이를 막기위해 프라이빗 변수로 지정을 하여 범위를 제한해야 한다.
게터와 세터
게터와 세터는 프라이빗 변수의 값을 추출, 변경할 목적으로 간접적으로 속성에 접근하도록 해주는 함수이다.
- 게터(getter) : 객체로부터 프라이빗 속성을 받는 동작.
- 세터(setter) : 객체에다가 프라이빗 속성을 새롭게 주는 동작.
데코레이터를 사용한 게터와 세터
게터와 세터를 함수로 만드는 일이 많아져서 파이썬에서는 게터와 세터를 쉽게 만들고 사용할 수 있게 하는 기능을 제공한다.
변수 이름과 같은 함수를 정의하고 위에 @property 와 @<게터 함수 이름>.setter 라는 데코레이터를 붙여주면 된다.
원의 둘레와 넓이를 구하는 클래스를 만들었다.클래스의 매개변수인 radius와 같은 이름의 함수를 정의하고, 데코레이터를 붙여 클래스 외부에서 수정가능하게 작성하였다.
상속(inheritance)
상속은 다른 누군가가 만들어 놓은 기본 형태에 내가 원하는 것만 추가하거나 교체하는 것이다.
예를 들어 이력서같은 문서들을 다운로드 받아 나의 이력서를 작성하는 것과 같다.
다중 상속은 다른 누군가 만들어 놓은 형태들을 조립해서 내가 원하는 것을 만드는 것이다.
예를 들어 레고나 프라모델을 여러개 사면 제품들의 규격이 모두 같기 때문에 원하는 부품들로 새로운 구성을 만들 수 있다.
프로그래밍 언어는 기반이 되는 것을 부모 라고 부르고, 이를 기반으로 생성한 것을 자식 이라고 부른다.
부모가 자식에게 자신의 기반을 물려주는 기능이므로 상속 이라고 부른다.
상속은 주로 코드를 재사용 하되, 기능을 추가하고자 할 때 주로 사용된다.
바람직한 상속의 흐름은 부모 클래스와 자식 클래스가 연관성이 있어야 한다.
'새'라는 클래스를 상속한다고 한다면, 새 -> 독수리 -> 대머리 독수리 같은 흐름으로 상속해야 한다.
부모 클래스를 슈퍼 클래스 라고도 한다.
자식 클래스를 서브 클래스 라고도 한다.
자식 클래스 Child는 클래스 내부에 아무것도 없는데, 부모 클래스인 Parent의 상속을 받아서 Parent클래스가 가지고 있는 함수와 변수를 활용할 수 있는 것이다.
메소드 오버라이딩 : 상속받은 메소드를 다시 만드는 것.
상속은 IS-A 관계를 나타낼 때 사용된다.
예를 들면 게임을 개발할 때 클래스를 많이 활용하는데, 게임 화면에 출력되는 요소를 GameObject 라고 표현한다.
- 전사는 캐릭터입니다. Warrior is-a Character
- 마법사는 캐릭터입니다. Wizard is-a Caracter
'~은 ~이다 의 형식을 가진다.'
구성은 HAS-A의 관계를 만들 때 활용한다.
- 캐릭터는 능력치를 갖는다 : Character has-a Stats
- 캐릭터는 아이템을 갖는다 : Character has-a Item
구성은 '~가 ~를 갖는다'는 포함관계를 나타낼 때 사용한다.
즉, 다른 클래스의 기능을 활용할 때 사용한다.
스택 구현하기
스택은 기본 자료형이 쌓여서 정리되어 있는 공간을 의미한다.
상자에 물건을 넣을 때, 아래부터 차곡차곡 쌓는다면
꺼낼 때는 먼저 넣은 것을 가장 마지막에 꺼낼 수 있다.
이를 스택이라 하며 넣는 행위를 푸쉬(push), 꺼내는 행위를 팝(pop) 이라 표현한다.
클래스를 이용하여 스택을 구현한 것이다.
스택 클래스를 만들고, 안에 리스트를 정의한 다음
append() 함수를 이용하여 자료를 리스트에 넣는다.
pop()함수를 사용하여 리스트의 자료를 차례로 꺼낸다.
pop() 함수의 매개변수는 인덱스형식을 사용하는데,
(x,y)를 입력하여 슬라이싱도 가능하다.
매개변수에 0이 들어가면 처음부터 차례로,
중간숫자가 들어가면 해당 번호부터,
매개변수를 입력하지 않으면 자동으로 -1이 들어가는 것으로 취급해서
마지막 요소를 제거한다.
큐 구현하기
클래스를 이용하여 큐를 구현한 것이다.
큐는 일차선만 있는 터널을 들어가는 차량이
터널에 들어가는 순서대로 터널 출구로 나오는 것처럼
먼저 입력한 자료가 먼저 출력되는 자료 구조이다.
자료를 입력하는 행위를 인큐(enqueue)
출력하는 행위를 디큐(dequeue)라고 한다.
이 코드는 위에서 사용한 코드를 약간 변경하여 큐를 구현했다.
다른점은 스택은 입력한 순서의 반대로 꺼내야 한다면,
큐는 입력한 순서대로 꺼내야 하기에
먼저 입력된 10부터 다시 출력된다.
'AI 솔루션 개발자과정(Java, Python)' 카테고리의 다른 글
10일차 - 통합 개발 환경 아나콘다와 주피터 노트북, bs4모듈과 requests, NumPy, Pandas (0) 2022.10.21 9일차 - 파이썬 마무리 정리 (0) 2022.10.21 7일차 - 모듈 (0) 2022.10.18 6일차 - 파일 처리와 예외 처리 (0) 2022.10.18 5일차 - 함수와 람다 (2) 2022.10.14