• 검색 결과가 없습니다.

9. 객체지향 프로그래밍

N/A
N/A
Protected

Academic year: 2022

Share "9. 객체지향 프로그래밍 "

Copied!
33
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

대 구 가 톨 릭 대 학 교 IT 공학부

소프트웨어공학연구실

9. 객체지향 프로그래밍

(2)

목 차

2

9.1 개요

9.3 추상 자료형

9.5 동적 바인딩 9.4 상속

9.2 객체 지향 프로그래밍 언어

(3)

3

9.1 객체지향의 개념 (1)

객체지향의 등장 배경

소프트웨어와 하드웨어의 발전 불균형

소프트웨어 모듈의 재사용과 독립성을 강조

객체(object)란?

우리가 다루는 모든 사물을 일컫는 말

예) 하나의 점, 사각형, 원, 컴퓨터, 사람 등등 모든 것들

객체는 두 가지 구성 요소를 가짐

상태(State) : 객체가 가지고 있는 속성(특징)

행위(Behavior) : 객체가 가지고 있는 기능(행동)

예 : 자동차 객체

상태 : 색, 바퀴 수, 핸들, 현재속도, 현재 기어 위치 등

행위 : 현재속도로 달린다, 기어를 바꾼다, 경적을 울린다 등

State

• 색

• 네 개의 바퀴

• 핸들

• 배기량

• 현재 속도

• 현재 기어 위치

Behavior

• 달린다.

• 멈춘다.

• Gear를 바꾼다.

• 속도를 높이거나 낮춘다.

• 경적을 울린다.

(4)

4

9.1 객체지향의 개념 (2)

객체 지향 프로그래밍(OOP)

프로그램을 현실 세계의 모방으로 보고 현실 세계의 객체들을 소 프트웨어적으로 표현

객체지향 방법을 이용하여 현실 세계의 객체가 갖는 상태와 행위 를 소프트웨어 객체의 변수(variable)와 메소드(method)로 모델 링하고 객체간의 관계를 정의

실세계 객체의 상태(특성) --> 변수

특성이나 상태를 변경시키는 행동 --> 메소드 or 함수

(5)

5

9.1 객체지향의 개념 (3)

실세계(Real World)

객체가 존재하는 실세계를 의미

우리가 일상에서 보는 사물

개념 세계(Conceptual World)

실세계에 존재하는 객체에 대해 객체가 어떻게 구성되었는지 분석하는 단계

실세계의 객체에 대한 상태와 행동 정보 등을 추려내는 단계

이러한 작업을 추상화(abstraction)라 함

컴퓨팅 세계(Computing or Software World)

개념 세계의 것을 소프트웨어 적으로 나타내는 것

상태는 변수로, 행동은 메소드로 표현

이러한 상태와 메소드를 이용하여 하나의 클래스를 만드는 것을 캡슐화 (encapsulation)이라 함

(6)

9.1 객체지향의 개념 (4)

객체지향 프로그래밍 장점

객체지향 모델은 실세계를 잘 반영

 인간의 사고와 유사한 표현이 가능

 모델링부터 구현까지 일관된 개념의 유지 가능

개발 생산성 증대 및 유지 보수를 용이하게 함

 객체를 통한 재사용성 및 품질 향상

 유지 보수 시 부분적 교체가 가능 : 전체 영향의 최소화

복잡하고 다양한 정보의 표현 가능

 추상화 데이터 타입을 통한 다양한 표현 능력 제공

 데이터와 기능의 통합 추상화로 복잡한 데이터 처리 용이

6

(7)

7

9.2 객체지향 프로그래밍 언어(1)

객체지향 프로그래밍을 지원하는 언어의 부류

기존 언어에 객체지향 프로그래밍을 지원하는 언어

 C++ , Ada 95

객체지향 프로그래밍 외에 프로시저지향과 데이터지향 프로그래밍을 지원

 CLOS(LISP의 Object-Oriented version)

객체지향 프로그래밍 외에 함수 프로그래밍을 지원

객체지향 프로그래밍을 지원하기 위해 설계된 더 새로운 언어

 Java, C#

객체지향 프로그래밍을 완벽하게 지원한 첫 번째 언어

 Smalltalk

유일한 순수 객체지향 프로그래밍 언어

(8)

9.2 객체지향 프로그래밍 언어(2)

객체지향 프로그래밍의 개념

1960년대 Kristen Nygaard와 Ole-Johan Dahl에 의해 개발된 SIMULA 에서부터 시작

1967년에 클래스, 객체, 그리고 상속 개념을 포함한 SIMULA 67이 개발되면서 최초의 객체지향 개념이 도입

진정한 최초의 객체지향 언어는 1980년에 Alan Kay에 의해 개발된 Smalltalk 80

동적 바인딩을 지원

객체지향 프로그래밍 언어의 3가지 주요 특징

추상 데이터 타입, 상속, 동적 바인딩

8

(9)

9

9.2 객체지향 프로그래밍 언어(3)

객체지향 프로그래밍 언어의 3가지 주요 특징

1)

추상 데이터 타입(abstract data types)

- 이질적인 데이터들의 모임인 레코드에 이들 데이터들과 연관된 동작들이 추가되어 하나로 묶인 개념

2)

상속(inheritance)

- 다른 클래스의 특성이 임의의 클래스에 전달되는 것

3)

동적 바인딩(dynamic binding)

- 같은 이름의 함수를 각각 정의하는 상속 관계에 있는 객체에 대해 함수를 호출했을 때 동작하게 될 함수가 동적으로 결정되는 개념

(10)

10

9.3 추상 데이터 타입(1)

추상 데이터 타입(Abstract Data Type)

임의의 타입의 데이터 표현과 그와 관련된 연산을 제공하는 부프 로그램들을 함께 묶어 캡슐화한 것

캡슐화(encapsulation)

 하나의 데이터 타입과 관련된 모든 정의를 한 곳에 모으고 그곳에서 정의된 연산을 통해서만 이 데이터 타입을 사용하도록 제한하는 것

캡슐화의 외부에는 추상 데이터 타입의 실제적인 표현을 숨김

추상 데이터 타입의 실체(instance) -> 객체

추상 데이터 타입의 구조

(11)

11

9.3 추상 데이터 타입(2)

추상 데이터 타입은 다음 두 조건을 모두 만족하는 데이터 타입

1) 데이터 타입과 그 타입과 관련된 연산이 동시에 정의되어야 함

그 정의들은 한 곳에 모두 모여 있어야 하며 연산과 타입은 직접적으로 연계되어야 함

2) 데이터 타입의 세부 사항은 그 타입에 마련된 연산만이 접근할 수 있고, 그 타입을 사용하는 프로그램이 직접적으로 접근할 수 없음

추상 데이터 타입에서 제공하는 연산을 호출해야만 객체의 상태를 변경시킬 수 있음

추상 데이터 타입의 특징

임의의 타입의 데이터 표현과 그와 관련된 부프로그램들을 함께 묶어 캡슐화

이 타입에서 제공하는 부프로그램만을 통해 동작이 이루어짐

관리하기 편하고 안정성이 뛰어남

추상 데이터 타입을 지원하는 언어

C++, Ada, Java

(12)

12

9.3 추상 데이터 타입(3)

C++ 의 추상 데이터 타입

클래스(class)를 이용해서 추상 데이터 타입을 지원

 클래스에서 정의된 데이터 : 멤버 데이터(member data)

 클래스에서 정의된 부프로그램 : 멤버 함수(member function)

클래스

 private 절에 속한 멤버들은 외부로 공개되지 않음

 public 절에 속한 멤버들은 외부로 공개

class 클래스 이름 { :

};

:

(13)

9.3 추상 데이터 타입(4)

employee 클래스를 정의한 예

int getAnnualSalary() { return annualsalary;

}

void changeBasicSalary(int bs) { basicsalary = bs;

annualsalary = basicsalary*12 + basicsalary*bonus*0.01;

}

void changeBonus(int bon) { bonus = bon;

annualsalary = basicsalary*12 + basicsalary*bonus*0.01;

} };

class employee { private:

char *name;

int basicsalary;

int bonus;

int annualsalary;

public:

employee(char *na, int bs, int bon, int as) { name = new char[strlen(na)+1];

strcpy(name, na);

basicsalary = bs;

bonus = bon;

annualsalary = as;

}

~employee() { delete []name;

}

char* getName() { return name;

}

(14)

9.3 추상 데이터 타입(5)

employee 클래스의 실체인 객체를 생성

객체 emp의 구조

 emp 객체의 name과 annualsalary를 알아내는 문장

cout << emp.getName() << " " << emp.getAnnualSalary();

 emp 객체의 기본급을 200으로 변경

emp.changeBasicSalary(200);

employee emp(“abc”, 150, 400, 2400);

(15)

15

9.3 추상 데이터 타입(6)

Java 의 추상 데이터 타입

C++ 와 유사

클래스(class)를 이용해서 추상 데이터 타입을 지원

 클래스에서 정의된 데이터 : 멤버 변수(member variable)

 클래스에서 정의된 부프로그램 : 메소드(method)

C++ 와의 차이점

 소멸자가 없음 (Java는 묵시적으로 쓰레기 수집을 하기 때문)

 클래스에 정의된 메소드를 밖으로 빼내어 표현할 수 없음 class 클래스 이름 {

} :

(16)

9.3 추상 데이터 타입(7)

Java로 표현한 employee 클래스

16

class employee {

private String name;

private int basicsalary;

private int bonus;

private int annualsalary;

public employee(String name, int basicsalary, int bonus, int annualsalary) { this.name = name;

this.basicsalary = basicsalary;

this.bonus = bonus;

this.annualsalary = annualsalary;

}

public String getName() { return name;

}

public int getAnnualSalary() { return annualsalary;

public void changeBasicSalary(int basicsalary) { this.basicsalary = basicsalary;

annualsalary = (int)(basicsalary*12 + basicsalary*bonus*0.01);

}

public void changeBonus(int bonus) { this.bonus = bonus;

annualsalary = (int)(basicsalary*12 + basicsalary*bonus*0.01);

} }

(17)

9.3 추상 데이터 타입(8)

employee 클래스의 실체인 객체를 생성

객체 emp의 구조

 emp 객체의 name과 annualsalary를 알아내는 문장

System.out.println(emp.getName() + " " + emp.getAnnualSalary());

 emp 객체의 기본급을 200으로 변경

emp.changeBasicSalary(200);

17

employee emp = new employee(“abc”, 150, 400, 2400);

(18)

18

9.3 추상 데이터 타입(9)

Ada 의 추상 데이터 타입

패키지(package)를 이용해서 추상 데이터 타입을 지원

 명세부(specification part) + 몸체부(body part)

명세부 : 패키지를 사용하는 프로그램에게 인터페이스를 제공

가시부(visible part) : 가시부에서 선언된 내용들은 외부에 공개

전용부(private part) : 전용부에서 선언된 내용들은 외부에 공개되지 않음

몸체부 : 명세부에서 명명된 연산에 대한 구현을 제공

몸체부에서 정의된 내용도 외부에 공개되지 않음

package 패키지이름 is

end 패키지이름;

package body 패키지이름 is

end 패키지이름;

(19)

9.3 추상 데이터 타입(10)

employeePack 패키지 명세부

19

package employeePack is type employee is private;

procedure initEmp(emp: out employee; name: string; basicsalary, bonus, annualsalary: integer);

function getName(emp: employee) return string;

function getAnnualSalary(emp: employee) return integer;

procedure changeBasicSalary(emp: in out employee; basicsalary: integer);

procedure changeBonus(emp: in out employee; bonus: integer);

private

type employee is record

name: string(1..3);

basicsalary: integer;

bonus: integer;

annualsalary: integer;

end record;

end employeePack;

(20)

9.3 추상 데이터 타입(11)

employeePack 패키지 몸체부

20

with TEXT_IO;

use TEXT_IO;

package body employeePack is

package INT_IO is new TEXT_IO.INTEGER_IO (integer);

use INT_IO;

procedure initEmp(emp: out employee; name: string; basicsalary, bonus,annualsalary: integer) is begin

emp := (name, basicsalary, bonus, annualsalary);

end initEmp;

function getName(emp: employee) return string is begin

return emp.name;

end getName;

function getAnnualSalary(emp: employee) return integer is begin

return emp.annualsalary;

end getAnnualSalary;

procedure changeBasicSalary(emp: in out employee; basicsalary: integer) is begin

emp.basicsalary := basicsalary;

emp.annualsalary := emp.basicsalary*12 + mp.basicsalary*emp.bonus/100;

end changeBasicSalary;

procedure changeBonus(emp: in out employee; bonus: integer) is begin

emp.bonus := bonus;

emp.annualsalary := emp.basicsalary*12 + emp.basicsalary*emp.bonus/100;

end changeBonus;

end employeePack;

(21)

9.3 추상 데이터 타입(12)

정의된 employee 추상 데이터 타입의 실체인 객체 생성 방법

객체 emp의 구조

 객체 emp의 각 데이터에 값을 저장

initEmp(emp, "abc", 150, 400, 2400);

 emp 객체의 name과 annualsalary를 알아내기

put(getName(emp));

put(getAnnualSalary(emp));

 emp의 기본급을 200으로 변경

changeBasicSalary(emp, 200);

21

emp : employee;

(22)

22

9.4 상속(1)

상속(inheritance)

클래스 사이의 데이터와 연산을 공유하기 위한 메커니즘

기존 클래스로부터 상속을 통해 정의되는 클래스는 기존 클래스 의 데이터와 연산 기능을 가지며, 새로운 데이터와 연산을 추가 할 수 있음

상속해 주는 클래스 :

 상위 클래스(super class), 기반 클래스(base class)

상속을 통해 정의되는 클래스 :

 하위 클래스(sub class), 파생 클래스(derived class)

(23)

9.4 상속(2)

 공통된 사항들을 묶어 사원이라는 클래스를 정의하고, 정규직과 비정 규직은 사원 클래스를 상속하여 정의

 정규직과 비정규직 클래스는 사원 클래스의 이름, 연봉, 이름알아내 기(), 연봉알아내기()를 상속받아 자신의 데이터와 연산인 것처럼 사 용할 수 있음

23

(24)

24

9.4 상속(3)

C++의 상속

상속을 이용한 파생 클래스 정의 형식

 기반 클래스의 멤버 데이터와 멤버 함수가 파생 클래스에 상속

 파생 클래스는 새로운 멤버 데이터와 멤버 함수를 추가할 수 있음

 상속된 멤버 함수를 새롭게 정의할 수 있음

접근 모드 : public, private, protected

public : 기반 클래스의 모든 멤버에 대한 접근 권한이 파생 클래스에서도 그대로 유지됨

protected : 파생 클래스에서는 접근이 가능하지만 외부에서는 접근이 불가능한 멤버를 지정

class 파생클래스 이름 : 접근모드 기반클래스이름 { }; :

(25)

9.4 상속(4)

기반 클래스를 상속하는 기반 클래스를 상속하는 파생 클래스 정의-오류 발생 파생 클래스 정의 예

기반 클래스를 상속하는 파생 클래스 정의-오류 수정 25

class employee { private:

int annualsalary;

public:

char *getName( ) { ⋯ }

};

class permanent : public employee { private:

int bonus;

public:

void changeBasicSalary( ) { ⋯ }

};

class employee { private:

int annualsalary;

}; class permanent : public employee {

void changeBasicSalary( ) {

annualsalary = ⋯ ; // 오류가 발생 }

};

class employee { protected:

int annualsalary;

}; class permanent : public employee {

void changeBasicSalary( ) {

annualsalary = ⋯ ; // 접근 가능!!

} };

(26)

9.4 상속(5)

C++로 구현한 employee 클래스

class employee { private:

char *name;

protected:

int annualsalary;

public:

employee(char *na, int as) {

name = new char[strlen(na)+1];

strcpy(name, na);

annualsalary = as;

}

~employee() { delete []name;

}

char* getName() { return name;

}

int getAnnualSalary() { return annualsalary;

} };

*private

-. name : 파생 클래스에서 직접 접근하지 않음

*protected

-. annualsalary: 외부에서 접근하지 않으나 파생 클래스에서 직접 접근함

*public

getName(), getAnnualSalary : 외부에서 직접 접근

26

(27)

9.4 상속(6)

C++로 구현한 permanent 클래스

class permanent : public employee { private:

int basicsalary;

int bonus;

public:

permanent(char *na, int bs, int bon, int as) : employee(na, as) { bonus = bon;

basicsalary = bs;

}

void changeBasicSalary(int bs) { basicsalary = bs;

annualsalary = basicsalary*12 + basicsalary*bonus*0.01;

}

void changeBonus(int bon) { bonus = bon;

annualsalary = basicsalary*12 + basicsalary*bonus*0.01;

} };

*멤버데이터

-. basicsalary, bonus

*멤버함수

-. changeBasicSalary(), changeBonus()

*annualsalary

protected 멤버로서, 각 멤버함수에서 annualsalary에 대해 직접 접근 가능

27

(28)

9.4 상속(7)

C++로 구현한 temporary 클래스

class temporary : public employee { private:

int workhours;

int hoursalary;

public:

temporary(char *na, int hs, int wh, int as) : employee(na, as) { workhours = wh;

hoursalary = hs;

}

void changeWorkHours(int wh) { workhours = wh;

annualsalary = workhours * hoursalary / 10000 }

void changeHourSalary(int hs) { hoursalary = hs;

annualsalary = workhours * hoursalary / 10000;

} };

*멤버데이터

-. workhours, hoursalary

*멤버함수

-. changeWorkHours(), changeHourSalary()

28

(29)

9.4 상속(8)

 permanent 클래스의 객체인 emp1을 생성

 emp1 객체의 name과 annualsalary를 알아내는 문장

 emp1 객체의 기본급을 200으로 변경

 temporary 클래스의 객체인 emp2를 생성하고, 이름과 연봉을 출력 하고, 근무시간을 변경

permanent emp1(“aaa”, 150, 400, 2400);

cout << emp1.getName() << “ “ << emp1.getAnnualSalary();

emp1.changeBasicSalary(200);

temporary emp2("bbb", 5000, 2000, 1000);

cout << emp2.getName() << " " << emp2.getAnnualSalary();

emp2.changeWorkHours(2500);

29

(30)

9.4 상속(9)

Java의 상속

상속을 이용한 파생 클래스 정의 형식 : extends 예약어 사용

접근 모드 : public, private, protected

30

class 파생클래스 이름 extends 기반클래스이름 { :

}

(31)

31

9.5 동적 바인딩(1)

동적 바인딩(dynamic binding)

상속 관계가 있는 객체에 대한 멤버 함수 호출에 대해 대응되는 멤 버 함수가 동적으로 결정되는 것을 의미

예)

1학년 or 2학년 클래스의 객체에 대해 평균알아내기() 함수를 호출하면 파생 클래 스에서 새롭게 정의된 함수가 동작

3학년 클래스의 객체에 대해 평균알아내기() 함수를 호출하면 기반 클래스에서 정 의된 함수가 동작

상속 관계가 있는 객체에 대해 멤버 함수를 호출했을 때 동작하게 될 멤버 함수가 동적으로 결정되는 개념  동적 바인딩(dynamic binding)

(32)

32

9.5 동적 바인딩(2)

C++의 동적 바인딩

기반 클래스의 멤버 함수 이름 앞에 명시적으로 ‘virtual’을 써야 함

 이와 같이 동적으로 바인딩하는 함수 --> 가상 함수(virtual function)

순수 가상 함수(pure virtual function)

 기반 클래스에서 선언된 가상 함수지만 어떤 정의도 갖지 않는 함수

 모든 파생 클래스는 이 함수를 정의하고 있어야 함

 순수 가상 함수가 하나 이상 있는 클래스를 추상 클래스라 함

(33)

33

9.5 동적 바인딩(3)

Java의 동적 바인딩

Java의 멤버 함수는 기본적으로 동적 바인딩이 적용됨

예)

참조

관련 문서

관련된 객체에 링크에 대한 레 상속을 사용 클라이언트 클 구현. 관련된 객체에 대한 인스턴스 변수를 정의,

 객체지향 분석 설계에서는 일단 시스템에서 취급해야 될 객체를 추 출하게 되면 그것을 가지고 객체를 구조, 기능, 동작의 3가지 측면으 로

 나비는 종류에 따라 서식지가 다르기 때문에 좋아하는 꽃도 다르지 만, 어떤 나비이든 「꿀을 빤다」라고 하는 조작..  객체지향에서는 이와 같은

프로그래밍

프로그래밍

 클래스계층 공유어프로치에서는, 부모(parent)클래스에 정의되어 있는 정보의 조작은 자식(child)클래스에서 정의되지 않고, 정의되지 않은 나머지 것만을

MeOH(극성 양성자성 용매, 약한 친핵체) 속에서 2-Chloro-3-phenylbutane의 가용매분해 반응.. β-제거 반응의 주생성물은

TransferDatabase 다른 데이터베이스 파일과의 가져오기, 내보내기, 연결 등을 지원한다. TransferSpreadsheet 스프레드시트