취준/기술면접

객체지향 프로그래밍(Object-Oriented Programming, OOP)

빵어 2024. 11. 7. 20:51

객체지향 프로그래밍이란?

Object-Oriented Programming, OOP

프로그래밍 설계 방법론, 패러다임

 

객체(클래스를 기반으로 만들어진 속성과 메서드의 묶음)들로 프로그램을 구성

객체들의 상호작용을 통해 동작

 

예전의 절차적 프로그래밍의 문제(코드 파악, 유지보수 어려움)를 보완

확장성 높임, 복잡한 시스템을 효율적으로 설계 가능

 

C#, C++ 둘 다 객체지향 프로그래밍을 지원하는 언어

 

 

객체지향 프로그래밍의 요소

1. 캡슐화

데이터(속성, 변수)와 메서드(함수)를 하나의 단위로 묶어 외부에서 접근을 제한하는 개념

 

클래스를 통해 구현

 

정보 은닉이라는 개념이 이 캡슐화의 주요 특징이다

 

정보 은닉

  • 객체 외부에서 객체 내부의 데이터를 직접 접근하지 못하도록 하는 것
  • private이나 protected 같은 접근 제한자를 사용해 외부 접근을 막을 수 있음

 - 정보 은닉은 캡슐화의 목표 중 하나며 정보 은닉이 곧 캡슐화는 아니다

 

 

객체가 제공하는 특정 메서드(public 메서드 등)를 통해서만 객체 내부 접근 가능

  • 메서드를 통한 접근을 통해 데이터를 보호하거나 유효성 검사 수행 가능
  • 외부 코드에 영향을 주지 않고 객체 내부 구조 변경 가능(유지보수 용이)

 

 

 

2. 상속

자식 클래스가 부모 클래스의 데이터(속성)와 메서드(함수)를 물려받아 재사용할 수 있게 하는 기능

 

중복 코드 작성 막음

클래스의 기능을 확장할 수 있으며 코드의 재사용성을 높여줌

 

다중상속: 한 클래스에서 두 개 이상의 클래스를 상속받는 것. C#은 문법적으로 막아놨다(인터페이스로 가능은 함)

 

상속받은 메서드는 자식 클래스에서 그대로 사용할 수 있고, 필요한 경우 오버라이딩을 통해 재정의할 수 있음

상속을 통해 다형성을 구현할 수 있음

 

 

 

3. 다형성

변수나 메서드(함수)가 다양한 방식으로 동작할 수 있게 하는 것

동일한 인터페이스나 부모 클래스를 통해 다양한 객체가 각자의 방식으로 동작할 수 있도록 하는 것

 

오버로딩과 오버라이딩이 이에 해당한다

  • 오버로딩: 같은 이름의 메서드를 매개변수만 다르게 하여 여러 개 정의하는 것
  • 오버라이딩: 상속받은 메서드의 기능을 바꿔, 부모 클래스의 메서드와 이름, 반환형, 매개변수는 동일하지만 다른 기능을 하는 메서드로 재정의하는 것 (virtual과 override 키워드 사용)

 

 

 

4. 추상화

세부 구현 내용을 숨기고, 중요한 특성이나 필요한 정보만 사용자에게 제공하는 것

 

추상 클래스와 인터페이스로 구현될 수 있음

  • 추상 클래스(Abstract Class): 추상 메서드(구현되지 않은 메서드)를 가질 수 있음. 추상 메서드는 반드시 이를 상속받는 자식 클래스에서 구현되어야 함
  • 인터페이스(Interface): 메서드 선언만 있고, 구현은 없는 형태

 

추상 클래스에서 "세부 구현 내용을 숨긴다"는 의미는 부모 클래스가 자식 클래스에 추상 메서드를 어떻게 구현할지에 대한 세부사항을 숨긴다는 뜻이며 자식 클래스가 그 동작을 구체적으로 정의하게 한다는 뜻이다

 

인터페이스도 추상클래스와 비슷하지만 일부 구현을 제공할 수 있는 추상 클래스와 다르게

구체적인 구현 방법을 전혀 제공하지 않으며(숨기며), 메서드의 이름, 매개변수, 반환값 만을 정의한다

 

결론적으로 둘 다 "구체적인 구현을 정의하지 않는다"라는 면에서 "숨긴다"라는 표현을 사용

 

 

추상화는 추상 클래스나 인터페이스만을 사용해 구현되는 것은 아니다

virtual과 override를 사용해 오버라이딩 하는 것도 추상화라고 볼 수 있으며, 다양한 방법(상속, 제네릭 등)으로 추상화가 이뤄질 수 있다

 

 

추상화라는 특징에서 중요한 것은 세부 사항을 숨기고 중요한 특성만을 강조한다는 개념이다