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 와 동일하다.
어찌보면 편리한 기능이긴 한데 입력 변수 타입을 지정해 놓으면 사용자가 사용할 때 기능을 오동작하지
않도록 할 수 있기 때문에 적절히 사용하도록 하자.
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 |