본문 바로가기

Script/Groovy

13. OOP

JAVA 에 비해서 Groovy 의 Class 는 상대적으로 쉽고 간단히 Class 를 생성할 수 있다.
 
 
 
Class 
 
일단 Groovy 의 class 에서는 public private 를 넣지 않는데 Groovy 의 모든 클래스는 public 이다.
 
필요하다면 private 을 넣어 선언해도 상관없으므로 private 클래스인 경우에는 private 을 넣으면 된다.
 
class Person {
 
 
}
public class Person implements GroovyObject {
  @Generated
  public Person() {
    CallSite[] var1 = $getCallSiteArray();
    super();
    MetaClass var2 = this.$getStaticMetaClass();
    this.metaClass = var2;
  }
}
 
 
 
Field
 
멤버 변수는 기본으로 private 멤버가 되며 getter 와 setter 가 자동으로 만들어 진다.
 
변수에는 데이터 타입을 지정해도 되고 지정하지 않아도 되며
 
필요하다면 Class 선언과 마찬가지로 private public protected 를 명시적으로 선언해도 된다.
 
class Person {
  String firstName
  def lastName
}
 
public class Person implements GroovyObject {
  private String firstName;
  private Object lastName;
 
  @Generated
  public Person() {
    CallSite[] var1 = $getCallSiteArray();
    super();
    MetaClass var2 = this.$getStaticMetaClass();
    this.metaClass = var2;
  }
 
  @Generated
  public String getFirstName() {
    return this.firstName;
  }
 
  @Generated
  public void setFirstName(String var1) {
    this.firstName = var1;
  }
 
  @Generated
  public Object getLastName() {
    return this.lastName;
  }
 
  @Generated
  public void setLastName(Object var1) {
    this.lastName = var1;
  }
}
 
class Person {
  protected String f1,f2,f3
  private Date createdOn = new Date()
  static welcomeMsg = 'Hello'
}
 
public class Person implements GroovyObject {
  protected String f1;
  protected String f2;
  protected String f3;
  private Date createdOn;
  private static Object welcomeMsg;
 
  ...
}
 
멤버 변수를 부를때도 getter setter 함수를 사용할 필요가 없다.
 
아래와 같이 코딩하면 인스턴스의 특정 멤버를
 
내부적으로 작성되는 메서드에 의해 결과 값을 가져온다.
 
class Person {
 String firstName
 def lastName
 protected String f1,f2,f3
 private Date createdOn = new Date()
 
 static welcomeMsg = 'Hello'
}
 
def person = new Person()
 
println person.createdOn
println person.welcomeMsg
 
public class Test extends Script {
...
 
  public Object run() {
    CallSite[] var1 = $getCallSiteArray();
    Object person = var1[1].callConstructor(Person.class);
    var1[2].callCurrent(this, var1[3].callGetProperty(person));
    return var1[4].callCurrent(this, var1[5].callGetProperty(person));
  }
}
 
 
 
Construction
 
기본적으로 Groovy 에[서는 class 를 선언하면 디폴트 생성자만 제공한다.
 
하지만 마치 데이터를 넣는 모든 생성자가 있는 것처럼 사용할 수 있는데
 
이유는 Groovy 에서 내부적으로 기본 생성자를 통해 오브젝트를 만들고 
 
변수를 찾아 자동으로 값을 대입해 주기 때문이다.
 
class Person {
  String first, last
}
 
def person = new Person(first:'Daeung',last:'Kim')
...
public Object run() {
  CallSite[] var1 = $getCallSiteArray();
  Object person = var1[1].callConstructor(Person.class, ScriptBytecodeAdapter.createMap(new Object[]{"first", "Daeung", "last", "Kim"}));
return person;
}
 
하지만 만약 사용자가 생성자를 제공하면 위와 같은 기능은 더 이상 동작하지 않으며
 
사용자가 생성한 생성자만 사용 가능하게 된다.
 
class Person {
  String first, last
 
  Person(String fullName){
    List parts = fullName.split(' ')
    first = parts[0]
    last = parts[1]
  }
}
 
def person2 = new Person('Daeung Kim')
 
 
 
 
Method
 
Groovy 메소드는 return 을 생략할 수 있으며 함수 선언시에도 def 로 리턴값, 파라미터 값을 넣으면
 
알아서 void, String, .. 등의 데이터 타입으로 해석해서 사용한다.
 
이외에는 거의 Java 와 동일하다.
 
 
class Person {
  String first, last
 
  Person(String fullName){
    List parts = fullName.split(' ')
    first = parts[0]
    last = parts[1]
  }
 
  def getFullName(){
    "$first $last"
  }
}
 
def person = new Person('Daeung Kim')
println person.getFullName()
 
Daeung Kim
 
어찌보면 편리한 기능이긴 한데 입력 변수 타입을 지정해 놓으면 사용자가 사용할 때 기능을 오동작하지
 
않도록 할 수 있기 때문에 적절히 사용하도록 하자.
 
 
 
Classes into Packages
 
Groovy 에서도 Java 와 동일하게 package , import 예약어를 사용한다. 
 
package com.control
 
import com.app.App
 
class Control {
 
}
 
 
 
 
Inheritance
 
Groovy 의 상속도 Java 와 마찬가지로 extends 키워드를 사용한다.
 
class Phone {
  String name
  String os
  tring appStore
}
 
class IPhone extends Phone {
 
}
 
def phone = new IPhone(name:"iPhone",appStore:"Apple Store", os :"ios")
 
println phone.name
 
iPhone
 
기존 클래스 멤버를 오버라이딩 하는 경우에는 @Override 어노테이션을 붙여주면 된다.
 
class Phone {
  String name
  String os
  tring appStore
 
  def powerOn(){
    println "Power On"
  }
}
 
class IPhone extends Phone {
  @Override
  def powerOn(){
    println "Power On"
  }
}
 
 
 
 
Interface
 
Groovy 의 Interface 도 Java 의 Interface 와 사용법이 동일하다.
 
class Person {
  String first,last
}
 
interface IPersonService {
  List<Person> findAll()
}
 
class PersonServiceImpl implements IPersonService {
  @Override
  List<Person> findAll() {
     return null
  }
}
 
 
 
Traits
 
Java 언어의 interface 는 interface 를 상속받는 클래스들의 뼈대를 제공해 주지만
 
정작 메소드 구현은 interface 를 상속받는 클라이언트 클래스를 구현하는 개발자가 전부 구현해야 한다.
 
( Java 8 부터는 interface 함수에 default 키워드를 사용하면
 
구현 클래스에서 해당 함수를 구현하지 않아도 되긴 한다)
 
trait FlyingAbility {
  def fly() {
    println "Flying"
  }
}
 
class Bird implements FlyingAbility {
 
}
 
def bird = new Bird()
bird.fly()
 
Flying
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

'Script > Groovy' 카테고리의 다른 글

15. MOP - Compile Time  (0) 2020.01.21
14. MOP - Runtime  (0) 2020.01.21
12. Exception  (0) 2020.01.21
11. Conditional Statement  (0) 2020.01.21
10. Closures  (0) 2020.01.21