일단 시작해보는 블로그

[개발상식] 객체 지향 프로그래밍 (Object-Oriented-Programming, OOP) 본문

CS/개발상식

[개발상식] 객체 지향 프로그래밍 (Object-Oriented-Programming, OOP)

Selina Park 2019. 8. 24. 10:48

1. 객체 지향 프로그래밍에 대해 설명 해주세요.

...더보기

컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

 

 

2. 객체 프로그래밍을 했을 때 장점이 뭐에요?

...더보기

 - 코드 재사용성 용이 

   이미 만들어져있는 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있습니다.

 

 - 유지 보수 쉬움

   절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야할 부분       이 클래스  내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 됌.

 

 - 대형 프로젝트에 적합

   클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트 처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉽다.

 

 

 

3. 객체(또는 클래스)가 뭐에요?

...더보기

클래스는 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것.

인스턴스(객체)는 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터

 

 

4. OOP에서 추상화란?(자료의 추상화)

...더보기

불필요한 정보는 숨기고 중요한 정보만을 표현함으로써, 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.

즉, 객체 지향 관점에서 클래스를 정의하는 것이다. (abstract 클래스, abstract 메소드와는 다른 이야기이다.)

 

 

5. OOP에서 캡슐화란?

...더보기

캡슐화의 목적 : 코드를 재수정 없이 재활용하는 것.

프로그램 코드에서 변수와 함수를 재활용하기에는 분산되어 있기 때문에 재활용이 어려웠으나 캡슐화를 통해 관련된 기능과 특성을 한 곳에 모으고 분류하기 때문에 재활용이 원활하다.

객체 지향 프로그래밍에서 기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는 것이 캡슐화다.

객체가 맡은 역할을 수행하기 위한 하나의 목적을 한곳에 묶는 것.

 

 

6. OOP에서 상속이란?

...더보기

절차 지향 프로그래밍에서도 "라이브러리"를 통해서 남이 짜놓은 소스 코드를 가져와 사용할 수 있었다.

하지만 내 의도에 맞게 수정하게 되면 다른 라이브러리가 되어 버전에 따라 동작하지 않을 수 있고 불필요한 코드의 작업을 수정해야한다는 것.

이런 문제를 해결하기 위해 상속이라는 것을 도입하였다.

상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고 기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것이다.

* 다중 상속은 불가하다. (클래스의 상속관계에서 혼란을 줄 수 있기 때문에 상속은 반드시 하나만 가능하고 필요에 따라 인터페이스를 사용할 수 있게 했다.)

 

 

7. OOP에서 다형성이란?

...더보기

'다형성' 말그대로 여러가지 형태를 가질 수 있는 능력.

상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해주고, 같은 클래스 내에 코드의 길이를 줄여주는 것까지 도와주는 개념.

 

다형성에는 두가지 개념이 있다. 오버라이딩(Overriding) 그리고 오버로딩(Overloading)

오버라이딩 : 부모클래스의 (추상)메서드와 같은 이름, 같은 반환 값, 같은 인자로 메소드 내의 로직들을 새롭게 정의하는 것.

 

오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.

왜 오버로딩같은걸 하지? : 유사한 일을 수행하면서 인자만 다른 마소드들에 대하여 각기 다른 이름을 준다면 사용하기 매우 불편할 것!

 

 

8. OOP에서 getter, setter를 사용하는 이유는?

...더보기

멤버변수에 직접 접근 하지 못하게 private으로 접근 지정지를 설정하고 public으로 getter, setter 메서드를 만드는 것을 많이 해왔다.

getter, setter를 사용하면 메서드를 통해서 접근하기 때문에 메서드 안에서 매개변수 같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있다.

예를들면 setter에서 유효범위를 넘은 정수가 들어왔을 때의 처리를 하고나서 set하거나 예외처리를 해버릴 수 있음.

getter도 마찬가지로 자료에 무언가를 더하거나 빼고 준다던지가 가능.

 

 


 

 

 

기존 대부분의 언어들이 프로그램의 프로세스 흐름을 표현하는데 비중을 두고 개발되었지만 객체지향 언어들은 데이터나 정보의 표현에 비중을 두고 있다. 객체지향 프로그래밍에서는 대표적으로 객체가 이 Data부분에 해당된다.

객체 지향 언어들은 전역변수를 거의 사용하지 않는다. 일부 객체 지향 언어들이 전역 변수를 허용하지만 각 모듈의 독립성을 유지하기 위해 그 사용은 권장되고 있지 않다.

 

상자 모양에 외부 인터페이스가 추가된 것이 하나의 클래스를 나타내며, 여러 클래스들은 상속 구조로 연결되어 있다. 이처럼 객체지향 언어들은 전역 변수의 사용을 제한하고 객체와 클래스란 장치를 사용하여 모듈간의 높은 독립성을 유지한다.

 

OOP로 코드를 작성하면 이미 작성한 코드에 대한 재사용성이 높다. 자주 사용되는 로직을 라이브러리로 만들어두면 계속해서 사용할 수 있으며 그 신뢰성을 확보할 수 있다. 또한, 라이브러리를 각종 예외상황에 맞게 잘 만들어두면 개발자가 사소한 실수를 하더라도 그 에러를 컴파일 단계에서 잡아낼 수 있으므로 버그 발생이 줄어든다. 또한 내부적으로 어떻게 동작하는지 몰라도 개발자는 라이브러리가 제공하는 기능들을 사용할 수 있기 때문에 생산성이 높아지게 된다. 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수에 용이하다. 또한, 데이터 모델링을 할 때 객체와 매핑하는 것이 수월하기 때문에 요구사항을 보다 명확하게 파악하여 프로그래밍 할 수 있다.

 

객체지향 프로그래밍의 장점

1. 생산성 향상

객체 지향 기술에서 추구하는 궁극적인 목표는 잘 설계된 클래스들, 즉 하드웨어의 IC처럼 소프트웨어 라이브러리를 재사용하는 것이다. 종전의 개발 방법과는 달리 객체는 IC처럼 독립적이어서 이를 재사용함으로 생산성이 증가하게 된다.

 

2. 자연적인 모델링

객체, 클래스, 속성 상속 및 다형성 등은 우리 일상생활에서 보통 사람들이 대하고 생각하는 방식을 그대로 프로그램 언어로 표현할 수 있게 해준다.

 

3. 재사용

객체지향 프로그래밍은 코드의 재사용을 극대화한다. 한 프로그램 내에서 하위 클래스들이 상위 클래스의 속성을 표현한 코드를 재사용하며, 새로운 프로그램 개발 시 기존 프로그램이 갖고 있는 클래스 상속 구조에서 많은 클래스들을 소프트웨어 IC로 재사용할 수 있다.

 

4. 유지보수의 용이성

객체지향 프로그램은 기존의 기능을 수정하거나 새로운 기능을 추가하기가 용이하다. 기존 기능을 수정 시, 함수를 새롭게 바꾸더라도 캡슐화오 그 함수의 세부정보가 은폐되어 있어 주변에 미치는 영향을 최소화한다. 새로운 객체의 종류를 추가 시에는 상속을 통하여 기존의 기능을 활용하고 존재하지 않는 새로운 속성만 추가하면 되므로 매우 경제적이다. 이외에도 점진적 프로그램 개발의 용이성, 요구사항 변화에 대해 안정된 프로그램 구조 등을 볼 수 있다.

 

객체지향 프로그래밍의 단점

 - 실행시 속도가 느리다.

 - 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나므로 실행 시스템에 많은 overhead가 발생한다. (하지만 이것은 하드웨어의 발전으로 많은 부분 보완되었다.)

 - 객체가 상태를 갖는다는 것.

   변수가 존재하고 이 변수를 통해 객체가 예측할 수 없는 상태를 갖게 되어 애플리케이션 내부에서 버그를 발생시킨다는 것.

   (이러한 이유로 함수형 패러다임이 주목받고 있다.)

 

 

 

 

 

[WORD]

디버그(debug) or 디버깅(debugging)

컴퓨터 프로그램이나 시스템의 정확성 또는 논리적 오류(버그)를 검출하여 제거하는 과정을 뜻한다.

일반적으로 디버깅을 하는 방법으로는 테스트 상의 체크, 기계를 사용하는 테스트, 실제 데이터를 사용해 테스트하는 법이 있다.

https://ko.wikipedia.org/wiki/%EB%94%94%EB%B2%84%EA%B7%B8

 

패러다임(paradigm)

한 시대의 사회 전체가 공유하는 이론, 법칙, 지식, 믿음, 관습 등등을 통틀어 일커는 개념.

 

[REFERENCE]

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

https://jeong-pro.tistory.com/95

https://sesok808.tistory.com/32

 

Comments