OOP에 대한 생각 > 자유게시판

자유게시판

OOP에 대한 생각 정보

OOP에 대한 생각

본문

제가 PHP라는 언어를 처음 접한 2년 전쯤, 객체지향이다, 절차지향이다하는 그런 말들을 책이나 여러 커뮤니티에서 많이 들었었습니다.

 

처음 공부할 땐 PHP는 절차지향으로 하는게 프로그램을 짜기도 쉽고 쉽게 접근 할 수 있었죠. 그러다 실제 회사에 들어가고 실무에 투입되었을 땐 객체지향 스타일(OOP)을 접하게 되었습니다.  

 

막상 실무에 투입이 되고 그래도 도대체 객체라는게 뭘까, 개념이 잘 잡히지는 않았고 그냥 기계적으로(public 이면 ->, 스태틱이면 :: 등등)사용방법을 익혔던 것 같습니다.  

 

그러다 다른 타 프로그래밍 언어도 공부하고 PHP도 좀더 깊이 있게(?) 공부하다 보니 조금은 어설프지만 개념이 잡히는 듯 하네요. 물론 정확하지 않을 수도 있습니다.  


제가 생각하는 객체란 자료형의 하나입니다.  

 

자료형이라면, String도 있을 거고, Integer, float, double, char , Array ..... 등등이 있겠지만, 이 모든 부분들을 모두 포함 할 수 있는 부피가 큰 자료형이죠. 객체에는 일반적인 자료형태에 메소드 또는 다른 객체 등등이 포함 될 수 있습니다.  

 

이러한 개념을 정립하는데는 Javascript의 JSON활용을 많이 하게 될 때 인 듯 합니다.  

 

그런데, 위와 같은 개념으로 정의한다면 객체(Object)와  배열(Array)이 구분 되지 않을 수도 있습니다. 배열 역시 다양한 자료형을 포함 할 수 있으니깐요.  

 

언어에 따라 다르지만, 자바(JAVA), 자바스크립트의 경우는 배열 역시 객체 입니다. 뭐.. 자바나, 자바스크립트는 거의 모든 부분이 객체니깐요.   

 

자바스크립트의 경우 좀더 정확하게 확인 하고 싶다면 객체({})나 배열([])을 하나 만들고 typeof로 출력해보면 좀 더 정확하게 알 수 있습니다.  

 

그러나 PHP에서는 배열은 객체로 구분 하지 않는 듯 합니다. 물론 제 생각인데, 물론 다른 부분도 많겠지만, PHP에서 객체와 배열이 다른 부분이 아무래도 참조(Reference)하는 부분 때문이 아닌가 합니다. 이 부분은 조금 후에 설명 하도록 하겠습니다.

 

객체 지향 프로그래밍을 할 경우 성능에 영향을 미치는 부분 중에 하나가 가비지콜렉터의 성능이라고 생각합니다. 최근은 아니지만 구글에서 발표한 자바스크립트 엔진 V8도 가비지콜렉터 부분의 성능개선을 많이 한 부분도 이러한 맥락도 있지 않을까 하는 생각도하구요.

 

PHP 역시 가비지콜렉터가 알아서 잘 동작하고 있습니다.  

 

그러면 가비지콜렉터의 역할이란 뭘까요..  

 

이 부분은 PHP라는 언어에서 공부한 것은 아니지만, 대충 본다면 참조하지 않은 데이터(사용하지 않는 데이터)를 알아서 폐기처분 하여 메모리를 최적화 시키는 기능을 한다고 알고 있습니다.  

 

보통 우리가 객체를 생성할 때, 예를 들면 $a = new A()이런식으로 한다면, $a는 클라스 A 내부의 데이터들을 접근할 수 있는 참조키가 되는 것 입니다. 객체를 생성하게되면 여러데이터의 일부는 가비지 콜렉터 부분에 할당된 메모리에 실리게 되며, 이 참조키를 가지고 해당 데이터를 찾게 됩니다.  

 

데이터의 일부라고 설명을 드린 부분이 있는데 모든 데이터가 가비지콜렉터 부분에 실리지는 않습니다.  

 

보통 사용되는 메모리 스택을 살펴본다면

1. 코드와 상수 등등의 영역

2. 가비지 콜렉터 영역

3. 런타임 영역

4. 레지스트리 영역으로 나뉜다고 합니다.  

 

클라스 내부에서 정의 하는 상수나 또는 static으로 정의한 부분은 메모리 1 부분에 있을 것입니다. 어떻게 보면 여기에 실리게 되는 데이터는 따로 객체를 생성하여 참조키를 만들 필요는 없겠네요. 클라스이름으로 접근이 가능하니깐요. 

 

우리가 생성하는 객체의 참조키들은 3번 런타임 영역에 생성이 되며, 형성된 데이터의 일부(예 - static이 아니고 상수가 아닌)가 실리가 됩니다.  

 

만약 동일한 클라스를 가지고 객체를 다른 참조키를 가지고 여러번 생성하게 되면면 가비지 콜렉터영역에 실리는 데이터도 여럿이 될 것 입니다.  그렇기 때문에 클라스가 동일하다고 해도 생성된  객체 내부의 값을 각각 다르게 변경한다면 가비지콜렉터에 실려있는 데이터 역시 각각 다르게 변동 합니다.  

 

 

가비지 콜렉터의 경우 이러한 객체의  참조값이 사라지게 되면(unset)이 되면 가비지 콜렉터 영역에 실려 있는 값들을 폐기처분 하여 메모리를 최적화 하게 되죠..

 

 

위의 설명에서 어떻게 보면 static과 static아닌 변수(필드)와 메소드들의 차이점이 생기는 듯 합니다.
 그냥 제가 이해한 부분이라 정확하지 않을 수도 있지만. static은 메모리 스택의 1 영역에 지정이 되고 가비지콜렉터가 동작하지는 않는 부분 입니다. 그렇게 때문에 웹어플리케이션이 동작하고 있는 동안 항상 일정하게 유지가 되고 값이 변한다면 각기 다른 값이 형성되는 것이 아닌 일정한 값(마지막으로 반영된 값)으로 출력이 되는 것 입니다.  

 

 

개인적인 생각인데, 간혹 편의를 위해 모든 메소드들을 static으로 정의하고 사용하는 경우가 있습니다. 이런 경우 객체를 생성하는 번거로운 과정이 생략이 되고 그냥 클라스 이름으로만 접근하면 되니깐요.   

 

물론 사용하기 나름 인 듯 합니다. 제 개인적인 취향은 꼭 필요한 때 꼭 필요한 객체를 생성해서 접근하는 것을 좋아하고, 클라스의 생성자를 나름 활용하기를 좋아하다 보니 필요에 맞게 사용하는 편 입니다...

 

 

아마 다들 그렇게 하실 듯 하지만,  

상속(extends)를 잘 사용하면 객체가 좀더 기능적으로 잘 모듈화 되는 것 같습니다.

PHP에서는 많이 활용하지는 않아서 많이 사용은 하지 않았는데 타 언어에서는 모듈별로 추상객체를 미리 만들어 놓고 사용할 변수(필드)의 명칭이나, 메소드들을 추상적으로 정의해 놓고, 비슷한 기능의 클라스는 이를 상속받아 재정의 하도록 하기도 하더군요.  

 

비슷한 기능의 클라스를 상속에 상속을 받아 재정의해서 쓴다면 작성할 코드의 중복이 좀 덜 할 듯 하고 체계가 있을 듯 하네요.  

 

조금 바라는 점이 있다면, PHP가 버전 업이 되면 클라스의 생성자 부분이 타 언어에서와 같이 오버로딩이 될 수 있도록 다양하게 생성할 수 있었으면 좋겠네요.

 

조금 긴 주절이주절이 였습니다.  

 

그럼 좋은 밤 되세요. 

 

 

 

추천
0

댓글 1개

전체 15 |RSS
자유게시판 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT