Lua 객체지향


객체 지향 프로그래밍(OOP)은 매우 널리 사용되는 컴퓨터 프로그래밍 아키텍처입니다.

객체 지향 프로그래밍을 지원하는 프로그래밍 언어는 다음과 같습니다.


  • C++

  • Java

  • Objective-C

  • Smalltalk

  • C#

  • Ruby


객체 지향 기능

  • 1) 캡슐화: 엔터티의 내용을 캡슐화하는 기능을 말합니다. 정보, 함수, 응답 속성은 별도의 개체에 로드됩니다.

  • 2) 상속(Inheritance) : 상속 방식은 원래 프로그램을 변경하지 않고 확장할 수 있어 원래의 기능을 보존하고 새로운 기능을 확장할 수 있는 방식입니다. 이는 반복적인 코딩을 줄이고 소프트웨어 개발 효율성을 높이는 데 도움이 됩니다.

  • 3) 다형성(Polymorphism): 동일한 작업이 다른 객체에 작용하고 다른 해석을 가지며 다른 실행 결과를 생성할 수 있습니다. 런타임 시 기본 클래스에 대한 포인터를 통해 파생 클래스의 메서드를 호출할 수 있습니다.

  • 4) 추상화는 복잡한 실제 문제를 단순화하는 방법이며, 특정 문제에 가장 적합한 클래스 정의를 찾아 가장 적절한 상속 수준에서 설명할 수 있습니다. .


Lua의 객체지향

우리는 객체가 속성과 메소드로 구성되어 있다는 것을 알고 있습니다. LUA의 가장 기본적인 구조는 테이블이므로 개체의 속성을 설명하려면 테이블을 사용해야 합니다.

Lua의 함수는 메서드를 나타내는 데 사용할 수 있습니다. 그러면 LUA의 클래스는 테이블 + 함수를 통해 시뮬레이션될 수 있습니다.

상속의 경우 metable을 통해 시뮬레이션할 수 있습니다(권장하지 않으며 대부분의 경우 가장 기본적인 객체만 시뮬레이션하는 것으로 충분합니다).


루아에서 테이블은 어떤 의미에서 단순한 객체가 아닙니다. 객체와 마찬가지로 테이블에도 상태(멤버 변수)가 있습니다. 특히 두 개의 서로 다른 값을 갖는 객체(테이블)는 두 개의 서로 다른 객체를 나타낼 수 있습니다. 또한 시간에 따라 다른 값을 갖지만 항상 객체와 유사하므로 테이블의 수명 주기는 테이블이 생성되는 대상과 생성되는 위치와 아무 관련이 없습니다. 객체에는 멤버 함수가 있고 테이블에도 다음이 있습니다.

Account = {balance = 0}
function Account.withdraw (v)
    Account.balance = Account.balance - v
end

이 정의는 새 함수를 생성하고 이를 Account 객체의 철회 필드에 저장합니다. 아래에서는

Account.withdraw(100.00)
<🎜를 호출할 수 있습니다. >간단한 예

다음의 간단한 클래스에는 면적, 길이, 너비의 세 가지 속성이 포함되어 있습니다. printArea 메소드는 계산 결과를 인쇄하는 데 사용됩니다.

-- Meta class
Rectangle = {area = 0, length = 0, breadth = 0}

-- 派生类的方法 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

-- 派生类的方法 printArea
function Rectangle:printArea ()
  print("矩形面积为 ",self.area)
end

객체 만들기

객체 생성은 클래스 인스턴스에 메모리를 할당하는 프로세스입니다. 각 클래스는 자체 메모리를 가지며 공통 데이터를 공유합니다.

r = Rectangle:new(nil,10,20)

액세스 속성

마침표(.)를 사용하여 클래스 속성에 액세스할 수 있습니다.

print(r.length)

멤버 함수 액세스

다음을 사용할 수 있습니다. 클래스의 속성에 액세스하려면 콜론( :)을 사용하세요.

r:printArea()

메모리는 객체가 초기화될 때 할당됩니다.

전체 예

아래에서는 Lua 객체 지향의 전체 예를 보여줍니다.

-- Meta class
Shape = {area = 0}

-- 基础类方法 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

-- 基础类方法 printArea
function Shape:printArea ()
  print("面积为 ",self.area)
end

-- 创建对象
myshape = Shape:new(nil,10)

myshape:printArea()

위 프로그램을 실행하면 출력 결과는 다음과 같습니다.

面积为 	100

Lua 상속

상속이란 한 개체가 다른 개체의 속성과 메서드를 직접 사용하는 것을 의미합니다. 기본 클래스를 확장하는 데 사용할 수 있는 속성 및 메서드입니다.

다음은 간단한 상속 예를 보여줍니다.

 -- Meta class
Shape = {area = 0}
-- 基础类方法 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
-- 基础类方法 printArea
function Shape:printArea ()
  print("面积为 ",self.area)
end

다음 예에서는 Square 개체가 Shape 클래스를 상속합니다.

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

전체 예

다음 예: 파생 클래스의 메서드를 확장하기 위해 간단한 클래스를 상속합니다. 파생 클래스는 상속된 클래스의 멤버 변수와 메서드를 유지합니다.

 -- Meta class
Shape = {area = 0}
-- 基础类方法 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
-- 基础类方法 printArea
function Shape:printArea ()
  print("面积为 ",self.area)
end

-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()

Square = Shape:new()
-- 派生类方法 new
function Square:new (o,side)
  o = o or Shape:new(o,side)
  setmetatable(o, self)
  self.__index = self
  return o
end

-- 派生类方法 printArea
function Square:printArea ()
  print("正方形面积为 ",self.area)
end

-- 创建对象
mysquare = Square:new(nil,10)
mysquare:printArea()

Rectangle = Shape:new()
-- 派生类方法 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

-- 派生类方法 printArea
function Rectangle:printArea ()
  print("矩形面积为 ",self.area)
end

-- 创建对象
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()

위 코드를 실행하면 출력 결과는 다음과 같습니다. 🎜>

面积为 	100
正方形面积为 	100
矩形面积为 	200


함수 재작성

Lua에서는 기본 클래스의 함수를 재작성하고 파생 클래스에서 자체 구현을 정의할 수 있습니다.

-- 派生类方法 printArea
function Square:printArea ()
  print("正方形面积 ",self.area)
end