wecode TIL day 12 (Oct 30)

Jae Hoon Shin, 신재훈, Noah·2020년 10월 30일
0

Python - Class 복습

출처: http://hleecaster.com/python-class/

자료형(type) 복습하기
클래스(Class)란 무엇인가
인스턴스 생성하기 (Instantiation)
객체 지향 프로그래밍 (Object-Oriented Programming)
클래스 변수 (Class Variables)
매서드 (Methods)
생성자 (Constructor)
인스턴스 변수 (Instance Variables)
인스턴스 변수의 활용, self
파이썬에서는 모든 게 다 객체(Object)다

자료형 (type) 복습!!

type() 함수를 치면 자료형이 string인지 int인지 or etc인지 알 수 있는데,
이게 왜 중요하냐면 , 이 자료형이 무엇인지에 따라 이 녀석을 가지고 뭘 할지 결정되기 때문이다.
ex) integer에는 .get()함수를 쓸수 없다.
dictionarys 는 두개 있을 때 그걸 합치기 위해 + 같은 연산자를 사용할 수 없다.
모두 자료형 수준에서 뭘 할 수 있고 뭘 할수 없는지 정의 되는 것!

클래스 (class)란 무엇인가

클래스는 자료형을 위한 일종의 템플릿,
다양한 유형의 정보가 담겨 있고, 우리가 자료형과 어떻게 상호작용할 것인지 적혀 있다.

그냥 클래스 키워드를 사용해서 정의하면 되고 클래스 이름은 대문자로 시작하며 뒷단어도 앞자리만 대문자 -> 파이썬 코드의 권고방식이며 문화 (그래야 누구나 아 이게 클래스 이름이구나 라고 알수 있음)

인스턴스 생성하기 (Instantiation)

클래스를 정의 하면 그걸 불러와서 사용하는 법을 알아야겠지. 클래스를 이용해 Instance를 만들어 주면 된다.
"임시로 어떤 템플릿을 불러와서 그걸 다른 이름의 객체로 저장한다" 라고 생각하면 편하다 (하나도 안편한데)

클래스 이름에 괄호를 추가하여 인스턴스를 만들고 그걸 변수에 할당하는방식

많은 인스턴스를 호출하는 것도 가능하다. 어차피 클래스는 템플릿 이고 , 이걸 각기 다른 용도로 사용할 수 있기 때문에

객체 지향 프로그래밍 (Object-Oriented Programming)

클래스 인스턴스는 객체(object)라고도 하며, 이렇게 클래스를 정의하고 객체를 만드는 패턴을 객체지향 프로그래밍(OOP 라고 한다.그렇다고만 알고 패스

인스턴스를 불러온다는건 클래스를 가져와 객체로 바꿔준다는건데,
type() 함수를 사용하는 건 그 반대라고 생각하면 된다.
객체의 타입을 확인하면 해당 객체가 어떤 클래스의 인스턴스인지를 확인할 수있다.
test_instance라는 객체는 TestClass의 인스턴스임을 확인할 수 있다.

파이썬에서 --main--은 “현재 실행 중인 파일”을 의미하므로, 위 출력 결과는 “이 스크립트에서 정의된, 현재 실행중인 TestClass클래스”를 의미한다고 생각하면 된다.

클래스 변수 (Class Variables)

클래스를 정의할 때 그 안에서 변수를 정의하면 모든 인스턴스에서 동일한 데이터를 사용할 수 있다.

이를 클래스 변수라고 부르는데, 이렇게 정의된 클래스 변수는 object.variable구문을 사용하여 액세스할 수 있다.
예시를 보자, Musician 이라는 클래스 안에 title이라는 변수를 정의했다고 해보자.


위처럼 하면 각각 다른 인스턴스를 호출하더라도 각 인스턴스 안에 있는 title이라는 변수는 언제나 똑같다. 두개 다 "Rockstar"라는 값이 출력될 것임

매서드 (Methods)

매소드는 클래스 안에서 정의된 함수라고 생각하면 된다.

일반적인 함수와 다른 정의할 때와 차이가 있다면 메서드를 정의할 때는
첫 번째 인수를 항상 self로 지정해야한다는 것 정도.
단순히 클래스 변수 title을 사용해서 문자열을 출력하는 메서드를 정의하고, 그걸 불러와서 사용했다.

메서드를 작성할 때 다른 인수는 필요 없었기 때문에 self만 써주었고, 함수안에서 클래스 변수를 사용할 때는
self.title 형식으로 불러왔다.

다른 인수가 있는 메서드 작성Circle이라는 클래스에서 π(pi) 값은 3.14로 넣어주고, 원의 넓이 구하는 공식을 area라는 메서드로 정의했다.
원의 넓이는 π * 반지름²이다.
그리고 메서드를 정의할 때 반지름을 인수로 받아야 하기 때문에 area의 인수로 self와 radius를 넣어줬다. (메서드의 첫 번째 인수는 언제나 self다. 잊지 말자.)

이제 반지름이 6인 원의 넓이는 circle.area(6), 반지름이 18인 원의 넓이는 circle.area(18)로 불러올 수 있게 되는 거다.

여기까지 이해하면 클래스를 만들어서 사용하는 기본적인 방법은 다 익힌 셈이다.(어려운데,,,)

인스턴스 변수 (Instance Variables)

지금까지 객체가 클래스의 인스턴스라는 것을 배웠지만, 각 객체가 메서드와 클래스 변수만으로 이루어져 있다면 객체들을 구별해야 할 필요가 있을까?

객체를 구별해서 인스턴스를 생성하는 이유는 각 인스턴스가 다른 종류의 데이터, 즉 인스턴스 변수를 보유할 수 있기 때문이다.

이렇게 각 객체가 보유한 데이터인 인스턴스 변수는 해당 클래스의 모든 인스턴스가 공유하는 게 아니다. (이게 클래스 변수와의 가장 큰 차이점이다.)

예를 보자. 일단 빈 클래스를 하나 정의해놓고, 두 개의 인스턴스(객체)를 불러오자.

인스턴스 변수의 활용, self

위를 공부하고 생각한것은, 그냥 변수로 써도 문제 없는데? 뭐가 다르지?
but!🙅‍♀️

인스턴스를 생성할 때 작동하는 생성자(constructor)를 활용해서 인스턴스 변수를 생성하고 관리하면 너무나 편리하기 때문이다.

생활코딩에서 추출

클래스와 같은 인스턴스들을 만드는데
그 각각의 인스턴스에는 변수와 함수 가 모두 들어있는데
중요한건 인스턴스마다 변수..
다시말해서 실제로 저장되어 있는 값이 데이터가 다르고
그 데이터가 다름에 따라서 각각의 함수가 동작하는 방법이 달라진다.. 라는 것을 기억하자

객체라는것은

인스턴스를 객체라고 한다...
클래스와 인스턴스를 구분해서 표현하는게 좋다

함수보다 메소드가 , 클래스 얘기할땐 좋다,,
변수 대신 속성,필드 또는 상태라는 말을 쓰는게 좋다.
행위 = 메소드 or 함수 (참고만 하고 넘어가자)

c1 = Cal(10,10)
print(c1.add())
print(c1.subtract())
c2 = Cal(30,20)
print(c2.add())
print(c2.subtract())

일단 결과 먼저 (위 사진)

객체지향을 이해하는데 있어서 중요한 문장.
즉 각각의 인스턴스가 서로다른 데이터를 가지고있다,
그 상태에 따라서 메소드를 실행한 결과가 달라진다.

클래스를 만들면 class Cal,

profile
🇰🇷🇺🇸 #Back-End Engineer

0개의 댓글