공학 SW 집중강좌 - 프로그래밍언어 Android Programming Chap 1. 객체지향프로그래밍 오병우 컴퓨터공학과
기술동향 프로그래밍방식의변천 기계중심의 Stored-Procedure 기계어, 어셈블리언어 구조적프로그래밍 Pascal, C 잘정의된제어구조, 코드블록, GOTO 문사용억제, 순환호출 (recursion) 과지역변수를지원하는독립형 SUB 프로그램 기능별모듈화 객체지향 (Object-Oriented) 프로그래밍 Smalltalk, C++, Java, Objective-C 객체단위로모듈화 Data 와 Control 통합 복잡도감소목표 Run-time 시정보처리 (dynamic binding) 가많아구조적프로그래밍방식보다실행속도가느림 ( 현대의빠른컴퓨터로극복 ) Department of Computer Engineering 2
C vs. C++ 계산기프로그램 으로살펴보는 C 와 C++ 프로그래밍의차이 C: 기능에따라세분화 입력, 계산, 출력기능 각기능을함수로구현 C++: 객체에따라세분화 키패드, LCD, CalcController, MathEngine 각객체가가져야할특성에따라클래스로구현 main() { input(); compute(); output(); } class Keypad{ // Keypad 의특성과해야할일구현 }; class LCD { // LCD 의특성과해야할일구현 }; class CalcController { // 전체프로그램제어구현 }; class MathEngine { // +, - 등계산담당 }; Department of Computer Engineering 3
객체지향프로그래밍개념 객체지향개념특성 캡슐화 (Encapsulation) 다형성 (Polymorphism) OOP 상속성 (Inheritance) Department of Computer Engineering 4
Encapsulation 목적 Information hiding 복잡한내부구조숨김 Divide and Conquer 프로그램전체적인관점에서문제를잘게나누고해결 프로그래머실수방지 반드시필요한함수만공개설명 데이터 (data) 와이를조작하는코드 (code, control, function) 통합 객체안의코드와데이터는비공개 (private) 될수도있고공개 (public) 될수도있음 class 와 struct 의차이? (default 가 private vs. public) 예제 ) 리모콘버튼을눌렀을때내부는몰라도됨 변수 멤버 함수 1 멤버 변수 멤버 함수 2 외부 함수 3 직접변경금지 함수 1 함수 2 함수 3 Department of Computer Engineering 5
Polymorphism 다형성 (polymorphism) 모양은같지만성질은다름 Overloading 하나의이름으로두가지이상의작동을수행할수있는성질 예제 하나의인터페이스에여러방법지원 abs(), labs(), fabs() abs() 함수이름과연산자이름에사용할수있음 함수오버로딩 (overloading) 연산자오버로딩 오버로딩은 Mangling 을통해자연스럽게구현됨 리턴값, 파라미터, _ 등을함수이름에덧붙임 Overriding 객체지향개념에서중요한것은 Overriding ( 재정의 )!!! Department of Computer Engineering 6
Function Overloading and Overriding Overloading 상속과관련없고함수명동일 매개변수다름 Mangling 내부적으로사용되는함수명은매개변수와반환값포함 Overriding 상속과관련됨 상속전클래스 (super class, 기반클래스 ) 의함수를대치 이름및매개변수동일 프레임워크를통한프로그래밍을가능하게하는중요한개념 원래됨 Department of Computer Engineering 7
추상 추상화 (Abstraction) 인간 의개념을떠올려볼수있음 추상적인개념 공통적인특징인식 인간 의경계? 추상화 언제부터 인간 으로인식하는가? 엄마배속에있어도 인간? 10개월, 9개월 상실기, 수정직후 소프트웨어의목적에맞게개념정의 필요한부분만추상화 본프로그램에서이클래스는 ~ 라고정의한다. 클래스정의 Department of Computer Engineering 8
클래스 클래스및인스턴스 추상화를통해관심대상의특성을정의 Data 및 Control (Function) 통합 사용자정의타입 예제 ) 붕어빵찍는기계 인스턴스 (Instance) 또는객체 (Object) 클래스에의해실체화되어생성된것 클래스만정의해놓고쓰지않는다면효용없음 Notepad.exe라는프로그램을만들어놓고실행한메모장프로그램들 메모리에할당된공간을가지는변수 예제 ) 붕어빵 Department of Computer Engineering 9
클래스의데이터캡슐화 전역변수문제점해결 관련있는데이터묶어서캡슐화 캡슐화된데이터감추기 private, protected 외부에서사용불가능 protected : 상속시 child 클래스에서사용가능 클래스선언시접근지시자를지정하지않으면 default 는 private public 외부에서사용가능 Setter 와 Getter 사용 외부에변수를직접노출하지않고함수제공 값을 set 하고, get 하는함수들을제공 값을안전하게보호가능 Cf) struct 와의유일한차이점은 default 로 public Department of Computer Engineering 10
this Pointer 자기자신의객체를가리키는포인터 다른클래스에자기자신을매개변수로넘겨줘야할때사용 class Where { public: int data; void PrintPointer(); }; void Where::PrintPointer() { cout << 주소 : << this << \n ; } void main() { Where a,b,c; } a.printpointer(); b.printpointer(); c.printpointer(); Java에서도 this 사용 Objective-C에서는 self 사용 Department of Computer Engineering 11
상속성 (inheritance) Inheritance 클래스가상위클래스의특성을이어받을수있는특성 Modeling: 서로연관있는클래스들을계층적인구조로표현할수있으며, 자식클래스 (child class) 로갈수록일반적인것에서특수한것으로이동 실제업무에서는개발과테스트를거친안정된클래스를사용하다가수정하여야할때그클래스를상속받아서필요한부분만수정 사람 안정된클래스 MFC IS-A 관계 급여 CDocument 교수 학생 수정급여 CMyDoc 학부생 대학원생 Class Diagram Department of Computer Engineering 12
Inheritance ( 계속 ) Base Class, Super Class 또는 Parent Class 상속해주는측, 기반클래스 Derived Class 또는 Child Class 상속받는측, 파생클래스 상속의유형 단일상속 : 파생클래스가하나의기반클래스를상속 다중상속 : 파생클래스가여러개의기반클래스들을상속 base base1 base1 base2 derived base2 derived derived 단일상속다중상속 Java 에서는단일상속만지원 ( 다중인터페이스구현가능 ) Department of Computer Engineering 13
상속성및함수 Overriding 기반클래스에서상속받은멤버함수의기능대치 상속받은멤버함수의 Prototype 과똑같이재선언하여함수를작성함 Overriding 기반클래스의같은이름함수가호출되지않음 기반클래스의같은이름함수를 explicitly 호출가능 C++ 에서생성자와소멸자는호출됨 class Point { public: void show() { cout << Point\n ;}; }; class Point3D : public Point{ public: void show() { cout << Point3D - ; Point::show(); }; }; Department of Computer Engineering 14
함수의바인딩 (binding) C++ 가상함수 함수호출부분에함수가위치한메모리번지를연결시키는것 정적바인딩 (static binding) : 컴파일단계에서수행될함수의번지가결정됨 동적바인딩 (dynamic binding) : 프로그램실행시수행될함수의번지가결정됨 가상함수 기반클래스의함수선언에 virtual 키워드추가 파생클래스에서그함수오버라이딩 run-time polymorphism (dynamic binding) 지원 기반클래스포인터변수에파생클래스의객체를대입 객체의타입에따라알맞은멤버함수 ( 파생클래스의함수 ) 수행 Java 에서는 instance method 가 dynamic binding 됨 virtual 키워드필요없음 Department of Computer Engineering 15
C++ 가상함수 가상함수사용 #include <iostream.h> class base1 { public: virtual void show() { cout << base1 << endl; } }; class derived1 : public base1{ public: virtual void show() { cout << derived1 << endl; } }; void main() { base1 *p; base1 b1; derived1 d1; } p = &b1; p->show(); p = &d1; p->show(); p 의타입에맞는 show() 함수가수행됨 (dynamic binding, runtime type information management) Department of Computer Engineering 16
살면서프로그래밍이힘들었을때 처음배울때 컴퓨터가어떻게동작하는지모름 컴퓨터언어자체에대한숙련도낮음 X-Window 사용할때 내가원하던것을사용자에게요구하던방식에서사용자요구하는것을수행하는방식으로변함 생각의전환이필요했음 MFC 사용할때 C 를오래사용하다보니모듈로만들던것을 C++ 로클래스라는것을만들어사용 객체지향프로그래밍개념부족 main() 함수가없어서흐름을파악할수없었음 Department of Computer Engineering 17
MFC 가어려웠던이유 2 가지 이벤트프로그래밍 기존의 main() 함수를사용할때는흐름을프로그래머가주도함 예를들면, 파일명을입력하세요 윈도우프로그래밍에서는사용자가원할때수행 사용자가이벤트발생시키고이벤트처리함수실행 Application Framework C++ 언어를쓸줄안다고 OOP 를이해한것은아님 상속및 overriding ( 재정의 ) 사용 이미만들어진틀 (framework) 에서원하는부분만수정하는형태 흐름이 framework 안에있음 Department of Computer Engineering 18
Android Programming MFC, ios 등과방식이매우유사함잘안되는이유 흐름이보이지않음 흐름은프레임워크안에있음 남의좋은 source code 를보아도전체적으로는도움이되지않음 보는것은쉬운데실제처음부터만들어보려면막막함 이벤트프로그래밍 윈도우프로그래밍 Department of Computer Engineering 19