왜 필요한가? -> 파이토치를 하기 위해서는 필요하다.
-3가지 방식의 프로그래밍 가능
-스크립트 형태의 실행(line-by-line execution)
-함수 형태의 실행(C나 자바스크립트와유사한 형태-모든 것을 함수화/시작은 main()= 대부분 언어가 공통)
-클래스 형태의 정의(C++/Java와 유사한 OOP형태)
Basic -> Fortran/Cobol -> Pascal/C -> C++ -> Java / C# -> Scala
절차적언어(80’s)-> 객체지향언어(90’s) -> 함수형언어(10’s)
-절차적언어
-객체지향언어
-함수형언어
-절차적(Procedual) 언어
-객체지향언어
-함수형언어
예전엔 물건 살때 현금 or 카드만 온리 가능했는데 요즘에는 쪼개서 카드 얼마, 포인트 얼마 이렇게 결제 가능
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
}
-코드가 순차적으로 실행(위에서 아래로)
-서브루틴/함수를 사용
함수가 너무 많아서 문제임
-해결책 -> 객체지향기술
-객체지향언어란
-참조
-캡슐화(Encapsulation) = 디버깅에서 엄청 중요!!, 디버깅 대상을 빨리 찾게해줌
예시 : 코로나 초기 동선분석 기지국 대신 qr코드 쓰는거. qr코드로 찾으면 동시간대 사람들 파악 쉽게
전역변수를 건드리면 다 뒤져야하는데, 아무나 못 건드르게 캡슐화,
-상속(Inheritance)
그래서 소스 코드 없이, 컴파일 된 상태에서 코드없이 재활용되는 기술 = 컴포넌트
OOP -> 컴포넌트(Component) -> “분산” 컴포넌트(스프링)
서비스기반 아키텍처 (SOA:Service Oriented Architecture) ->
마이크로 서비스 아키텍처 (MSA:Micro-service Architecture) -> 스프링 MSA
OOP -> MVC(Model/View/Controller) 아키텍처 -> DI(Dependency Injection)
일반적으로 4단계를 거쳐서 객체를 만든다.
Class Define(클래스 정의)
class A {
private int value; // 캡슐화
sample() { … }
}
Object Declare(오브젝트 선언 ; 결혼식에서 혼인선언하고 실제로 혼인신고 안한거)
A a;
Object Instantiate(메모리에 인스턴스 생성 ; 실제로 메모리에 만드는거)
a = new A();
Method Invoke(메소드 호출)
a.sample();
class NeuralNetwork extends nn.Module { // 상속
flatten; // 필드(캡슐화)
linear_relu_stack; // 필드
__init__ { … } // 생성자(constructor)
forward() { … } // 전파(forward)용 메소드
}
NeuralNetwork model = new NeuralNetwork() // 오브젝트 생성 및 메소드체이닝
model.to(device)
클래스는 필드와 메소드로 구성
class Sample {
private int value; // 필드 : 변수
public getValue() { … } //메소드(캡슐화) : 함수
public setValue() { …. }
}
class NeuralNetwork { // 필드 2개, 메소드 2개(생성자, forward)
flatten; // 필드
linear_relu_stack; // 필드
…
변수나 함수는 멤버(member) 또는 속성(attribute)이라고 한다. 암튼 같은 뜻
h = 10 ----> 전역변수
v = 20
def area(h, v): ----> 로컬변수
return h * v
a = area(h, v)
print(a)
두 줄만 함수
class Rectangle(object): --> 클래스명은 대문자로 시작! 파스칼
def __init__(self, h, v): 기본 생
self.h = h
self.v = v
def area(self):
return self.h * self.v
이 부분을 클래스 구현이라고 한다.
r = Rectangle(10, 20)
a = r.area()
print(a)
위 프로그램에서 r이 바로 객체이다. = 오브젝트 선언 / 인스턴스 생성 / 호출
_ init _ 생성자(생성자)
A a = new A(); 인자가 하나도 없는 생성자, 기본 생성자
def init(self): .... 이게 기본 생성자
new A(10,20); 로 하면
예제에서 Rectangle은 클래스이고 r은 Rectangle 클래스로 만들어진 객체이다. 객체와 클래스의 관계는 “붕어빵”과 “붕어빵을 굽는 틀”에 비유할 수 있다. 즉, 정해진 속성, 여기에서는 가로 길이 h와 세로 길이 v라는 속성을 가지도록 사각형 클래스를 한 번 만들어 놓으면 이 속성을 가지는 실제 사각형은 얼마든지 많이 만들 수 있다.
a = Rectangle(1, 1) # 가로 1, 세로 1인 사각형
b = Rectangle(2, 1) # 가로 2, 세로 1인 사각형
c = Rectangle(4, 2) # 가로 4, 세로 2인 사각형
d = Rectangle(6, 3) # 가로 6, 세로 3인 사각형
e = Rectangle(8, 5) # 가로 8, 세로 5인 사각형
파이썬에서 클래스를 정의하는 문법은 다음과 같다.
class 클래스이름(object):
def __init__(self, 속성값1, 속성값2, 속성값3):
self.속성이름1 = 속성값1
self.속성이름2 = 속성값2
self.속성이름3 = 속성값3
이때 속성값 인수는 필요하지 않다면 없어도 된다. 여기에서 class 블럭 안에 정의된 init란 함수는 생성자(constructor)라고 하며 클래스 정의에서 가장 중요한 함수이다.
객체를 생성할 때는 클래스이름을 함수처럼 호출해야 하는데, 이때 실제로는 init로 정의된 생성자 함수가 호출된다. 생성자 함수 내부에서는 생성자를 호출할 때 넣은 입력 변수, 즉 인자의 값을 속성값으로 저장한다.
자바
RoundRectangle extends Rectangle ---> 일반적인 사각형을 상속받아서 라운드렉텡글을 만들겠다. extends는 상속!!
파이썬
class RoundRetangle(Retangle) --> 그냥 상속을 받겠다 = 괄호에 클래스만
class NeuralNetwork(nn.Module):
def __init__(self):
super(NeuralNetwork, self).__init__()
self.flatten = ...
self.linear_relu_stack = ...
a = NeuralNetwork()
print(a.flatten)
print(a.linear_relu_stack)
nn.모듈이라는 클래스를 상속받아서 NeuralNetwork라는 클래스를 만든다.
nn.module이 부모이고 NeuralNetwork가 자식임.
그리고 NeuralNetwork는 생성자가 정의되는데 인자가 셀프밖에 없으니 기본생성자임.
그러면 밑에 a = NeuralNetwork() 괄호가 되면 자기의 생성자가 호출이 되는거고, 인자 없는 생성자가 호출이 되니까 그 안에서 부모클래스, nn.module의 생성자 (super)를 호출하고.
self.linear_relu_stack 같은 필드가 채워진다.
생성자 안에 super(부모 클래스의 생성자, 이닛메서드를 호출하라) = 자식의 생성자가 불리면 부모 클래스의 메서드, 이닛을 호출하라
플래튼이라는 필드값이 있는데 뒤의 값으로 채워라
결국 : nn.module을 상속받아서 부모 클래스 생성자를 호출해주고 나서 필드 두 개를 자동으로 채우는데, 이 채운값을 기준으로 코드를 계속 만들어간다.
class A extends B { … }
B를 상속한 A
상속을 받으면 자식꺼다!! 자식꺼는 this 부모한테 받은꺼까지는 super(부모 클래스의 생성자)
오버로딩이란? 동일한 이름의 메서드가 여러번 정의되는 것, 같은 메서드가 인수의 자료형이나 개수를 구별해서 다르게 받을 수 있는 것을 말한다.
메서드 오버라이딩(Method Overriding)이란, 상속관계에서 여러 클래스에 걸쳐서 같은 이름의 메서드를 만드는 것이다.
this.attack
super.attak
이렇게 구분할 수 있다.
상속관게에서 부모 매서드와 같은 메서드를 정의하면 오버라이딩했다.
암튼
생성자 init은 오버라이딩이 되나? = 메서드니까 가능
객체지향은 뭔가? 캡슐화와 상속
객체지향 4단계 -> 파이썬과 자바 다르다.
상속도 다르다.
상속 과정에서 오버라이딩.
오버리딩은