본문 바로가기
프로그래밍/C++

OOP 알아보기

by Nessie! 2022. 8. 8.
해당 게시글은 공부용으로 작성된 글로, 틀린 정보가 있을 수 있습니다.

 

OOP란? (Object-Oriented Programming, OOP)
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 
‘객체’들의 상호작용(메시지 주고받기, 데이터 처리 등)으로 프로그램 로직을 구성하는 프로그래밍 패러다임이다.

즉, Objects의 개념으로 프로그래밍을 하는 방식을 말하며, 
이때 Objects는 fields와 methods를 포함한다.

(프로그래밍 패러다임은 간단히 말해, 코드를 어떻게 작성할지 생각하는 것이라고 볼 수 있다.)


위 내용을 쉽게 풀어서 말하면,
각 객체를 생성해 객체들이 알아서 정해진 일을 수행하는 방식으로 프로그래밍하는 개념이라고 볼 수 있다 (주관적인 해석으로 틀릴 수 있음)


OOP의 특징
1. 캡슐화 (Encapsulation)
한 객체가 특정한 하나의 목적을 위해 필요한 데이터나 메소드를 하나로 묶는 것을 의미한다.
즉, 변수와 함수를 하나로 묶는 것을 포함하며, 캡슐화를 함으로써 은닉화 또한 진행된다.

2. 은닉화 (Information hiding)
캡슐화를 할때, 데이터를 외부에서 접근하는 것을 방지하고 오로지 함수를 통해서만 접근할 수 있게 하는 것을 의미한다.
이때 접근 제한자(접근 변경자)를 통해 접근을 제한한다.

접근제한자
public
public의 뜻은 '공개적인'이라는 뜻을 갖고있으며,
public으로 선언된 데이터 멤버 및 멤버함수는 다른 클래스에서도 접근이 가능한 특징이 있다.
public 멤버는 . 연산자를 사용하여 프로그램의 아무곳에서나 액세스 할 수 있다.
구조체 생성 시 디폴트로 지정 됨.

private
클래스 멤버를 private으로 선언하면 해당 멤버는 클래스 외부의 모든 객체나 함수에서는 직접 접근할 수 없으며, 
오직 클래스 내부에서만 접근이 가능하다.
클래스 생성 시 디폴트로 지정 됨.

protected
protected 제한자는 private 제한자와 비슷하게 클래스 외부에서는 protected 멤버에 접근할 수 없지만 
해당 클래스의 하위 클래스(파생된 클래스, 자식 클래스)에서는 접근할 수 있는 특징이 있다.

3. 상속 (Inheritance)
기존 메소드와 변수를 물려받되, 필요한 기능을 더 추가하거나 나(자식클래스)에게 맞게 재정의하는 방법이다.
객체를 상속받은 객체는 자식, 상속된 객체는 부모라고 부른다.

4. 추상화 (Abstraction)
공통의 속성이나 기능을 묶어 이름을 붙이는 것이다
또한, 목적과 관련이 없는 것을 제거하고 필수적인 요소만을 표현해 둔 것을 말한
보통 객체 지향 프로그래밍에서 클래스를 정의하는 걸 추상화라고 생각하면 된다.
- 캡슐화는 정보은닉 효과가 있기 때문에 차이점이 있다.

5. 다형성 (Polymorphism)
하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있다는 것을 뜻한다
같은 모양의 코드가 다른 행위를 하는 것을 말한다.

 

개념을 이해하기 쉽게 일상생활에서의 상황을 예시로 들어보면

 

우리가 핸드폰에 있는 키패드로 다이얼을 누르기도 하고, 문자를 하기도 하며, 
심지어 게임을 하는 것까지 가능한 것처럼 모양은 같은데 다른 기능을 수행하는 것은 
디바이스 기반의 다형성의 한 예라고 할 수 있다.

출처: https://brunch.co.kr/@kd4/4

 


위 개념을 프로그래밍에서 사용한다면 아래 두 가지의 경우가 있다.
- Overriding : 오버 라이딩은 슈퍼클래스를 상속받은 서브 클래스에서 슈퍼 클래스의 (추상) 메소드를 같은 이름, 같은 반환 값, 같은 인자로 메소드 내의 로직들을 새롭게 정의하는 것을 말한다.
오버라이딩은 간단하고 쉽게말하면 다시쓰기 정도로 볼 수 있다.
- Overloading : 오버 로딩은 하나의 클래스에서 같은 이름의 메소드들을 여러 개 가질 수 있게 한다. 단, 메서드 인자들은 달라야 한다.
오버로딩은 간단히 본다면 겹쳐쓰기정도로 볼 수 있을 것 같다.

'프로그래밍 > C++' 카테고리의 다른 글

생성자와 소멸자  (0) 2022.08.18
정적변수(static variable)  (0) 2022.08.17
C++ vector  (0) 2022.07.27
STL  (0) 2022.07.27
[C++] 연산자 우선순위에 대한 정리  (0) 2022.06.29

댓글