본문 바로가기

취업/준비

pure OOP / Java는 왜 pure OOP가 아닐까?

pure OOP


Pure Object Oriented Language 혹은 Complete Object Oriented Language 는 말 그대로 완전히 OOP를 지향하고 관련 기능을 support하는 언어를 말한다.

primitive type의 변수조차 없이 모든 변수가 객체여야 한다는 점이 가장 특징적이다.

아래에서 좀 더 구체적인 pure OOP의 조건을 알아보자.

 

pure OOP의 조건


  1. Encapsulation/Data Hiding 캡슐화/은닉화
  2. Inheritance 상속
  3. Polymorphism 다형성
  4. Abstraction 추상화
  5. All predefined types are objects 이미 작성된 타입이 모두 객체
  6. All user defined types are objects 사용자가 작성하는 것도 모두 객체
  7. All operations performed on objects must be only through methods exposed at the objects.
    모든 연산은 반드시 객체 안에 있는 메소드를 통해

이걸 단적으로 잘 지키는 언어는 Smalltalk라고 할 수 있다.

 

 

왜 Java는 pure OOP 언어가 아닌가?


저 조건들을 대~충 보면 어? 자바도 다 충족하지 않나? 할 수도 있는데(...) 
Java는 위 조건들 중 5번과 7번을 충족시키지 못한다.

 

1. Primitive Data Type의 존재

Java에서는 int, long, bool, float, double, char 등과 같은 기본형 자료 타입이 버젓이 존재하고, 이는 객체로 표현되지 않았다.

pure OOP 언어인 Smalltalk에서는 실제로 기본형 타입들도 object(객체)로 표현해두었다.

 

2. static keyword의 존재

우리가 class를 static으로 선언하면 그것은 object로써 쓰이지 않을 수도 있다.

예를 들어, static function이나 static variable에는 class에 dot(.)을 붙여 인스턴스 없이 바로 접근할 수 있다. 이런 점이 pure OOP 스럽지 않다고 할 수 있다.

 

3. Wrapper Class의 한계

우리가 Wrapper Class로 선언한 Integer 인스턴스를 가지고 자유롭게 (int의 도움 없이) 사칙연산을 할 수 있지 않다.

public class BoxingExample  { 
    public static void main(String[] args)  { 
            Integer i = new Integer(10); 
            Integer j = new Integer(20); 
            Integer k = new Integer(i.intValue() + j.intValue()); 
            System.out.println("Output: "+ k); 
    } 
}

위 코드의 문제점

  1. Integer 인스턴스를 만들 때 사용되는 10, 20이 Java에게는 int형이다.
  2. 덧셈을 할 때도 바로 할 수 없고 .intValue()를 통해 int형으로 변환하여 사용

 

다시 말하자면, i + j를 바로 할 수 없고, .intValue()를 통해 int형으로 변환하여 사칙연산을 수행해야 하는 문제가 있다.

Java는 Autoboxing, Unboxing을 수행하여 내부적으로 기본형으로 변환하여 사용하기 때문에, Wrapper Class를 사용했다고 해서 pure OOP 스러워지는 것은 아니다.

결과적으로, Java에서는 Wrapper Class 안에 존재하는 메소드만을 이용하여 사용할 수 없고, 기본형에 의존하여 연산하기 때문에 7번 조건에 어긋난다.

 

 

 

 

 

 References