Develop/Etc

OOP - 객체 지향 프로그래밍

IJY 2022. 7. 25. 03:39

영어로는 OOP(Object Oriented Programming)이고, 한글로는 객체 지향 프로그래밍이라 불리는 개념에 대해 공부를 진행 후 정리한 게시글입니다.

혹시 틀리거나 한 내용이 있다면 알려주세요!

 

OOP(Object Oriented Programming) 란?

객체 지향 프로그래밍이라는 단어의 의미대로 상태와 기능에 따라 절차적으로 프로그래밍을 하는 방식이 아닌 상태 및 기능들을 갖는 객체들을 정의하고 이러한 객체들을 상호작용 시켜서 동작되도록 프로그래밍을 하는 방식이다.

여기서 절차에 따른 프로그래밍 방식이 절차 지향 프로그래밍이라 부르며 해당 방식을 사용한 프로그래밍 방법이 여러 가지 이유로 단점이 부각되었고, 이를 보완하고자 객체 지향 프로그래밍이 나오게 되었다.

여기서 절차 지향 프로그래밍의 단점을 보완하고자 객체 지향 프로그래밍이 나왔다고 해서 객체 지향 프로그래밍이 더 우수하고 절차 지향 프로그래밍은 안 좋다! 라고 할 수는 없다.

프로그래밍 방식에는 각각의 장단점이 있기에 어떤 경우에는 절차 지향의 프로그래밍이 더 좋을 수 있고, 어떤 경우에는 객체 지향의 프로그래밍이 더 좋을 수 있는 것이다.

 

객체(object) 란?

객체 지향 프로그래밍이 객체를 만들고 상호작용 시켜서 프로그램이 동작하도록 만든다는데.. 그럼 객체는 무엇일까?

자바의 아버지라 불리는 제임스 고슬링의 자바 언어 명세(The java language specification)에 수록된 정의를 따르면

"객체는 클래스 인스턴스 또는 배열이다. (An object is a class instance or an array.)"라고 되어있다.

해당 정의 내용을 본다면 배열은 그나마 알겠지만.. 클래스는 뭐고 인스턴스는 뭘까? 하고 고민하게 될 수밖에 없다.

그렇기에 일반적으로 객체가 무엇인지에 대한 설명으로는 실재하는 어떤 대상 또는 생각할 수 있는 모든 것

어떤한 특징을 갖고 있는 대상을 객체라 지칭할 수 있다.

예를 들어 개개인의 사람은 외모도 다르고 생각도 다르고 살아온 삶도 다르기에 개개인을 객체라고 표현할 수 있다.

 

클래스(class) 란?

그렇다면 클래스란 무엇일까? 클래스는 간단하게 정의하자면 객체를 만들기 위한 "틀" 또는 "설계도" 등으로 정의할 수 있다.

예를 들어 개개인의 사람은 다 다르지만 "사람"이라는 "틀"로 묶을 수 있다. 즉, "사람"이라는 클래스로 정의할 수 있다.

더욱 간단한 예로는 붕어빵을 만들 수 있는 붕어빵 기계를 클래스라고 볼 수 있다.

 

인스턴스(instance) 란?

객체를 만들기 위한 "틀" 또는 "설계도"인 클래스를 사용해서 만들어진 객체를 인스턴스라고 한다.

그렇기에 객체와 인스턴스가 동일하다고 표현이 되기도 하는데, 엄밀하게 따지면 객체가 좀 더 포괄적인 의미이다.

인스턴스는 해당 객체가 어떤 클래스를 사용하여 만들어진 객체인지에 초점을 둔 단어로 보면 된다.

예를 들자면 붕어빵을 만들 수 있는 붕어빵 기계가 클래스이고, 붕어빵 기계를 사용해서 만든 붕어빵이 인스턴스이다.

그리고 객체는 좀 더 포괄적으로 붕어빵 기계도 객체로 볼 수 있다. (붕어빵 기계를 만드는 틀이 클래스가 되고, 붕어빵 기계를 만드는 틀을 이용해서 만든 붕어빵 기계가 인스턴스가 된다.)

인스턴스화(instantiate) 란?

위에서 클래스를 사용해서 만들어진 객체가 인스턴스라고 정의했다.

이때, 클래스를 사용해서 스턴스를 만드는 과정을 인스턴스화라고 한다.

공부를 하면서 왜 과정까지 인스턴스화라는 명칭을 사용하며 정의를 했는지 의문이 들어 고민을 해 보고 낸 답은 아래와 같으며, 해당 부분은 매우 주관적인 생각임을 알려드립니다.

인스턴스는 객체에 속하기 때문에 객체의 특성을 상속받는다.
즉, 객체는 각각이 특징을 갖고 있는 대상을 지칭하기에 인스턴스는 같은 클래스로 만들어졌다고 하더라도 인스턴스 각각 개별 특성을 보유하고 있을 수 있다.
그렇기에 인스턴스를 만드는 과정에 따라서 만들어지는 인스턴스의 특성이 변경이 될 수 있으므로 인스턴스화라는 명칭을 사용하여 정의했을 것 같다.
즉, 이러한 내용을 토대로 예를 든다면 붕어빵 기계를 이용해 만든 팥 붕어빵과 슈크림 붕어빵은 동일한 클래스를 사용해 만든 인스턴스지만 재료가 달라졌기에 각자의 특성이 달라진 인스턴스인 것, 즉 어떤 재료를 사용해 붕어빵을 만드느냐?라는 부분이 인스턴스화라고 본 것이다.

참조

https://upcake.tistory.com/418

https://velog.io/@walker/OOP%EB%9E%80

https://victorydntmd.tistory.com/117

https://docs.oracle.com/javase/specs/jls/se8/html/index.html