본문 바로가기

Swift

Swift 프로토콜(protocol)과 Java 인터페이스(interface) 차이

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