본문 바로가기

2021 정보처리기사/참고자료: 정보처리기사

객체 지향 기법(OOP)이란?

728x90
반응형

객체 지향 기법이란?

객체 지향 기법은 현실 세계의 개체를 하나의 기계부품처럼(객체) 만들어,
부품을 조립하여 제품을 만들듯 소프트웨어를 개발할 때에도 객체들을 조립해서 작성할 수 있도록 하는 기법이다.

단순히 절차에 의해서 동작되는 것이 아니라 객체가 있고, 몇 가지 기능이 있고,
이 기능을 호출했을 때 그 객체가 중심이 되어서 움직인다. 

 

 

 

 

선행개념, "절차(구조적)지향"

우선 프로그래밍을 데이터와 기능의 개념으로 나눠서 생각해봐야 한다.
절차형 프로그래밍 언어를 배우면 알게 되는 기초 개념을 통해 절차(구조)지향 기법이 어떤 것인지 알 수 있다.
모든 데이터의 집합체인 "구조체"를 "함수"로 제어해서 결과를 내는것이 일반적인 절차지향 프로그램의 구조이다.

 

 

데이터

데이터 : 입력된 값 그대로의 의미만 가지는 것
상수  변하지 않는 값  90
변수  상수에 의미를 부여한 것  score = 90
배열  같은 종류의 변수를 여러 개 모은 것  score = {90, 75, 30}
정보: 별도의 의미를 부여하는 데이터
구조체  서로 다른 종류의 데이터를 모은 것  student {
     name = 'A'
     score = 90
  }
배열과 구조체의 차이

배열의 경우, 숫자들만 모여있을 때는 단순한 숫자로써,
다른 배열의 도움 없이는 그것이 '무엇'의 숫자인지 알 수 없다

(ex. score = {90, 75, 30} 에서 점수는 알 수 있지만 누구의 점수인지는 알 수 없다)

구조체의 경우, 구조체 한 덩이만 보고 있어도 숫자뿐 아니라 '무엇'의 숫자인지도 파악할 수 있다.

 

 

 

 

기능

기능
실행문 명령을 실행하는 실행문  "밥을 먹다"
분기문 조건에 따라 실행을 하게 만들어주는 조건제어, 분기문  if 구독을 하면, 밥을 먹다
 else 밥을 굶다
반복문 같은 문장을 반복하게 해주는 반복제어, 루프문 while {
  밥을 먹다
}
함수 원할때만 여러번 반복할 수 있게 해주는 개념, 함수 밥()

 

 

 

 

 

데이터 + 기능

클래스
데이터 구조체 +  함수 (캡슐화)

 

 

 

 

 

 

절차지향 프로그래밍(구조적 기법)의 문제점

유지보수는 고려하지 않고 개별 공정에만 너무 치우치게 된다

개발이 시작된 이후 추가적인 요구사항에 대응하기 어렵다

절차지향 프로그래밍(구조적 기법)은 프로그램 자체를 하나의 덩어리로 설계하기 때문에 실수던 고의던
원하지 않는 접근을 차단할 방법이 없다. 이에 따라 구조체와 함수를 하나로 묶어서 캡슐화를 하면 정보 은닉이 가능하고,
캡슐화의 특징인 재사용 및 확장이 수월해진다. 이렇게 묶인 요소를 우리는 객체(Ojbect)라고 부른다.

이는 객체지향의 대표적 구성요소 중 하나이다.

 

 

 

 

 

 

 

 

 

 

객체 지향 기법의 개요 (출처: IT 기술 노트)

객체지향이 나오면서 지향하게 된 것이 기존 순차적 또는 절차적인 순서가 아닌 방향이 된 것이다.
'객체 지향'이라는 개념이다. 객체 지향 개념은 객체를 지향했다는 것인데,
C언어의 경우는 순차적인 프로그램을 만들었다. C++의 경우에는 객체가 중심이 된다.

객체라는 개념부터 이해를 해야 할텐데, 객체는 우리 주변에 모든 것이라고 할 정도로 모든 것이 객체로 되어 있다.
사람도 객체이다. 강아지도 객체이다. 컴퓨터도 객체라고 할 수 있다.
그것이 살아 있든 죽어 있든 모든 것은 객체이다. 그럼 순차적인 것과 객체 지향의 차이는 이렇다.


순차적인 것은
[강아지에게 밥을 준다] > [강아지를 목욕 시킨다] > [강아지와 산책을 한다]
이런식으로 일어나는 일들에 대해서 순차적으로 진행을 했다고 하면

객체 지향은 강아지가 중심이다.
그리고 [밥을 준다],[목욕하다],[산책하다]와 같은 기능을 가지는 것이다.
그리고 어떤 특정기능을 해야 할때 그 기능을 선택하여 진행 한다. 
객체지향 설계는 객체를 중심으로 설계를 하는 것이다.


간혹 객체지향 프로그램인 C++이나 Java이용해서 개발을 했지만, 객체 지향으로 개발되지 않고,
순차적인 프로그램처럼 개발된 경우가 더러 있다. 객체지향에 대한 이해를 해야 하고,
객체 지향 관점에서 프로그램은 설계가 되어야 한다.

프로그램은 순차적일 수 있다. 그리고 어떤 기능이 동작되려고 하면 그 안에 로직은 절차대로 진행이 된다. 
객체 지향이라고 해서 프로그램이 아래로 흐르지 않는 것은 아니다. 
하지만 시작점 이후에 계속 순차적으로 진행되는 것은 아니다. 

대표적으로 이벤트 드리븐 방식의 윈도우 프로그램의 경우
순차라는 것이 진행이 되기 전에 어떤 기능이 호출이 먼저이다.

예를 들면 버튼을 누르게 되면 시작이 된다든지 어떤 버튼을 누르면
종료된다든지 하는 기능 호출과 절차가 존재한다. 물론 이것을 객체지향이라고 말하기는 그렇지만,
일단 버튼이 중심이 되었다는 것에서는 객체지향에 가깝다고는 할 수 있다.

다시 객체지향을 언급한다면 단순하게 절차에 의해서 동작되는 것이 아니라 객체가 있고,
몇가지 기능이 있고, 이 기능을 호출했을 때 그 객체가 중심이 되어서 움직인다.
 

새가 난다고 했을때는 기존에 함수를 가지고 프로그램을 한다면 난다라는 함수에 새를 넣었다.

난다(새)


객체 지향은 새에 난다라는 함수가 포함되어 있다. 그래서 새가 난다.

새.난다()

이렇게 호출을 한다. 이렇게 객체가 중심이 된다는 의미이다.

 

 

 

객체 지향의 주요 구성 요소와 개념

객체(Obejct), 클래스(Class), 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism), 연관성(Relationship)

 

 

 

객체(Object)의 특성

- 객체는 독립적으로 식별 가능한 이름을 가지고 있다.
ex) 자동차는 번호판으로 다른 자동차 객체와 구분된다

- 객체가 가질 수 있는 조건을 상태(State) 라고 하는데, 일반적으로 상태는 시간에 따라 변화한다
ex) 자동차는 '정지', '이동' 등의 상태가 존재하며, 이러한 '정지'와 '이동'의 상태는 고정된 것이 아니라 시간에 따라 변화한다

- 객체와 객체는 상호 연관성에 의한 관계가 형성된다
ex) 화재 발생 시 소방차, 구급차, 경찰차는 긴밀하게 협조하여 화재를 진압하고 환자를 이송하며 교통을 정리하는 관계가 형성된다.

- 객체가 반응할 수 있는 메시지의 집합을 행위라고 하며, 객체는 행위의 특징을 나타낼 수 있다.
ex) 자동차 객체는 '가속 페달을 밟는' 행위를 하면 '가속' 하는 특징을 나타내고, '브레이크를 밟는' 행위를 하면 '감속' 하는 특징을 나타낸다.

- 객체는 일정한 기억장소를 가지고 있다.
ex) 자동차는 주차장에 있거나 도로 위에 있거나, 일정한 물리적 공간을 점유한다.

구조적 기법과 객체지향 기법의 차이

 

 

 

클래스의 특성

객체지향 프로그래밍에서 데이터를 추상화하는 단위로, 객체를 모아둔 것이 클래스이다.


복제:클래스-인스턴스

위에서 캡슐화된 클래스를 복제해서 재사용 할 수 있다.
이를 클래스-인스턴스(클래스에 속한 각각의 객체) 라고 하며
이 결과물들을 통칭하는 것이바로 "객체" 라는 단어가 된다.

이렇게 복제된 객체들은 같은 클래스의 구조를 가지지만, 내용을 서로 다르게 가질 수 있게 된다.


확장:클래스-상속
이미지 출처: 유튜브 주간컴공

상위클래스로부터 상속을 받은 하위클래스는 상위클래스의 모든 요소에 더해
자신의 요소까지 전부 사용이 가능한 인스턴스를 생성할 수 있다.

이러한 상속을 통해 재사용+확장(유지보수)의 개념까지 가질 수 있는 것이다.

예를 들어 '학생'을 정의하는 상위 클래스를 하위 클래스가 물려 받아 '남자'라는 속성을 첨가하면,
상위 클래스에 비해 좀 더 확장된(구체적인) '남학생'이라는 클래스가 구성되는 것이라 생각하면 된다.

다중상속(Multiple Inheritance) : 한 개의 클래스가 두 개 이상의 상위 클래스로부터 속성과 연산을 상속받는 것을 의미



객체지향에서는 이 여러가지 객체(상-하위 클래스 및 인스턴스)들이 서로 메시지를 보내면서
기능 및 데이터사용을 요청하고, 그 결과를 돌려주면서 프로그램이 진행되는 것이다.


 

 

 

 

객체 지향 기법의 최종 목표, 다형성(Polymorphism)

앞서 살펴본 것과 같이, 클래스는 상속을 통해서 다양한 기능을 확장할 수 있다.
여기서 생성된 인스턴스 역시 다양한 기능을 가지게 된다. 그런데, 이 인스턴스에 기능에 제한을 걸어서
특정 기능만 수행할 수 있다면, 일일이 그 기능만 수행하는 객체들을 따로 생성할 필요 없이 
하나의 통합 객체로 여러가지 일을 수행할 수 있게 된다. 이 개념이 바로 다형성이다.


좌측부터 클래스 > 상속을 통한 확장 > 인스턴스 > 인스턴스의 클래스화

다시 말해 다형성은 메시지에 의해 객체(클래스)가 연산을 수행하게 될 때
하나의 메시지에 대해 각각의 객체(클래스)가 가지고 있는 고유한 방법(특성)으로 응답할 수 있는 능력을 의미한다. 


'+' 연산자의 경우 숫자 클래스에서는 덧셈, 문자 클래스에서는 문자열의 연결 기능으로 사용되는 것을 예시로 들 수 있다.

 


 

 

 

 

 

도움이 된 사이트
IT 기술노트,유튜브 주간 컴공

 

728x90