본문 바로가기
게임 개발 일지/내일배움캠프 TIL

[C#] 객체지향(OOP)과 객체지향의 특징 4가지

by 빛하_ 2024. 2. 7.

 

기술면접 대비하기 #9

 

객체지향이란?

컴퓨터 프로그램을 어떤 데이터를 입력받아 순서대로 처리하고 결과를 도출하는 명령어들의 목록으로 보는 시각에서 벗어나 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미한다. 객체를 먼저 만들고 이렇게 만들어진 여러 객체들을 조립해서 하나의 완성된 프로그램을 만드는 프로그래밍 방법론이다.

 

객체지향의 특징은?

객체 지향적 설계를 통해서 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다. 소프트웨어를 설계할 때 객체 지향적 원리를 잘 적용해 둔 프로그램은 각각의 부품들이 각자의 독립적인 역할을 가지기 때문에 코드의 변경을 최소화하고 유지보수를 하는 데 유리하다. 나아가, 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현할 수 있다. 또한 객체 지향 프로그래밍은 실제 우리가 보고 경험하는 세계를 최대한 프로그램 설계에 반영하기 위한 지속적인 노력을 통해 발전해왔기 때문에, 보다 인간 친화적이고 직관적인 코드를 작성하기에 용이하다. 

 

객체 지향 프로그래밍의 4가지 특징 추상화, 상속, 다형성, 캡슐화이다.

 

* 객체의 분류

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

 

1. 추상화

객체의 공통적인 속성과 기능을 추출하여 정의하는것.

불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현.

추상화를 구현할 수 있는 문법 요소로는 추상 클래스(abstract class) 인터페이스(interface)가 있다.

객체 지향적 설계에 있어서 인터페이스는 어떤 객체의 역할만을 정의하여 객체들 간의 관계를 보다 유연하게 연결하는 역할을 담당합니다. 인터페이스에는 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계하는 것을 의미. 클래스의 맥락에 맞게 세부 기능을 구현할 수 있음.

(역할과 구현의 분리) => 여기서 역할이 추상화 요소이다.

보다 유연하고 변경에 열려있는 프로그램을 설계하기 위해 역할과 구현을 분리하는 것.

 

2. 상속

새로운 클래스가 기존 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스는 파생 클래스, 하위 클래스, 자식 클래스라고 하며 상속을 주는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상위 클래스의 특성과 기능을 그대로 물려받음으로써, 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정 가능하고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다. 캡슐화 및 재사용이 용이하도록 해준다.

 

상속은 클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화 시켜 해당 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다. 클래스 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한 번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있도록 한다.

 

3. 다형성

다형성(多形性)이란 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질이다.

다형성 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다. 이는 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성을 의미한다. 대표적인 예로 우리가 앞서 본 메서드 오버라이딩 메서드 오버로딩(method overloading)이 있다. 

메서드 오버라이딩을 사용하면 같은 이름의 메서드를 각각의 클래스의 맥락에 맞게 재정의하여 사용할 수 있다. 즉, 같은 이름의 메서드가 상황에 따라 다른 역할을 수행하는 것이다. 또한, 하나의 클래스 내에서 같은 이름의 메서드를 여러 개 중복하여 정의하는 것을 의미하는 메서드 오버로딩도 이와 같은 맥락이라 할 수 있습니다.

 

* 중요한 점

객체 지향 프로그래밍에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미한다. 좀 더 구체적으로, 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것이다.

 

 

4. 캡슐화

캡슐화란 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것이다. 캡슐화의 기능은 데이터 보호, 데이터 은닉이 있다.

데이터 보호(data protection) – 외부로부터 클래스에 정의된 속성과 기능들을 보호.

데이터 은닉(data hiding) – 내부의 동작을 감추고 외부에는 필요한 부분만 노출.

 

캡슐화란 관련 기능과 특성을 모아서 분류하는 작업으로 변수와 함수를 하나의 단위로 묶는 것을 의미한다. 즉, 데이터의 번들링(Bundling)이다. 대개 프로그래밍 언어에서 이 번들링은 클래스를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드에 쉽게 접근할 수 있다. 클래스는 객체지향 프로그래밍을 지원하는 거의 대부분의 언어가 제공하는 제1요소이다. 프로그램의 실제 구현 내용이 외부로 드러나지 않도록 특정 모듈(클래스) 내부로 은닉하는 것이다

 

<캡슐화의 목적> 

외부로부터 클래스에 정의된 속성과 기능들을 보호하고, 필요한부분만 외부로 노출될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을 안전하게 지키고자 하는 목적

 

<접근제어자> 

클래스 또는 클래스 내부의 멤버들에 사용되어 해당 클래스나 멤버들을 외부에서 접근하지 못하도록 접근을 제한하는 역할

 

<은닉화>

은닉화는 캡슐화의 목표이다. 내부 구조를 private으로, 외부에서 조작할 수 있는 정보만 public으로 처리하는 것이다. 외부 개입으로 인한 코드 오염을 방지한다. 프로그램의 세부 구현 사항이 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것.내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨어뜨려 유연함과 유지 보수성을 높이는 개념이다. 많은 객체지향 언어에서 사용되는 클래스를 기준으로 보면, 클래스 외부에서는 바깥으로 노출된 특정 메소드에만 접근이 가능하며 클래스 내부에서 어떤 식으로 처리가 이루어지는지는 알지 못하도록 설계된다.

 

 

댓글