Swift 언어를 공부하면서 Swift는 OOP(Object Oriented Programming)이 아닌 Protocol Oriented Programming이란
내용을 듣고 Protocol을 공부하면서 자바의 Interface와 거의 똑같은 거 아닌가?
하는 생각이 들어서 Protocol을 Interface와 다른 점이 뭔지 공부하며 안것들을 정리 해 보았습니다.
1. Swift의 Protocol은 파라미터에 기본 값을 지정할 수 없다.
먼저 자바의 Interface는
public interface TestInterface
{
int number = 100;
int getNumber();
void setNumber(int num);
}
이런 식으로 선언을 하여도 에러가 나지 않습니다.
하지만, Swift의 Protocol은
protocol TestProtocol
{
var number: Int = 100
func getNumber() -> Int
func setNumber(num: Int)
}
똑같이 만들면
var number: Int = 100
부분에서 Initial value is not allowed here이라는 에러가 납니다.
해석하면 초기 값 설정이 허용되지 않는다고 합니다.
Interface - 파라미터의 초기값 설정가능
Protocol - 파라미터의 초기값 설정불가
2. Swift의 Protocol의 Optional 메소드
먼저 자바에서 구현된 Interface를 클래스에서 상속을 받게 되면 모든 메소드를 다 구현해야합니다.
class TestClass implements TestInterface
{
private int number;
@Override
public int getNumber() {
return number;
}
@Override
public void setNumber(int num) {
this.number = num;
}
}
하지만 Swift의 Protocol은
@objc protocol MathProtocol
{
func add(a: Int, b: Int)
@objc optional func subtract(a: Int, b: Int)
}
class MathClass: MathProtocol
{
internal func add(a: Int, b: Int) {
print(a + b)
}
}
와 같이 Protocol을 상속을 받아도 optional로 선언된 메소드는 클래스에서 구현하지 않아도 됩니다.
필수가 아닌 필요에 의한 메소드들을 미리 선언할 수 있습니다.
Interface - 선언된 모든 메소드는 구현해야함
Protocol - Optional이란 키워드를 통해서 선택적으로만 구현가능
3. static 정적 멤버 정의
public interface MathInterface
{
void add(int a, int b);
void subtract(int a, int b);
static void round(float a);
}
자바의 Interface에서 이렇게 선언을 하면
static void round(float a);
이 부분에서 에러가 납니다.
하지만 Swift의 Protocol은
@objc protocol MathProtocol
{
func add(a: Int, b: Int)
@objc optional func subtract(a: Int, b: Int)
static func round(a: CGFloat)
}
class MathClass: MathProtocol
{
internal static func round(a: CGFloat) {
print(round(a: a))
}
internal func add(a: Int, b: Int) {
print(a + b)
}
}
이렇게 사용을 하여도 잘 작동이 됩니다.
Interface - 정적 멤버를 선언할 수 없음
Protocol - 정적 멤버를 선언 할 수 있음
아직 다 찾아보진 않았지만 이 정도로만 보아도
Swift가 POP라는 이유를 잘 알려주는 예제들인 것 같습니다.
OOP는 클래스와 객체지향형에 많이 기능이 있는 반면에
POP는 OOP의 기본적인 모든 개념들을 사용가능함과 동시에
Protocol이라는 개념에 더 투자된? 개념이라고 볼 수 있는 것 같습니다.
'Swift' 카테고리의 다른 글
Swift - NSLock 간단히 이해하기 (0) | 2017.03.17 |
---|---|
Swift dynamic (0) | 2017.02.15 |