10 장객체 - 지향프로그래밍 I 창병모 1
10.1 객체 - 지향개념 창병모 2
객체지향 : 동기 프로그램에서실세계객체들을시뮬레이션 창병모 3
객체 (Object) 객체 상태 (state) 객체에대한데이터 행동 (behavior)- 할 ( 될 ) 수있는연산혹은동작 예 : 은행계좌 계좌번호 현재잔액 입금 출금 창병모 4
객체와클래스 객체 Object= 데이터 + 관련연산들 ( 메쏘드혹은동작들 ) 클래스 Class = 객체의정의혹은타입 (a type of Object) 프로그램 Program = 클래스들의집합 Program 실행 = 서로협력하는객체들의집합 (a set of Objects invoking each other Methods) 창병모 5
클래스 (Class) 객체에대한정의 데이터 ( 필드변수 ) 정의 관련연산 ( 메쏘드 ) 정의 클래스는객체에대한타입 객체는어떤클래스타입으로선언 객체는어떤클래스의실체 (instance) 이다. 실체화 (Instantiation) 클래스로부터객체를생성하는것 창병모 6
클래스의예 Java 의클래스 필드변수정의 메쏘드정의 C++ 의클래스 데이터멤버정의 멤버함수정의 창병모 7
10.3 Java 객체및클래스 창병모 8
Java 플랫폼 Embedded Space Java Classes Java Classes TV Profile Screen Phone Profile Car Profile CDC Foundation Class MIDP Kitty- Hawk Profile DojaP CLDC Core Class Smart Card Profile HotSpot JVM CVM KVM Card VM Servers Workstations PCs Thin Clients Battery Powered Card J2EE J2SE J2ME (Java 2 Micro Edition) 창병모 9
클래스정의 클래스는데이터선언과메소드선언을포함한다. int size, weight; char category; 데이터선언들 (Data declarations) 메쏘드선언들 (Method declarations) 창병모 10
클래스정의 클래스정의구문 class class-name { 필드변수선언구성자선언메쏘드선언 } 변수, 구성자, 메쏘드를클래스의멤버라고한다. 창병모 11
클래스정의 : 예 class Account { int account_number; double balance; Account (int account, double initial) { account_number = account; balance = initial; } // constructor Account void deposit (double amount) { balance = balance + amount; } // method deposit } // class Account 창병모 12
객체생성 new 연산자는클래스로부터객체를생성한다. Account saving = new Account (); saving 는 Account 객체를참조하는변수 new 연산자에의해생성된객체로초기화됨. 생성된객체에대해구성자를호출하여 set-up 한다. 창병모 13
클래스와객체생성 클래스로부터객체생성 (instantiation) Account savings; savings = new Account (1, 125.89); 객체 각객체를위한기억공간이할당됨 어디에? 클래스의실체 (an instance of a class) 실체변수 (instance variable) 클래스내에정의된변수로각객체마다기억공간이할당됨 한클래스의모든객체들은메쏘드를공유 창병모 14
클래스및객체 Class int account_number double balance new() new() Objects account_numbernumber 2908371 balance 573.21 account_number 4113787 balance 9211.84 창병모 15
구성자 (Constructors) 구성자 특별한메쏘드로생성된객체를 set up 하는데사용된다. 보통변수를초기화한다. 클래스와이름이같다 반환값이없으며반환타입도없다. 클래스의구성자를꼭정의해야하는것은아니다. 창병모 16
구성자 : 예 Account 구성자는초기값을받아서초기화한다. Account savings = new Account (1,125.89); 창병모 17
객체참조변수 객체참조변수선언및객체생성 Account savings; savings = new Account (1, 125.89); 객체가존재하면메쏘드호출가능 ( 점연산자이용 ) savings.deposit (35.00); 창병모 18
객체참조 객체참조는객체의주소를갖는다. Chess_Piece bishop1 = new Chess_Piece(); bishop1 객체에대한모든상호작용은객체참조변수를통해서일어난다. 창병모 19
배정 배정은값을변수에저장한다. 기초타입 : num2 = num1; 전 후 num1 num2 num1 num2 5 12 5 5 창병모 20
참조배정 객체참조변수의경우, 객체의주소가배정된다. bishop2 = bishop1; 전 후 bishop1 bishop2 bishop1 bishop2 창병모 21
메쏘드선언 char calc (int num1, int num2, String message) 메쏘드이름 매개변수리스트 반환타입 매개변수리스트는매개변수타입과이름을나열한다. 선언된매개변수를형식매개변수라고한다. 창병모 22
메쏘드선언 메쏘드헤더다음에메쏘드몸체가나온다. char calc (int num1, int num2, String message) { int sum = num1 + num2; char result = message.charat(sum); } return result; 반환식은반환타입과일치해야한다. sum 과 result 는지역변수로메쏘드가호출될때마다생성되고반환될때제거된다. 창병모 23
return 문 메쏘드의반환타입은메쏘드가반환하는값의타입을의미한다. Return 문은반환될값을명시한다. 반환값은반환타입과일치해야한다. 값을반환하지않는메쏘드는반환타입이 void 이다. 창병모 24
매개변수 메쏘드가호출될때실매개변수 (actual arguments) 값은형식매개변수에복사된다. 실매개변수 (actual parameters) ch = obj.calc (25, count, "Hello"); char calc (int num1, int num2, String message) { 형식매개변수 (fomal parameters) int sum = num1 + num2; char result = message.charat (sum); } return result; 창병모 25
메소드제어흐름 main doit helpme obj.doit(); helpme(); 다른클래스 창병모 26
Java 에서매개변수전달 매개변수를전달할때실매개변수값이형식매개변수에전달 ( 복사 ) 된다. 기초타입전달 값전달 (pass by value) 값이복사되어전달된다. 객체참조전달 참조전달 (pass by reference) 형식매개변수는실매개변수와이명이되며 형식매개변수와실매개변수는같은객체를참조한다. 창병모 27
10.4 C++ 객체및클래스 창병모 28
C++ 클래스 C 의 struct 데이터 ( 변수 ) 들의모음에대한타입 C++ 의 Class C의 struct를데이터뿐만아니라관련연산들을포함하도록확장 데이터멤버와멤버함수들의모음에대한타입 클래스는변수를선언하고객체를생성하는데사용. 창병모 29
C++ 객체 클래스의실체 (instance) s 는 Stack 의객체를위한변수 Stack s; 창병모 30
C++ 예 class Stack { public: char pop(); void push(char); Stack() { top = 0;} private: int top; char elements[101]; }; 창병모 31
C++ 예 char Stack::pop() { top = top -1; return elements[top+1]; } char Stack::push(char c) { top = top +1; elements[top] = c; } #include <stdio.h> main() { Stack s; s.push('!'); s.push('@'); s.push('#'); printf("%c %c %c n", s.pop(), s.pop(), s.pop()); } 창병모 32
Members 데이터멤버 (Data members) 클래스내에선언된변수들 top, elements 멤버함수 (Member functions) 클래스내에선언된함수들 push(), pop(), Stack() 창병모 33
구성자 / 소멸자 구성자 (Constructor) 초기화등을위한특별한멤버함수 객체가생성될때자동실행 Stack( ) 소멸자 (Destructor) 청소를위한자동멤버함수 객체가제거될때자동실행 ~Stack( ) 창병모 34
Member 의이름 <class-name>::<member names> 이름 ( 유효범위 ) 해결연산자 :: stack::pop() 창병모 35
구성자를이용한초기화 struct Complex { float re; float im; Complex(float r, i) { re= r; im=i;} } Complex x(1,2); 창병모 36
C++ 에서동적할당 new C C 타입의객체생성 새로생성된객체에대한포인터반환 delete p p 가가리키는객체제거 창병모 37
객체에대한포인터 클래스타입의객체를가리키는포인터변수 Stack *p; p = new Stack(100); this 멤버함수내에서자신 ( 대상 ) 객체를가리키는데사용됨 호출대상 (target) 객체 창병모 38
구성자 / 소멸자 : 예 class Stack { public: char pop(); void push(char); Stack(int); ~Stack(); private: int top; int size; char *elements; }; 창병모 39
구성자 / 소멸자 : 예 Stack::Stack(int n) { size = n; elements = new char[size]; top = 0; } Stack::~Stack() { delete elements; } 창병모 40
10.5 가시성조정자 (Visibility Modifiers) 창병모 41
캡슐화 (Encapsulation) 외부관점에서본객체 객체는캡슐화된개체로 서비스 ( 즉객체에대한창구 ) 를제공한다. 객체는자기관리되어야한다. 객체의상태는메쏘드에의해서변경되어야한다. 다른객체가접근하여상태를바꾸는것을어렵게해야한다. 창병모 42
캡슐화 (Encapsulation) 캡슐화된객체는블랙박스로생각할수있다. 객체의사용자는 서비스를요청할수있으나 서비스의구현에대해서는알수없어야한다. 클라이언트 메쏘드 데이터 창병모 43
캡슐화예 savings deposit withdraw add_ interest client produce_statement 창병모 44
가시성조정자 : Java 가시성조정자를사용하여캡슐의가시성을조정한다. 캡슐화를위해 오류의지역화를위해 클래스사용자는멤버함수정의만보면된다. 창병모 45
가시성조정자 public 멤버필드와메소드는클래스의내외어느곳에서나접근이가능 private 클래스내부에서만접근가능 package package 혹은 default 는아무것도기술하지않았을때 같은패키지내에서는자유롭게접근할수있으나, 패키지외부에서는접근할수없다. protected 같은패키지내에있는클래스들은모두접근가능 다른패키지의클래스들은이클래스를상속받은경우에만접근가능 창병모 46
패키지 관련된클래스들의모임 패키지를만들기위해서파일의처음부분에다음문장을기술한다. package package_name; package 문장을사용하지않는경우 : 디폴트패키지에속함. 패키지참조 패키지내에서클래스들은서로자유롭게다른클래스들을참조 다른패키지참조는아래와같이한다. import package_name.class_name; class name; 패키지경로는클래스파일의디렉토리경로와같다. 예 ) java.awt.graphics --> java/awt/graphics 창병모 47
가시성조정자 패키지내부에서접근 패키지외부에서접근 package class class package class class class 상속 O O X O protected public private default 상속 O O X O class class O O 상속 X X protected public private default 상속 X O X X class class class 창병모 48
가시성조정자 일반적규칙 객체의데이터는공용으로선언하면안된다. 공용메쏘드 객체의서비스 ( 창구 ) 를제공하는메쏘드로 서비스메쏘드라고도한다. 지원메쏘드 서비스메쏘드를지원하는메쏘드로 공용이아니다. 창병모 49
가시성조정자 : C++ 공용멤버 (public members) 클래스밖에서접근가능 전용멤버 (private members) 선언된클래스내에서만접근가능 보호멤버 (protected members) 상속을제외하면전용멤버와같다. 자손클래스들에서접근가능 창병모 50
메소드중복정의 (overloading) 한클래스내에동일한이름을갖는여러개의메쏘드 내부적으로다른작업을하지마의미면에서같다면동일한이름을사용가능 메소드이름은동일하지만매개변수개수, 순서타입등은달라야함 메쏘드의서명 (signature) 메쏘드이름, 매개변수의개수, 순서, 타입 컴파일러가서명을이용해서구분해서컴파일 메소드이름이동일하고서명도동일하다면컴파일오류발생 메소드의리턴타입은서명에포함되지않음 창병모 51
메소드중복정의 : 예 1 class Overloading { 2 public void say() { 3 System.out.println("Hello t tl ll?"); 4 } 6 public void say(string msg) { 7 System.out.println(msg); 8 } 10 public void say(string msg, int n) { 11 for(int i =0; i < n; i++) { 12 System.out.println(msg); t tl 13 } 14 } 16 public static void main(string args[]) { 17 Overloading a = new Overloading(); 18 a.say(); 19 a.say("how are you?"); 20 a.say("i am fine.", 3);... 창병모 52
구성자중복정의 : 예 구성자를중복정의하는경우 Account (int account) { account_number = account; balance = 0.0; } // constructor Account Account (int account, double initial) { account_number = account; balance = initial; iti } // constructor Account 창병모 53