34
객체란 뭘까?

절차지향 vs 객체지향

Embed Size (px)

Citation preview

객체란 뭘까?

들어가기에 앞서…

이 PPT는 C언어 문법을 익힌 사람을 대상으로 만들었습니다

이 PPT는 Java를 사용해서 설명하고 있습니다

이 PPT는 필자의 개인적인 생각으로만 이루어져 있습니다

따라서 이 PPT는 신뢰도가 매우 낮습니다

본문에서는 반말씁니다

주의할 점

절차지향과 객체지향은 프로그래밍 언어가 아닙니다

절차지향과 객체지향은 하나의 패러다임입니다

단지 두 패러다임을 설명하기 위해 C와 Java를 사용하고 있을 뿐입니다

※패러다임 – 어떤 한 시대 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리로서의 인식의 체계.또는 사물에 대한 이론적인 틀이나 체계

절차지향 vs 객체지향

절차지향 vs 객체지향

대학에서 객체지향을 배울 때 비교하는 것은 절차지향이다

그러면 절차지향이란 무엇인가?

절차라는 단어를 생각해보자

절차지향 vs 객체지향

일반적으로 절차는“순서대로”란뜻으로 생각한다

실제로 C언어는 코드가 위에서부터아래로 순서대로 실행된다

절차지향 vs 객체지향

그러면 객체지향은 순서대로 실행되지 않는가?

아니다객체지향도 코드는 위에서부터 아래로 순서대로 실행된다

사실 엄밀히 말하면 순서대로 실행된다는 개념은 명령형 프로그래밍이다(절차지향하고 다름)

절차지향 vs 객체지향

Java 코드 실행 결과

절차지향 vs 객체지향

그러면 절차지향하고 객체지향의 차이점은 무엇인가?

하나의 예를 들겠다

C언어에서 계산기가 필요하다고 하자

계산기 프로그램을 만드는 것이 아니다. 코딩할 때 계산기라는 어떤데이터가 필요하다는 것이다.

계산기 만들기

계산기를 만드려면 무엇이 필요할까?

많은 기능이 있겠지만 우리는 덧셈, 뺄셈, 곱셈, 나눗셈만 필요하다고 하자

C언어에서는 이 기능들을 함수로 만들 수 있다

계산기 만들기

(0으로 나누는 경우같은 예외는 모두 생략)

계산기에 필요한 기능들을 만들었다

그럼 여기서 생각해보자

Add는 계산기인가? 아니다단지 덧셈만 수행하는 계산기의 기능 중 하나다

Sub는 계산기인가? 아니다Mul는? Div는? 모두 아니다

계산기 만들기

방금 만든 함수들을 모두 합쳐야 계산기라고 할 수 있을 것이다

그럼 어떻게 합칠까??

함수를 따로 만들어보자

계산기 만들기

계산기라는 함수를 만들었다

안에 덧셈, 뺄셈, 곱셈, 나눗셈 기능도포함되어 있다

그러면 이것은 계산기인가??역시 아니다

우리가 아는 계산기는 한 번에덧셈, 뺄셈, 곱셈, 나눗셈을 하지 않는다

계산기 만들기

우리가 아는 계산기는 사용자가 원하는 기능만 수행할 수 있다

덧셈만 원하면 덧셈만, 뺄셈만 원하면 뺄셈만 할 수 있어야 한다

그러면 원하는 기능만 사용할 수 있도록 하자

분기문을 이용하면 된다

계산기 만들기

Switch문을 이용해 원하는 기능만 쓸 수있도록 했다

이제는 계산기라고 불릴만 하다

하지만 문제가 있다

사용자가 첫번째 인자에 어떤 값을 전해주는지알아야 한다

계산기 만들기

어떤 데이터를 사용할 때 사용자가 알아야 하는 것이 있다면 바람직한 구조가 아니다

방금 만든 계산기는 각 기능에 대해 그에 맞는 숫자(0,1,2,3)을 알고 있어야 한다

또한 숫자의 의미도 파악하기 힘들다

그러면 어떻게 해야 사용자가 쉽게 쓸 수 있을까?

다음 코드를 보자

계산기 만들기

1. 계산기 구조체를 만든다

구조체 안에는 덧셈, 뺄셈, 곱셈, 나눗셈함수의 주소를 저장할 수 있는 함수 포인터가들어있다.

계산기 만들기

2. 계산기 구조체를 선언한 후 구조체 안의변수를 초기화 한다

초기화 안하면 이름만 add, sub, mul, div이고 쓰레기 값이 들어있다

계산기 만들기

이번에는 구조체와 함수 포인터를 이용하여 계산기를 만들었다

사용할 때는 어떤지 보자

계산기 만들기

계산기(변수 C)의 덧셈(함수 add)를 사용하여1과 2(매개 변수)를 더한다

의미가 명확하고 사용법이 간결해졌다

계산기 만들기

실행 결과도 정상적이다

계산기 만들기

우리는 계산기를 만들었고 실행도 잘되며 사용하기 편리하다…지만

과연 그럴까?

방금 만든 것도 문제점이 있다

계산기 만들기

1.

계산기 하나를 만들기 위해서 우리는계산기에 필요한 함수를 따로 만들고

계산기 만들기

2.

계산기의 기능을 저장할 구조체를 따로만들어야 하며

계산기 만들기

3.

계산기 구조체를 초기화 시켜줘야 한다특히 초기화 작업은 계산기가 많아질수록너무 불편하다

계산기 만들기

구조체 초기화 함수를 만들면 조금 편해지지만 근본적인 해결책이되지는 못한다

절차지향 vs 객체지향

우리가 만든 계산기는 새로운 기능이 있을 때마다 함수를 추가해야 하고

구조체에 그에 맞는 함수 포인터를 새로 만들어야 하며

초기화 부분도 새로운 코드를 추가해야 한다

절차지향 vs 객체지향

여기서 절차지향의 특징이 보인다

절차지향은 데이터(구조체)와 함수(기능)가 분리되어 있다는 것이다(즉, 독립적이다)

그러면 객체지향은 어떨까?

객체지향은 우리가 만든 계산기를 “객체”로 만들 수 있다

계산기 만들기

1.

계산기 클래스를 만든다※(클래스는 객체가 아니다)

계산기 만들기

2.

New 키워드를 이용해 객체를생성하고 사용하면 끝

실행 결과

절차지향 vs 객체지향

C언어에 비해 훨씬 간단해진 것이 느껴졌는가?

이렇듯 객체는 데이터와 기능이 함께 있어 사물을 묘사하기가절차지향보다 직관적이고 편리하다(아까 만든 계산기를 생각해보자)

절차지향 vs 객체지향

하지만 이건 객체지향 요소를잘 사용할 경우 그렇다는 것이지

무조건 객체를 사용한다고 해서 코드가 간결해지거나

사용자가 편리해지는 것은 아니다

절차지향 vs 객체지향

클래스를 이렇게 개판으로 만들면 아까 만든 C언어 계산기보다사용하기 불편해진다. 물론 실행 결과는 같다 ^^

절차지향 vs 객체지향

계산기 객체와 같이 프로그램을 명령어의 목록으로 보지 않고

여러 개의 독립된 단위인 객체들의 모임으로 파악하는 것이

객체지향 프로그래밍이다