Class
Class
: Object가 생성되는 템플릿 / 청사진
- 모든 object에는 state와 behavior가 있음. (object가 자신에 대해 알고 있는 것 & object가 할 수 있는 것)
- Class에는 변수와 메소드가 포함될 수 있음
- Interface : 어느 메소드도 구현되지 않는 클래스
Class를 정의할 때 지정하기
1. Access Modifiers
: 최상위 클래스 선언에서 사용
ex. private, public, global ...
2. Definition Modifiers (optional)
ex. virtual, abstract ...
3. Class 다음에 클래스명
4. Extensions and/or 구현 (optional)
Syntax
private | public | global //-> Access modifiers
[virtual | abstract | with sharing | without sharing] //-> Optional definition modifiers
class ClassName [implements InterfaceNameList] [extends ClassName]
{
//The body of the class
}
private | - 이 클래스가 이 코드 섹션에서만 알려져 있음을 선언 - 내부 클래스에 대한 default access |
public | - 이 클래스가 application / namespace에서 볼 수 있음을 선언 |
global | - 이 클래스가 모든 Apex 코드에 의해 모든 곳에 알려져 있음을 선언 - webservice 키워드로 정의된 메소드를 포함하는 모든 클래스는 global로 정의되어야 함 - 메소드/내부 클래스가 global로 선언된 경우 외부, 최상위 클래스도 global로 정의되어야 함 |
with sharing & without sharing | - 이 클래스의 sharing mode 지정 |
virtual | - 이 클래스가 extension & override(재정의)를 허용한다 선언 - 클래스가 virtual로 정의되지 않으면 override 키워드로 메소드 재정의 X |
abstract | - 이 클래스에 추상 메소드, 즉 signature만 선언되고 body는 정의되지 않은 메소드가 포함되어 있음을 선언 |
Method
Method를 정의할 때 지정하기
1. Modifiers (optional)
ex. public, protected
2. Data type
ex. String, Integer / void
3. 입력 매개변수 목록
: 괄호( )로 묶임
4. 메소드 body
: 중괄호{ }로 묶임
Syntax
[public | private | protected | global] [override] [static] data_type method_name
(input parameters)
{
//The body of the method
}
Override : virtual/abstract로 정의된 클래스를 재정의할 때만 사용!
Constructor
Constructor
: Class의 청사진을 만들 때 호출되는 코드
모든 클래스에 대해 생성자를 작성할 필요는 없음
Class의 생성자 작성 후 new 키워드 사용해야 함
(해당 class에서 object를 인스턴스화하기 위해)
public class TestObject {
//The no argument constructor
public TestObject() {
//more code here
}
//인스턴스화
TestObject myTest = new TestObject();
}
생성자 overload 가능
각각 다른 파라미터를 갖는 클래스에 대해 둘 이상의 생성자 O
public class TestObject2 {
private static final Integer DEFAULT_SIZE = 10;
Integer size;
//Constructor with no arguments
public TestObject2() {
this(DEFAULT_SIZE); //Using this(...) calls the one argument constructor
}
//Constructor with one argument
public TestObject2(Integer ObjectSize) {
size = ObjectSize;
}
}
Static & Instance methods, Variables, Initialization Code
Apex에서는 Static 메소드, 변수, Initialization 코드를 가질 수 있지만, Apex Class는 static이 될 수 X
Modifier, local 변수가 없는 instance 메소드, 멤버 변수, initialization 코드 가질 수 O
특징
Static method, Variables, Initialization code
- Class와 연결되어 있음
- 외부 클래스에서만 허용됨
- 클래스가 로드될 때에만 initialize됨
- Visualforce page에 대한 view state의 일부로 전송되지 않음
Instance methods, Member variables, Initialization code
- 특정 object와 연결되어 있음
- Definition modifier가 없음 (ex. virtual, abstract ...)
- 선언된 클래스에서 인스턴스화된 모든 object로 생성됨
Local variables
- 선언된 코드블럭과 연결되어 있음
- 사용하기 전에 initialize 해야 함
Static Method와 Variable
Static method와 variable은 외부 클래스에서만 사용 가능
내부 클래스에는 static method / variable이 없음
Static method / variable은 실행하기 위해 클래스의 인스턴스 필요 X
(X) myClassInstance.myStaticMethod
(O) myClass.myStaticMethod 또는 myClass.myStaticVariable
Instance Method와 Variable
Instance method와 member variable은 클래스의 instance, 즉 object에서 사용됨
Instance member variable은 클래스 내에서 선언되지만 메소드 내에서는 선언 X
Instance method는 일반적으로 instance member variable을 사용해 메소드의 동작에 영향을 줌
Initialization code
Instance Initialization Code
{
//code body
}
해당 클래스에서 object가 인스턴스화 될 때마다 실행됨
생성자보다 먼저 실행됨
클래스에 대한 고유한 생성자를 작성하지 않으려면 Instance initialzation code block을 사용하여 instance 변수를 initialize 가능
간단한 상황에서는 일반 initializer 사용
Static Initialization Code
static 키워드가 앞에 나오는 코드블럭
static {
//code body
}
다른 static 코드와 마찬가지로 클래스를 처음 사용할 때 한 번만 initialize 됨
클래스에는 static / instance initialization code가 여러 개 있을 수 O
코드 body의 모든 위치에 나타날 수 O
예시
static initialization code를 사용하여 static final 변수 initialize하고, value의 map과 같은 static 정보 선언 :
public class MyClass {
class RGB {
Integer red;
Integer green;
Integer blue;
RGB(Integer red, Integer green, Integer blue) {
this.red = red; //<- this.red = 위에 있는 Integer red; | red = RGB(Integer red)
this.green = green;
this.blue = blue;
}
}
static Map<String, RGB> colorMap = new Map<String, RGB>();
static {
colorMap.put('red', new RGB(255, 0, 0));
colorMap.put('cyan', new RGB(0, 255, 255));
colorMap/put('magenta', new RGB(255, 0, 255);
}
}
Properties
Apex property는 변수와 유사함
그러나 property 값에 액세스/반환하기 전에 코드에서 추가 작업 수행이 가능
Property를 사용해 변경이 이뤄지기 전에 데이터 유효성 검사, 데이터가 변경될 때 다른 멤버변수 값 변경하기, 다른 클래스에서 검색된 데이터 노출 등의 작업 가능
Get & Set accessor
- Get accessor의 코드는 property를 읽을 때 실행
- Property에 새 값이 할당되면 Set accessor의 코드 실행
Syntax
public class BasicClass {
//Property 정의
access_modifier return_type property_name {
get{
//Get accessor 코드블럭
}
set {
//Set accessor 코드블럭
}
}
}
access_modifier => public, private, global, protected | (defining modifier) static, transient
return_type => Integer, Double, sObject ...
예시
//prop이라는 property 정의
public class BasicProperty {
public integer prop {
get {return prop;}
set {prop = value;}
}
}
//BasicProperty 클래스 호출해서 Get&Set accessor 실행하기
BasicProperty bp = new BasicProperty();
bp.prop = 5; //Set accessor 호출
System.assertEquals(5, bp.prop); //Get accessor 호출
유의사항
- Get accessor의 body는 메소드의 body와 유사. Property type의 값을 반환해야 함 (return 문으로 끝남)
- Get accessor를 실행하는 것 = 변수 값을 읽는 것
- Get accessor가 정의된 Object의 상태를 변경하지 않는 것이 좋음
- Set accessor는 return type이 void인 메소드와 유사
- Property에 값을 할당하면 새 값을 제공하는 argument와 함께 Set accessor 호출됨
- Set accessor가 호출되면 시스템은 암시적인 argument(value) setter에 전달. (Property와 동일한 데이터 타입)
- Interface에서 Property 정의 X
- Apex property는 C#의 속성을 기반으로 하지만 차이점은...
- Property는 value에 대한 저장소를 직접 제공. Value를 저장하기 위해 supporting member를 만들 필요 X
- Apex에서 automatic properties 생성 가능
Automatic Properties
Get/Set accessor 코드블럭을 비워두어 Automatic property 정의 O
Automatic property 사용
- 디버그, 유지 관리가 더 쉬운 보다 간결한 코드 작성 O
- Read-only, read-write, write-only로 선언 O
예시
//3가지 automatic property 만들기
public class AutomaticProperty {
public integer MyReadOnlyProp { get; }
public double MyReadWriteProp { get; set; }
public string MyWriteOnlyProp { set; }
}
//Property 실행하기
AutomaticProperty ap = new AutomaticProperty();
ap.MyReadOnlyProp = 5; //Compile error : not writable
ap.MyReadWriteProp = 5; //No error
System.assertEquals(5, MyWriteOnlyProp); //Compile error : not readable
Static Properties
Property가 static으로 선언될 때 property의 Accessor 메소드는 static context에서 실행됨
=> accessor는 클래스에 정의된 non-static 멤버변수에 액세스 X
예시
//Static property & Instance property 생성
public class StaticProperty {
private static integer StaticMember;
private integer NonStaticMember;
public static integer MyBadStaticProp { return NonstaticMember; } //<- error
public static integer MyGoodStaticProp {
get { return StaticMember; }
set { StaticMember = value; }
}
public integer MyGoodNonStaticProp {
get { return NonStaticMember; }
set { NonStaticMember = value; }
}
}
//Static & Instance property 호출
StaticProperty sp = new StaticProperty();
sp.MyGoodStaticProp = 5; //<- error (Object instance로 접근 불가)
StaticProperty.MyGoodStaticProp = 5; //<- 이렇게 해야 함!
Property Accessor에서 Access Modifier 사용하기
Accessor가 자체 access modifier를 포함하는 경우 이 modifier가 access modifier 재정의 O
개별 accessor의 access modifier는 Property 자체의 access modifier보다 더 제한적이어야 함!
ex. Property가 public으로 정의된 경우 개별 accessor는 global로 정의 X
예시
global virtual class PropertyVisibility {
//read = private, write = public
public integer X { private get; set; }
//read = global, write = class에서만
global integer Y { get; public set; }
//read = class에서만, write = subclass에서만
public integer Z { get; protected set; }
}
Extending a Class
다른 클래스를 확장하는 클래스는 extended class의 모든 메소드&properties 상속
Extening class는 메소드 정의에서 override 키워드 사용해 기존 virtual 메소드를 override 가능
Virtual 메소드를 override하면 기존 메소드에 대해 다른 구현 제공 O => 다형성
extends 키워드를 사용해 클래스 확장 클래스는 다른 클래스 하나만 확장 O, 둘 이상의 인터페이스 구현 O
예시
//Marker class 생성
public virtual class Marker {
public virtual void write() {
System.debug('Writing some text.');
}
public virtual Double discount() {
return .05;
}
}
//Marker class를 확장하는 YellowMarker class 생성
public class YellowMarker extends Marker {
public override void write() {
System.debug('Writing some text using the yellow marker.');
}
}
//다형성 예
Marker obj1, obj2;
obj1 = new Marker();
obj.write(); //-> 'Writing some text.'
obj2 = new YellowMarker();
obj2.write(); //-> 'Writing some text using the yellow marker.'
Double d = obj2.discount(); //<- discount 메소드는 extend한 Marker class의 일부이므로 호출 O
//RedMarker class 생성
public class RedMarker extends Marker {
public override void write() {
System.debug('Writing some text in red.');
}
//이 class에서만 사용 가능한 메소드
public Double computerPrice() {
return 1.5;
}
}
//RedMarker class에 있는 추가 메소드 호출하기
RedMarker obj = new RedMarker();
Double price = obj.computerPrice();
Extension은 interface에서도 적용됨
클래스와 마찬가지로 interface가 다른 interface를 확장하면 extended interface의 모든 메소드와 속성을 extending interface에서 사용 O
'SFDC 개념' 카테고리의 다른 글
Visualforce - 기본1 (0) | 2023.06.26 |
---|---|
APEX - Trigger (0) | 2023.06.26 |
APEX - Apex&.Net (0) | 2023.06.26 |
APEX - 기본 (0) | 2023.06.26 |
SFDC - 기본 (0) | 2023.06.26 |
댓글