객체지향 프로그래밍은 우리가 개발하면서 지겹도록 듣는 단어이다.
클래스를 통해 데이터와 어떠한 기능 & 행위를 묶어 관리하는 프로그래밍 패러다임이다.
객체지향 프로그래밍은 널리 사용되는 패러다임으로써, 클래스를 통해 데이터와 기능 & 행위를 구조화하는 것을 뜻한다.
비교적 최근 데이터 지향 프로그래밍 (Data Oriented Programming)이란 새로운 개념이 등장하게 되었고, 과연 객체지향 프로그래밍과 DOP는 어떤 차이가 있는지 그리고 어떤 연관을 지을 수 있을지 살펴보는 것이 글의 목적이다.
OOP은 다들 알다시피 캡슐화, 상속, 추상화, 다형성 등의 특징을 가진다.
클래스 단위로 기능을 구성하고, 해당 객체를 통해 프로그램을 구성하는 것이 객체지향의 본질이라고 할 수 있다.
중요한 점은 성능 최적화에 집중한다는 것이다. 캐시 효율성을 높여 연산 속도를 빠르게하고, 병렬처리를 통해 다중 스레드 프로세스의 성능을 극대화할 수 있다.
위에 설명한 특징을 토대로 결론을 내리자면 결국 성능차이다. 예제를 살펴보자.
임의의 서점을 운영하고, 판매된 책이 100만권이라고 가정하고 가장 많이 매출이 남은 책의 가격은 얼마인지 계산해보는 시나리오다. (원할한 비교를 위해 책의 가격과 수량은 임의로 배정)
/**
* OOP 예제
*/
class Item {
public String Book;
public int price;
public int number;
public Item(String book, int price, int number) {
Book = book;
this.price = price;
this.number = number;
}
public int SellingBooks() {
return this.price * this.number;
}
}
/**
* DOP 예제
*/
class DataItem {
private static final int IDX = 1000000;
private int currentIndex = 0;
public String[] book = new String[IDX];
public int[] price = new int[IDX];
public int[] number = new int[IDX];
public void add (String book, int price, int number) {
this.book[currentIndex] = book;
this.price[currentIndex] = price;
this.number[currentIndex] = number;
currentIndex++;
}
public int getMaxSellingBooks() {
int maxPrice = 0;
for (int i = 0; i < this.currentIndex; i++) {
if (maxPrice <= this.price[i] * this.number[i]) {
maxPrice = this.price[i] * this.number[i];
}
}
return maxPrice;
}
}
add() 메소드 호출시 효과적으로 인덱스를 찾아 데이터를 가공할 수 있다.실제로 어느정도 차이가 있을까.
OOP time : 10067958
DOP time : 4782375
위 예제에서 DOP 방식이 약 2배정도 빠르다는 것을 확인할 수 있다.
일단, 웹&앱 개발에서 나노초 단위까지 성능문제를 다룰 일이 극히 적은 것이 원인으로 생각된다.
큰 차이를 체감할 수 없기 때문에 객체지향이 가지는 가독성과 유지보수의 편리함을 더 중요하게 생각하는 것이 더 효율적인 것이다.
참고자료