Search
Duplicate
🌱

OOP (객체 지향 프로그래밍)

간단소개
C++ 과제 하기전에 OOP에 대해서 알아보자
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
개발지식
Scrap
태그
Object Oriented Programming
9 more properties

OOP (Object Oriented Programming)

프로그램 설계 방법론이자 개념의 일종이다.
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법
객체 : 현실 세계에 존재하는 하나 하나의 독립된 무언가

OOP의 장점

코드의 재사용성 증가
상속을 통하여 프로그래밍시 코드의 재사용성을 높일 수 있다.
자연적인 모델링
우리 일상생활 모습의 구조가 객체에 자연스럽게 녹아있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.
유지보수의 우수성
프로그램 수정, 기능 추가를 하더라도 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉽다.
대형 프로젝트에 적합
클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트를 개발할 때 업무 분담이 쉽다.

OOP의 단점

개발 속도가 느리다.
객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계부터 많은 시간이 소모된다.
코드의 난이도 상승
상속이라는 개념은 뛰어나지만 복잡한 특성을 지니게 된다. 상속 덕분에 자료분석, 개발시간 단축, 정확한 코딩을 보증하지만 코드의 난이도가 상승한다. 상속이 복잡하게 얽혀있으면 소스 분석이 어려워진다. (라자냐 코드)
처리 속도가 느리다.
개념을 기준으로 나누다 보니 반복 연산이 컴퓨터 친화적이지 않고, 배열 자료구조를 적용하기 힘들어진다.
객체를 하나씩 따로 캡슐화 시키고 상속시 부모만 같으면 자식의 종류를 신경쓰지 않다 보니 각자의 메모리 크기가 달라지며, 고정된 연속 메모리에 담을 수 가 없게 된다.
메모리 할당을 배열로 하지 못하게 되므로 따로따로 생성하게 되고, 생성과 파괴가 반복되면 메모리 단편화라는 문제가 생긴다. 가비지 컬렉션 기능이 만들어진 이유 중 하나.
연속 메모리를 쓰기 힘들어 진다는 것은 캐시의 효율적 사용에 큰 문제가 생긴다는 뜻과 같다.
이를 해결하는 코딩 패러다임으로 DOP(Data Oriented Programming)가 있고, 구현방법은 메모리 풀

클래스와 인스턴스(객체)는 무엇인가?

Class : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것으로 객체를 만들기 위한 메타 정보라고 볼 수 있다.
Instance (Object) : 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터

OOP의 특징

객체 지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 연관 있는 처리 부분(함수)과 데이터 부분(변수)을 하나의 객체로 묶어 생성해 사용한다는 점이다.
크게 캡슐화, 추상화, 상속, 다형성 네가지 특성이 있다.

캡슐화 (Encapsulation)

변수와 함수를 하나의 단위로 묶는 것을 의미한다. 즉, 데이터의 번들링(bundling)이다.
프로그래밍 언어에서 이 번들링은 Class를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드에 쉽게 접근할 수 있다.
캡슐화의 중요한 목적은 변수를 private로 선언하여 데이터를 보호하고, 보호된 변수는 getter나 setter등의 메소드를 통해서만 간접적으로 접근을 허용하는 것이다.
캡슐화를 하면 불필요한 정보를 감출 수 있기 떄문에, 정보은닉을 할 수 있다는 특징이 있다.
객체 지향 프로그래밍에서 기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는것이 캡슐화다.
정보 은닉 (Information Hiding)
프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다 .
내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높이는 개념이다.
클래스의 외부에서는 노출된 특정 메소드에만 접근이 가능하며 클래스 내부에서 어떤 식으로 처리가 이루어지는지는 알지 못하도록 설계된다.
접근 제한의 종류
public : 클래스 외부에서 사용 가능하도록 노출시킨다.
protected : 다른 클래스에게는 노출되지 않지만, 상속받은 자식 클래스에게는 노출된다.
private : 클래스의 내부에서만 사용 가능하며, 외부로 노출되지 않는다.
정보은닉은 캡슐화로부터 파생된 보조 개념이다. 정보은닉 ≠ 캡슐화

추상화 (Abstraction)

추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.
실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악해 필요없는 특성을 제거하는 과정을 가르킨다.
객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.
추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라고 할 수 있다.

상속 (Inheritance)

기존 상위 클래스의 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있는 것이다. 즉, 부모의 특징을 자식에게 모두 물려주고, 자식에서 수정 가능하다.
OOP에서 이를 부모 클래스, 자식 클래스라고 표현한다. 상속의 필요성은 코드의 중복을 없애기 위해서이다.
코드의 중복이 많아지면 개발 단계와 유지 보수에서 많은 비용이 들게 된다.
상속관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.

다형성 (Polymorphism)

하나의 변수, 함수가 상황에 따라 다른 의미로 해석될 수 있는 것.
서브타입 다형성 (subtype polymorphism / subtyping)
기초 클래스 또는 어떠한 인터페이스를 구현하는 상위 클래스를 생성하고, 해당 클래스를 상속받는 다수의 하위 클래스를 만들어 상위 클래스의 포인터나 참조 변수 등이 하위 클래스의 객체를 참조하게 하는 것이다.
이 때 각각의 하위 클래스는 상위 클래스의 메소드 오버라이딩을 수행하며, 상위 클래스의 참조 변수가 어떤 하위 클래스의 객체를 참조하느냐에 따라 호출되는 메소드가 달라진다.
매개변수 다형성 (parametric polymorphism)
타입을 매개변수로 받아 새로운 타입을 되돌려주는 기능이다.
타입 매개변수를 정의한 클래스 혹은 메소드는 사용할 때 매개변수에 타입을 지정하게 되며, 컴파일 시 지정한 타입에 따라 다르게 해석된다.
템플릿 (template)
C++에서 사용하는 개념, 타입 매개변수를 입력한 타입으로 치환한 코드를 생성하는 방식이다.
제네릭 (generic)
Java와 C#에서 사용하는 개념, 지정한 타입 매개변수에 해당하는 타입만을 사용하겠다고 약속하는 방식이다.
임시 다형성 (ad hoc polymorphism)
Overloading
하나의 클래스 안에서 같은 이름의 메소드를 사용하지만 각 메소드마다 다른 용도로 사용되며 결과물도 다르게 구현하는 것을 말한다. 메소드들의 이름은 같지만 매개변수의 개수, 타입이 달라야 한다.
Overriding
하위 클래스가 상위 클래스에서 만들어진 메소드를 재정의하여 사용하는 것을 말한다.
강제 다형성 (coercion polymorphism)
묵시적 형 변환 (implicit type coercion)
double a = 30; 가 실행되면 int형 값 30은 double로 묵시적 형 변환이 이루어진다.
double은 int보다 크기가 큰 자료형이고, 이러한 형 변환을 자료형 승급 (type promotion)이라고 한다.
명시적 형 변환 (explicit type coercion)
double a = (double)30 은 위와 동일한 결과를 내지만, (double)을 통해 int형 값이 double형으로 변환됨을 명시적으로 표현하였다.

직렬화(Serialization) / 역직렬화(Deserialization)

네트워크 통신 → 7bit ASCII 코드로 전송
Serialization
서버나 다른 프로그램에 전송하기 위해 객체를 바이트 코드로 복사하는 작업
메모리상의 객체 정보를 ASCII 코드화를 하는 것
Deserialization
수신자 쪽에서 받은 바이트 코드를 다시 객체로 변환하여 사용하는 작업
ASCII코드를 다시 객체화 하는 것
이 기능으로 클라이언트와 서버는 객체로 주고 받을 수 있다.
객체 정보를 그대로 전송하기 때문에 송신자와 수신자 모두 해당 객체가 있는 라이브러리 파일이 있어야 하고 아무 객체나 역/직렬화 할 수 없고 Serializable 특성이 있는 클래스만 가능하다.

정리

OOP는 어떤 대상을 추상화(Abstraction)하여 공통점을 찾고, 그것을 캡슐화(Encapsulation)해 한군데에 모아 객체를 만들고, 새로운 객체가 상속(Inheritance)받아 재사용이 가능하게 만들어 준다.
상속 받은 객체는 다형성(Polymorphism)을 통해 기능을 수정 또는 추가하여 재사용 할 수 있다.

참고 사이트