개발을 시작하는 이야기

객체지향 프로그래밍 정리 본문

개발 이야기/Flutter

객체지향 프로그래밍 정리

Teiresias 2024. 6. 14. 20:15

얼마전에 면접을 갔는데 분명 알고 있던건데 설명을 할 수 없었다.
긴장했다고 하지만 이정도도 설명을 못했다면 내가 제대로 알고 있지 않았다는 반증이기도 해서
아주 기본부터 명확하게 정리하고 넘어가려고 한다.


절차지향 프로그래밍 객체지향 프로그래밍

절차지향 프로그래밍

절차지향 프로그래밍은 데이터를 입력받아 순서대로 처리하고 결과를 도출하는 방식으로 대표적인 예로는 C언어가 있다.
개체를 순차적으로 처리하여 프로그램 전체가 유기적으로 연결되어야 한다. 주로 자동차 제조를 예로 드는데, 자동차를 만들때 엔진, 차체, 핸들, 의자, 바퀴 순으로 차례로 조립을 해야만 한다. 서로 분리되어도 안되고 순서가 달라도 안된다. 객체의 호출과 실행이 직접적이기 때문에, 프로그램의 성능이 빠르다. 하지만 핸들을 교체하기 위해서는 엔진부터 시작해서 바퀴까지 전부 수리해야 하는 비효율적인 상황이 발생하게 된다.
 

객체지향 프로그래밍

객체지형 프로그래밍은 데여러 독립적인 부품들의 조합이 유기적으로 결합되어 동작하는 프로그래밍 방식이다. 동일하게 자동차를 만들어도 조립의 순서에 상관없이 수많은 부품을 결합해 하나의 완전한 자동차를 만들어내는 것이다. 객체 지향적으로 소프트웨어를 설계한다는 말의 의미는 프로그램의 작은 부품, 즉 작은 객체를 먼저 만들고 이렇게 만들어진 여러 객체들을 조립해 하나의 완성된 프로그램을 만드는 것이다.
 

 절차지향 프로그래밍객체지향 프로그래밍
장점빠른 속도
구조가 컴퓨터의 처리구조와 유사하기 때문에 실행 속도가 빠르다
재사용성
상속이 가능하기 때문에 코드를 재사용할 수 있어 편리하다.

생산성 증가
각각의 객체가 독립적으로 이루어져 있기 때문에 생산 및 유지 보수가 용이하다.

자연스러운 모델링
객체지향은 사람의 사고와 닮았기 때문에 자연스럽게 구현할 수 있다.
단점유지보수의 어려움
모든 구성 요소가 유기적으로 연결되어있기 때문에 하나에 문제가 발생하게 되면 일부가 아닌 전체를 손보아야 한다

엄격한 실행 순서
실행 순서가 정해져 있기 땜누에 코드의 순서가 변경되기만 해도 동작이 안되거나 결과가 달라지게 된다.
느린 개발 속도
모든 객체의 역할과 기능을 이해하고 작성해야 하기 때문에 많은 시간이 소요된다

높은 난이도
객체지향언어는 대체로 난이도가 높다.

 

객체(object)란

객체는 객체지향 프로그래밍의 가장 기본적인 단위이다. 객체 지향 개념의 가장 기본적인 전제는 세계는 객체들로 구성되어 있으며, 모든 현상과 발생하는 사건은 객체들 간의 상호작용을 통해 발생한다는 것이다. 그렇다면 객체란 무엇일까? 주변에 눈에 보이는 모든 실제하는 대상 을 객체라고 할 수 있다. 더불어 우리 눈에 보이지 않는 유형들 논리, 사상, 철학, 개념, 공식등과 같은 무형의 대상들도 포함될 수 있다.

class Movie {
	String director;
    String genre;
	String actor;
    int release;
    bool awards;
    
    void startFilming () {
    	print('영화 촬영을 시작합니다.🎥');
    }
    
    void movieEditing() {
    	print('영화 편집 시작합니다.🎞️');
    }
    
    void movieRelease() {
    	print('영화를 개봉합니다.🎉');
    }
}

 
 
각각의 객체를 추상화 시켜 속성(state)과 기능(behavior)으로 분류한 후에 이것을 다시 각가의 변수(variable)와 함수(function)으로 정의하고 있다. 
 

객체지향 프로그래밍의 특징

캡슐화(Encapsulation)

캡슐화란 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것을 말한다. 따라서 클래스를 만들 때 훗날 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록 사용해야할 변수와 그 변수를 가지고 특정한 액션, 즉 메서드를 관련성 있게 클래스에 구성하여야 한다. 그리고 캡슐화를 진행하며 얻을수 있는 장점은 바로 정보은닉이다.
유저 정보를 가지고 있는 객체에서 유저의 정보가 Public으로 선언되어 있다면 누구든 유저 정보에 접근하여 변경할 수 있다. 그렇기 때문에 private로 선언해 데이터를 보호하고 접근을 제한해야 한다. 이렇게 보호된 정보는 getter나 setter 등의 메서드를 통해서 간접적으로만 접근이 가능하도록 하는것이 캡슐화의 목적이다.
 

추상화(Abstraction)

추상화는 중요하고 필요한 정보만을 표현하기 위해서, 객체의 공통적인 속성과 행위를 하나로 묶는것을 의미한다. 추상적으로 생각해 일단 큰 틀의 클래스를 구현하고 최소한의 공통적인 요소나 필수적인 요소를 만든것이 추상화 클래스이다. 예를들어 영화와 드라마, 예능들을 보면 공통의 요소를 추출할 수 있다. 감독과 배우, 장르등 필수적인 요소들로 부터 촬영시작, 방영시작 등의 메서드등을 추출하여 추상화 하는 것이다. 객체들은 실제 그 모습이고 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 객체이다. 
 

다형성(Polymorphism)

다형성은 객체가 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다. 즉, 형태는 같지만 다른 기능을 하는 것을 의미한다. 이를 통해서 코드의 재사용성을 높이게 된다.  사람이 가족과 친구 직장 혹은 학교에서 각각 다른 모습을 가지는 것과 비슷하다고 할 수 있다.
 

Overriding & Overloading

객체지향에서 다향성의 개념을 녹여내는 방법은 두가지가 있는데 바로 오버라이딩(Overriding)과오버로딩(Overloading)이다.
Overriding
 - 부모 클래스에서 상속받은 자식 클래스에서 부모 클래스에서 만들어진 메서드를 자식 클래스에서 자신의 입맛대로 다시 재정의해서 사용하는것
Overloading
 - 같은 이름의 메서드를 사용하지만 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념이다.
 - 하나의 클래스 안에 같은 이름을 가진 함수를 여러개 만들수 있게 해준다. 구분을 위해 함수의 인자들이 달라야 한다.

상속성(Inheritance)

상속은 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념이다. 기존 클래스에 기능을 가져와 재사용할 수  있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어준다. 즉, 클래스 간 공유하는 속성과 기능을 반복적으로 정의할 필요 없이 한번만 정의해두고 간편하게 재사용 할 수 있어 반복적인 코드를 최소화 하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있도록 한다.
 
영화 클래스와 드라마 클래스가 있을때, 두 클래스는 모두 엔터테이먼트에 속해있다. 엔터테이먼트에는 여러 속성들이 정의되어 있는데, 영화와 드라마는 이러한 속성을 갖고 있다. 하지만 두 클래스는 많은 부분이 다르기 때문에 나눠둔 것이다. 엔터테이먼트 클래스의 속성은 영화 클래스와 드라마 클래스에 상속을 해주는데 이러한 상속이 코드의 중복을 해결해준다.
 
코드의 중복이 많으면 개발 단계에서도 많은 비용을 만들지만, 유지 보수 에서도 많은 비용이 들게 만든다. 그래서 개발 단계에서 코드 중복은 반드시 피해야 한다.
 
이로써 객체지향 프로그래밍의 기본적인 개념을 알아보았다.
나중에 누군가 물어보면 잘 설명할수 있길

'개발 이야기 > Flutter' 카테고리의 다른 글

Flutter의 상태관리 02  (0) 2024.06.16
Flutter의 상태관리 01  (0) 2024.06.15
Android Google Cloud용 SHA-1 생성  (0) 2024.06.05
BuildContext  (0) 2024.01.14
Stateless 그리고 Stateful  (0) 2023.11.06