오브젝티브C

public, protected, private, property 에 대해 간단히 알아보기

cvgsdvgs 2016. 1. 23. 15:33

퍼블릭

@public지시자를 사용한다. 외부에서도 직접접근이 가능하다. 직접접근이 가능하다는 것은 그 클래스의 메서드 안에서만 변수를 사용하는 것이 아닌 다른 클래스의 메서드에서도 그 객체를 생성하고 객체명->인스턴스변수명으로 그 값을 가져오거나 초기화 하는 것이 가능하다는 의미이다.  


프로텍티드

@protected지시자로 사용할 수 있으나 오브젝티브c에서는 아무지시자를 지정하지 않는다면 프로텍티드 지시자로 생성된다. 외부에서 접근이 불가능하며 상속을 한 경우 상속받은 클래스의 메서드에서 직접접근이 가능하다.


프라이벳

@private지시자로 사용한다. 외부와 상속받은 클래스의 메서드에서 모두 직접접근이 불가능하다.


프로퍼티

@property지시자로 사용한다. 프로퍼티는 프로텍티드에 자동으로 접근자 메서드(게터와 세터)를 생성해주는 것이다. 프로텍티드는 외부에서 직접접근이 불가능하고 메서드를 써서 접근해주어야 하는데 프로퍼티는 값을 초기화하거나 반환하는 메서드를 자동으로 생성해준다. set변수명이 세터메서드이며 게터메서드는 변수명만 사용해도 된다. 점연산자를 지원하여 객체명.변수명으로 초기화와 반환을 간단히 할 수 있다. 즉 점연산자를 쓰는 것이 더 편하다. 프로퍼티는 프로텍티드에 자동으로 접근자를 생성해 준 것이므로 해당 클래스를 상속하는 경우 서브클래스의 메서드 내에서 super.변수명으로 접근이 가능하며 외부에서도 객체명.변수명으로 접근이 가능하다. 



*왜 외부에서 퍼블릭을 사용하지 않고 프로퍼티를 번거롭게 사용하는지 의문이 생길 수가 있다. 그 이유는 메모리 참조와 관련된 문제 때문인데 만약 퍼블릭을 사용하여 외부에서 그 변수명을 사용하는 경우는 불일치 문제가 발생하며 이 경우 컴파일을 다시해야 한다. 클래스에 만약 name, address라는 변수가 있다면 컴파일러는 그 변수에 접근하는 곳들에서 메모리의 오프셋(순서)를 하드코딩한다. 예를 들자면 교실에 사물함이 있고 1번사물함은 철수의 사물함, 2번사물함은 영희의 사물함이라고 하자. 근데 광수가 철수의 사물함에 있는 물건이 필요해 1번사물함에서 물건을 꺼내왔다. 근데 알고보니 전학생이 새로와서 전학생이 1번사물함을 사용하고 철수는 2번, 영희는 3번을 사용하고 있는 경우 문제가 발생하게 된다. 즉 컴파일러는 변수명에 따라서 메모리에 접근하는 것이 아닌 순서(오프셋)에 따라서 메모리에 접근하기 때문에 그 순서가 바뀌면 문제가 발생하는 것이다. 즉 컴파일러는 코드 중에 철수의 사물함이라고 쓰여있는 곳을 1번 사물함으로 모두 대체하기 때문에 클래스의 인스턴스가 추가되거나 순서가 변하면 문제가 발생한다. 실제 예를 살펴 보면 클래스 정의가 업데이트하지 않은 경우 이런 문제가 생긴다. 접근자 메서드를 사용하면 이를 해결할 수 있는데 접근자 메서드를 통하면 런타임에 오프셋이 찾아진다. 즉 사물함의 이름과 순서를 재확인한다고 할 수 있다. 그 외에도 이 문제를 해결하기 위해 오프셋을 저장하고 있는 인스턴스변수를 만드는 방법도 있다.