Lua-객체 지향
OOP 소개
객체 지향 프로그래밍 (OOP)은 현대 프로그래밍 시대에 가장 많이 사용되는 프로그래밍 기술 중 하나입니다. 다음을 포함하는 OOP를 지원하는 여러 프로그래밍 언어가 있습니다.
- C++
- Java
- Objective-C
- Smalltalk
- C#
- Ruby
OOP의 특징
Class − 클래스는 객체 생성을위한 확장 가능한 템플릿으로 상태 (멤버 변수) 및 동작 구현에 대한 초기 값을 제공합니다.
Objects − 클래스의 인스턴스이며 자체적으로 할당 된 별도의 메모리가 있습니다.
Inheritance − 한 클래스의 변수와 함수가 다른 클래스에 상속되는 개념입니다.
Encapsulation− 클래스 내에서 데이터와 함수를 결합하는 과정입니다. 데이터는 함수의 도움으로 클래스 외부에서 액세스 할 수 있습니다. 데이터 추상화라고도합니다.
Lua의 OOP
Lua의 테이블 및 일급 함수를 사용하여 Lua에서 객체 방향을 구현할 수 있습니다. 함수 및 관련 데이터를 테이블에 배치하면 개체가 형성됩니다. 상속은 메타 테이블의 도움으로 구현 될 수 있으며, 존재하지 않는 함수 (메서드) 및 부모 개체의 필드에 대한 조회 메커니즘을 제공합니다.
Lua의 테이블은 값과 무관 한 상태 및 정체성과 같은 객체의 기능을 가지고 있습니다. 동일한 값을 가진 두 개체 (테이블)는 다른 개체 인 반면 개체는 서로 다른 시간에 다른 값을 가질 수 있지만 항상 동일한 개체입니다. 개체와 마찬가지로 테이블에는 만든 사람이나 만든 위치와는 독립적 인 수명주기가 있습니다.
실제 사례
객체 방향의 개념은 널리 사용되지만 적절하고 최대의 이점을 얻으려면 명확하게 이해해야합니다.
간단한 수학 예를 고려해 보겠습니다. 우리는 종종 원형, 직사각형 및 정사각형과 같은 다른 모양으로 작업하는 상황에 직면합니다.
셰이프는 공통 속성 영역을 가질 수 있습니다. 따라서 공통 속성 영역을 사용하여 기본 개체 모양에서 다른 모양을 확장 할 수 있습니다. 각 모양은 고유 한 속성을 가질 수 있으며 직사각형과 같은 기능은 속성으로 길이, 너비, 영역을 속성으로 가질 수 있고 기능으로 printArea 및 calculateArea를 가질 수 있습니다.
간단한 클래스 만들기
세 가지 속성 영역, 길이 및 너비가있는 사각형에 대한 간단한 클래스 구현이 아래에 나와 있습니다. 계산 된 영역을 인쇄하는 printArea 함수도 있습니다.
-- Meta class
Rectangle = {area = 0, length = 0, breadth = 0}
-- Derived class method new
function Rectangle:new (o,length,breadth)
o = o or {}
setmetatable(o, self)
self.__index = self
self.length = length or 0
self.breadth = breadth or 0
self.area = length*breadth;
return o
end
-- Derived class method printArea
function Rectangle:printArea ()
print("The area of Rectangle is ",self.area)
end
개체 만들기
객체 생성은 클래스 인스턴스에 대한 메모리를 할당하는 프로세스입니다. 각 개체에는 자체 메모리가 있으며 공통 클래스 데이터를 공유합니다.
r = Rectangle:new(nil,10,20)
속성 액세스
아래와 같이 도트 연산자를 사용하여 클래스의 속성에 액세스 할 수 있습니다.
print(r.length)
멤버 기능 액세스
아래와 같이 개체와 함께 콜론 연산자를 사용하여 멤버 함수에 액세스 할 수 있습니다.
r:printArea()
메모리가 할당되고 초기 값이 설정됩니다. 초기화 프로세스는 다른 객체 지향 언어의 생성자와 비교할 수 있습니다. 위와 같이 값을 설정할 수있는 기능 일뿐입니다.
완전한 예
Lua에서 객체 방향을 사용하는 전체 예제를 살펴 보겠습니다.
-- Meta class
Shape = {area = 0}
-- Base class method new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- Base class method printArea
function Shape:printArea ()
print("The area is ",self.area)
end
-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()
위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.
The area is 100
Lua의 상속
상속은 모양과 같은 단순한 기본 개체를 직사각형, 정사각형 등으로 확장하는 프로세스입니다. 기본 속성 및 기능을 공유하고 확장하기 위해 실제 세계에서 자주 사용됩니다.
간단한 클래스 확장을 보겠습니다. 아래와 같은 클래스가 있습니다.
-- Meta class
Shape = {area = 0}
-- Base class method new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- Base class method printArea
function Shape:printArea ()
print("The area is ",self.area)
end
아래와 같이 모양을 사각형 클래스로 확장 할 수 있습니다.
Square = Shape:new()
-- Derived class method new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
기본 함수 재정의
우리는 기본 클래스에서 함수를 사용하는 대신 기본 클래스 함수를 재정의 할 수 있으며, 파생 클래스는 아래와 같이 자체 구현을 가질 수 있습니다.
-- Derived class method printArea
function Square:printArea ()
print("The area of square is ",self.area)
end
상속 완료 예
메타 테이블의 도움으로 또 다른 새로운 메소드의 도움으로 위에 표시된 것처럼 Lua에서 간단한 클래스 구현을 확장 할 수 있습니다. 기본 클래스의 모든 멤버 변수와 함수는 파생 클래스에 유지됩니다.
-- Meta class
Shape = {area = 0}
-- Base class method new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- Base class method printArea
function Shape:printArea ()
print("The area is ",self.area)
end
-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()
Square = Shape:new()
-- Derived class method new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
-- Derived class method printArea
function Square:printArea ()
print("The area of square is ",self.area)
end
-- Creating an object
mysquare = Square:new(nil,10)
mysquare:printArea()
Rectangle = Shape:new()
-- Derived class method new
function Rectangle:new (o,length,breadth)
o = o or Shape:new(o)
setmetatable(o, self)
self.__index = self
self.area = length * breadth
return o
end
-- Derived class method printArea
function Rectangle:printArea ()
print("The area of Rectangle is ",self.area)
end
-- Creating an object
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()
위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.
The area is 100
The area of square is 100
The area of Rectangle is 200
위의 예에서는 기본 클래스 인 Square에서 두 개의 파생 클래스 인 Rectangle과 Square를 만들었습니다. 파생 클래스에서 기본 클래스의 함수를 재정의 할 수 있습니다. 이 예제에서 파생 클래스는 printArea 함수를 재정의합니다.