테스트 사이트 - 개발 중인 베타 버전입니다

OOP에 대한 생각

· 11년 전 · 884 · 1

제가 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가 버전 업이 되면 클라스의 생성자 부분이 타 언어에서와 같이 오버로딩이 될 수 있도록 다양하게 생성할 수 있었으면 좋겠네요.

 

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

 

그럼 좋은 밤 되세요. 

 

 

 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 1개

10년 전
객체란 자료형의 하나라는 것은 이미 소설같은 자바에 설명되어있습니다.

게시글 목록

번호 제목
8050
8048
19969
19968
19967
19966
19965
19964
19963
19962
19961
28345
31017
19960
19959
19958
19957
8039
8035
8029
28344
28339
8019
28338
8017
8010
8007
8004
8003
28332
28322
7999
28317
20956
7992
20945
28314
20936
20931
7986
20925
7982
7979
7978
7975
28307
7973
7966
28305
7963
28300
7961
28297
28295
7959
19948
19947
28292
31016
19946
19945
28286
7958
7956
7952
7946
28285
28283
19943
7944
7936
7931
28279
24666
24663
7928
7923
19941
28274
28257
28249
28248
7914
7912
7911
20912
7908
31755
28233
28232
28228
7903
28217
20900
24662
20891
20882
19936
20853
31011