흔히 객체 지향적이라 말해지는 프로그램들은 객체(Object)들로 이루어진다. 각 객체들은 목적에 맞는 특별한 기능들을 가지고 있고, 사용자들은 그런 기능들을 사용할수 있다. 물론 객체 디자이너가 몇몇 기능들을 사용자들에게서 숨길수도 있다. 과거의 절차지향적, 구조적 프로그래밍들은 문제를 풀기위한 절차(알고리즘)을 설계하는것이였고, 그런 절차들이 결정되면 절차에 알맞게 자료를 저장할수있는 방법을 찾았다. 프로그래밍 언어인 Pascal을 개발한 Nikalus Writh는 "Algorithms + Data Structures = Programs" 라는 책을 1975년 발행하기도 했다. 책 이름을 보면 알고리즘이 앞에오고 자료구조가 뒤에오는데 이는 당시 프로그래밍 컨셉이 "알고리즘(절차) 설계가 데이터 관리보다 선행한다" 였다는 것을 알려준다. 하지만 OOP의 등장은 이 순서를 서로 뒤바꿔 놓아서, "데이터 관리가 알고리즘(절차)에 선행한다" 라는 패러다임을 만들었다.
간단한 프로그램의 경우 절차적 프로그래밍이 훨씬 쉽게 접근할 수 있다. 객체지향 프로그래밍은 더 큰 프로젝트에 적용된다. 간단하게 이 포스트를 보고있는 웹브라우져를 생각해보자. 일반 사용자가 사용하는 기능만 수백게에 달하며, 백그라운드에서 실행되는 기능들을 포함한다면 몇천개가 존재할텐데 만약 객체의 존재 없이 이 코드를 관리한다면 머리가 빠질거다. 객체지향 프로그래밍이 적용된다면 각기 목적에 맞는 클래스들과, 그 클래스들에 맞는 기능들이 잘 분류되기 때문에 훨씬 쉽게 관리가 가능하다.
그렇다면 클래스(Class)란 무었일까?
우리가 자바 프로그래밍에서 javac 라는 명령어로 .java 파일을 컴파일했을때 출력되는 그 클래스(Class)파일이다 클래스(Class)란 객체 생성을 위한 설계도와 같다. 클래스라는 설계도에 맞춰 객체가 생성(Construct)된다. 이때 생성된 객체를 클래스(Class)의 인스턴스(Instance)라 한다. 당연하게도 java파일에 적힌 모든 코드들이 class파일에 들어있다. Java API는 다양한 목적들을 위한 라이브러리를 제공하고, 라이브러리에는 Date, Math, Arrays등 수천개의 클래스들이 존재한다. 그리고 사용자는 본인만의 객체 생성을 위해 직접 클래스를 생성할 수 있다.
여기서 Encapsulation(캡슐화)이라는 컨셉이 등장하는데, 정보 은닉이라고도 알려진 이 컨셉은 말그대로 사용자에게서 객체가 저장하는 정보(Instance
Fields)들에대한 직접적인 접근을 막고, 메소드(method)를 통한 간접적인 접근만 가능케하여 실제 구현내용을 숨기는것이다. 그리고 객체의 현재 상태(State) 그런 Instance Fields들의 상태이며, method들이 호출하여 state를 변경할수있다. 이 캡슐화라는 속성은 클래스가 데이터를 관리하는법을 변경할 수는 있지만, 사용자 입장에서는 언제나 같은 메소드를 호출하므로 아무런 영향을 받지 않는다.
객체(Object)
앞서 말한 class가 인스턴스화된게 객체(Object)이다. 객체의 사용을 위해서는 3가지 특성을 파악해야한다.- 객체의 습성(Behavior) - 객체를 어떻게 활용하고, 어떤 메소드를 적용 가능한지
- 객체의 상태(State) - 특정 메소드를 호출했을때 어떻게 상태가 변하는지
- 객체의 정체성(Identity) - 동일한 동작과 상태를 가진 다른 객체와 어떻게 구별되는지
같은 클래스에서 인스턴스화된 객체들은 모두 같은 습성을 가지고 있다. 객체의 습성(Behavior)이란 사용자가 어떤 메소드를 호출할수 있느냐에 따라 결정된다. 그리고 각 객체는 데이터들을 저장하는데, 이게 객체의 상태(State)이다. 객체의 상태 변경은 메소드 호출의 결과여야 하고, 그 때문에 객체가 저장하는 데이터들이 모두 동시에 바뀌지는 않는다. 만약 두 객체의 State가 같다해도, 두 객체가 동일하다는것은 아니다. 이는 모든 객체의 정체성(Identity)이 서로 다르기 때문이다
댓글 없음:
댓글 쓰기