객체지향 프로그래밍에 대한 이해

Ji Yeon Park·2020년 11월 22일
3
post-thumbnail

✅ 객체지향이란?

✔️ 객체지향은 Object Oriented Programing으로 프로그래밍을 더 쉽게 할 수 있도록 만들어진 프로그래밍 방식, 패러다임을 뜻한다.

좀 더 구체적으로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.


✅ 객체지향의 구성

✔️ 객체지향 프로그래밍(OOP) 에서는 모든게 객체(object)로 구성되어 있다.
먼저 서로 관계가 있는 속성과 기능들을 묶어 클래스로 정의하고, 클래스를 가지고 우리가 실제 사용할 객체를 만든다.
여기서 데이터와 기능이 클래스로 '캡슐화'된 컴퓨터 자원의 묶음을 '객체'라고 하며 OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다.

▶️ 객체 : 객체(또는 인스턴스)란 대상을 나타내는 단어로 상위 클래스의 속성을 가지고 있으면서 개별적인 특성과 행위(Method) 또한 가지고 있다.
▶️ 클래스 : 객체들이 공통적으로 갖는 속성들을 모아서 정의내린 것으로 다른 클래스들과 독립적으로 디자인해야 한다.
▶️ 메서드 : 클래스로부터 생성된 객체를 사용하는 방법으로 객체의 속성을 조작하는 데 사용된다.

객체와 클래스는 붕어빵과 붕어빵을 찍는 기계라고 많이 표현된다.
붕어빵을 찍어내는 기계는 붕어빵이라는 객체들을 생성하기 위한 틀을 제공하기 때문에 클래스라 표현할 수 있고, 붕어빵 틀에서 만들어진 붕어빵들은 각각이 객체가 된다고 볼 수 있다.

*️⃣ 객체지향 프로그래밍 예시


▶️ 절차지향 프로그래밍을 따르게 된다면 1) 반복문을 쓰고, 2) 함수 또는 메소드를 사용해서 해야할 일들을 정의해주게된다. 하지만 여기서 범위가 더 넓어질경우 반복문, 함수 또는 메서드로만 코드를 간편하게 정의하는데 한계가 있다. 절차지향 프로그래밍은 프로세스가 함수 단위 순서대로 진행된다.

▶️ 객체지향 프로그래밍의 경우 각각의 대상에게 클래스로 정의한 아이템과 동작들을 할당해줘서 데이터와 기능을 클래스로 캡슐화게 된다.


✅ 객체지향의 캡슐화

✔️ 캡슐화(Encapsulation)는 객체의 데이터를 외부에서 직접 접근하지 못하게 막고, 함수를 통해서만 조작이 가능하게 하는 작업이다.

✔️ 높은 응집도와 낮은 결합도를 유지 할 수 있도록 설계해야 요구사항을 변경할 때 유연하게 대처할 수 있다.
▶️ 응집도 : 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타낸다.
▶️ 결합도 : 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지를 나타낸다.

*️⃣ 객체지향의 은닉성

내부구조는 클래스에서만 사용하기 위해 private으로 감춰놓고 외부에서 조작할 수 있는 명령어만 public으로 공개한다. 이는 바깥의 간섭으로 발생하는 오류를 방지할 수 있고 남이 만든 클래스의 객체들을 일일이 뜯어볼 필요 없이 제공되는 기능 그대로 사용할 수 있다.

>  변하기 쉬운것은 외부의 영향을 받지 않게 Private으로 감추고 변경될 일이 적은 것은 public으로 나타낸다.

ex) 리모콘을 사용할 때 사용자는 리모컨 외부 속성만 사용하고 내부 구조가 어떻게 생겼는지는 알 필요가 없기 때문에 Private으로 숨겨준다.


✅ 객체지향의 상속

✔️ 프로그래밍에서의 상속(Inheritance)은 부모의 특징을 물려받는 것으로 부모 클래스가 어떠한 속성이나 기능을 가지고 있다면 그 자식의 클래스도 부모의 속성이나 기능을 상속받게 된다.

자식 클래스 입장에서 보면 부모 클래스의 속성을 물려받는 것이지만 반대로 부모 클래스의 입장에서 보면 자신의 속성들이 자식 클래스로 넘어가면서 확장되는 것이라고도 볼 수 있다.

*️⃣ 객체지향 상속의 특징

▶️ 프로그래밍 언어에서 상속은 <extends>로 표현된다.
▶️ 상속을 통해 코드의 중복같이 불필요한 코드들을 제거할 수 있기 때문에 코드의 복잡도가 줄어든다.

*️⃣ 객체지향 상속의 예시

▶️ '교실청소팀' : 상위, 부모 클래스.
▶️ '과학실청소팀' : '교실청소팀'으로부터 필요한 것들을 더 추가한 자식 클래스.
과학실청소팀이 교실청소팀을 상속받는다고 정의하면 과학실청소팀은 교실청소팀의 protected나 public으로 지정한 변수들과 메서드들을 그대로 물려받게된다. 이 후, 과학실청소팀에 필요한 변수나 메서드 같이 '과학실청소팀'에게만 필요한 것들을 따로 추가하면 된다.

*️⃣ 객체지향의 위임(delegation)

✔️ 클래스의 일부만 사용하거나 기능을 재사용 하고 싶은 경우 위임을 사용한다.
위임은 자신이 직접 기능을 실행하지 않고 다른 클래스의 객체가 기능을 실행하도록 위임하는 것으로
상속관계는 클래스 사이의 관계지만 위임은 객체 사이의 관계이다.

✔️ 위임을 사용해 상속을 대신하는 과정
▶️ 자식 클래스에 부모 클래스의 인스턴스를 참조하는 속성을 만든다.

> 이 속성 필드를 this로 초기화한다.

▶️ 자식 클래스에 정의된 각 메서드에 1번에서 만든 위임 속성 필드를 참조하도록 변경한다.
▶️ 자식 클래스에서 일반화 관계 선언을 제거하고 위임 속성 필드에 부모 클래스의 객체를 생성해 대입한다.
▶️ 자식 클래스에서 사용된 부모 클래스의 메서드를 추가하고 해당 메서드에도 속성 필드를 참조하도록 변경한다.
▶️ 컴파일하고 잘 동작하는지 확인한다.

👉 위임을 사용해 상속을 대신하는 과정 더 자세히 알아보기


✅ 객체지향의 다형성


예를들어 여러 종류의 자동차가 있을 때, 자동차의 외향이나 연비, 세부 옵션들은 다를 수 있다 하더라도 엑셀을 밟으면 앞으로 가는 기능은 동일하다. 따라서 한 대의 자동차를 운전하는 방법을 배웠다면 다른 차를 운전할 수도 있다. 동일한 드라이버 인터페이스를 가지기 때문이다.

이와 같은 원리로 OOP는 여러 가지 객체 유형이 서로 다른 방식으로 작동하더라도 공통 인터페이스에서 지원하는 동일한 기능을 구현할 수 있다.

✔️ 다형성(Polymorphism) 은 어떤 하나의 변수명이나 함수명이 상황에 따라 다르게 해석되는 것 또는 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력 그리고 형태가 같은데 다른 기능을 하는 것을 의미한다. 다형성은 어떤 한가지 기능을 의미하는 것이 아니라 개념이기 때문에 여러가지 방법으로 표현할 수 있다.

*️⃣ 다형성을 위한 대표적인 기능

▶️ 추상 클래스 : 추상클래스란 추상 메서드를 포함하고 있는 클래스로 선언할 때 다음과 같이 선언한다.

> abstract class 클래스 이름 { .... } 

▶️ 추상 메서드 : 추상 메서드는 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것으로 설계만 하고 실제 수행될 내용은 작성하지 않는다. 이는 메서드를 상속받는 클래스에 따라 내용이 달라질 수 있기 때문에, 조상부에서는 선언만 하고, 주석으로 어떤 기능을 하는지만 알려 주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것이다.

> abstact 리턴타입 메서드 이름 ();

▶️ 인터페이스 : 인터페이스는 일종의 추상클래스로서 추상클래스처럼 추상메서드를 갖지만, 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
▶️ 오버라이딩 : 부모 클래스로부터 상속을 받은 속성에 대해, 자식 클래스에서 물려받은 속성을 재정의 하는것.
▶️ 오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.


✅ 객체지향의 추상화

✔️ 추상화(Abstraction)는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념으로
프로그래밍의 관점에서 본다면 프로그래머의 의도에 맞추어 가장 중요한 것들만 뽑아서
복잡한 모델을 보다 단순한 모델로 변환하는 작업이라고 말할 수 있다.
추상화는 각 개체의 구체적인 개념에 의존하지 말고 추상적 개념에 의존해야 설계를 유연하게 변경할 수 있다

▶️ 객체지향 프로그래밍에서 어떠한 기능들을 구현할 때 많은 재료들이 필요하고 그 관계도 복잡한데 이 복잡한 것들을 어떤 객체의 이름으로 추상화 시켜서 내부 메소드의 구현이 어떤지 몰라도 사용자가 사용하기 쉽게 만들어 주는 것이 추상화로, 객체들의 공통된 특징, 즉 추상적 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있다.

자동차예시를 빌려오면 엔진이 어떻게 돌아가고 연료가 어떻게 사용되고 속력은 어떻게 올리고 타이어는 어떤 원리로 돌아가는지 이해하지 못해도 '운전대' '브레이크' '가속페달' 같이 추상화 되어있는 인스턴스 즉 객체를 사용하기만 하면 되는 것이다.

여기서 또 중요한 점은 운전자에게 노출되어있는 부분이 적으니, 운전자가 엔진이 돌아가는 방식이나 연료가 연소되는 방법 등 을 개조해버리는 위험성이 줄게된다. 즉, 추상화는 인터페이스를 간단하게 만들어주고 어떠한 변화의 영향이 줄어들게 된다.


✅ 객체지향의 장단점

*️⃣ 객체지향의 장점

✔️ 코드 재사용이 용이하다
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.
✔️ 유지보수가 쉽다
절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정하면 된다.
✔️ 대형 프로젝트에 적합
클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉽다.

*️⃣ 객체지향의 단점

✔️처리속도가 상대적으로 느리다.
✔️객체가 많으면 용량이 커질 수 있다.
✔️설계시 많은 시간과 노력이 필요하다.


출처 :
1) 얄코 - 객체지향 프로그래밍이 뭔가요? : https://www.yalco.kr/16_oodp/
2) https://gmlwjd9405.github.io/2018/07/05/oop-features.html
3) https://victorydntmd.tistory.com/117
4) https://evan-moon.github.io/2019/08/24/what-is-object-oriented-programming/

profile
Frontend Developer

1개의 댓글

comment-user-thumbnail
2023년 12월 25일

Gamers from different corners of the world Dinosaur Game can join forces or compete against each other, breaking down geographical barriers and fostering a sense of camaraderie.

답글 달기