객체지향프로그래 밍 (OOP)
내용 n 객체지향 q 객체 : 데이터중심의프로그래밍 q 캡슐화 : 개발자와이용자 구현감춤 q 재이용성 : 상속 다형성
내용 n 객체지향 q 객체 : 데이터중심의프로그래밍 q 캡슐화 : 개발자와이용자 구현감춤 q 재이용성 : 상속 다형성
프로그램의중심 = 데이터 n 절차와데이터구조 예 : 학생명부관리데이터구조 절차 시작 학생 학적번호이름주소 등록 학생명부 재적학생 학생추가학생삭제학생검색 어떠한데이터를가지고있는가 어떤처리가가능하가 학생번호입력 이름입력 주소입력 학생정보를명부에입력 계속입력? 종료 데이터구조가결정된후비로소절차가결정된다.
구조적프로그래밍언어와절차 n 구조적프로그래밍 q 절차를구조적으로그려서, 직감적으로알기쉽게작성 시작 학생번호입력 이름입력 주소입력 학생정보를명부에입력 계속입력? 종료 q 절차지향적인프로그래밍파라다임 q 데이터구조에관해서는조금고려가필요 데이터중심파라다임 : 객체지향 예 : C 언어 St udent Li st l i st ; do st r i ng name = I nput Name( ) ; st r i ng addr = I nput Addr ess( ) ; AddTo( l i st, name, addr ) ; } whi l e (! I send( ) ) ;
데이터의표현방법 n 객체지향의주인공 : 클래스와인스턴스 q 클래스 q 인스턴스 n 설계도 n 각각의제품, 실체 n 형 cl ass TV i nt channel ; n 변수의내용 TV t v1; TV t v2; TV t v3; TV t v4; doubl e vol ume;
C# 의클래스 (1) n C# 의클래스 = C 구조체를확장한것 학생 학적번호이름주소 등록 학생명부 재적학생 학생추가학생삭제학생검색 어떠한데이터를가지고있는가 어떤처리가가능하가 cl ass St udent publ i c i nt i d; publ i c st r i ng name; publ i c st r i ng addr ess; cl ass St udent Li st Li st <St udent > l i st ; i nt num; publ i c voi d Add( St udent s) ; publ i c voi d Remove( St udent s) ; publ i c St udent Fi nd( i nt i d) ; 어떠한데이터를가지고있는가 멤버변수 어떤처리가가능하가 멤버함수
C# 의클래스 (2) n C# 의클래스 = C 의구조체를확장한것 cl ass St udent Li st Li st <St udent > l i st ; i nt num; publ i c voi d Add( St udent s) ; publ i c voi d Remove( St udent s) ; publ i c St udent Fi nd( i nt i d) ; q struct 대신에 class 키워드 n ( 실제론 struct 도클래스로사용가능 ) q 멤버변수와멤버함수사용 n 멤버변수 : 어떤데이터를가지는가 n 멤버함수 : 어떤처리가가능한가 q private 과 public n 클래스의외부에보이는가 n 상세한것은다음에설명
생성자 n 생성자 = 초기화를위한특수한멤버함수 cl ass Per son publ i c st r i ng name; publ i c i nt age; publ i c Per son( st r i ng n, i nt a) name = n; age = a; } 클래스명과같은이름 리턴타입을지정안함 인스턴스작성시호출된다 인스턴스작성방법 Per son pp = new Per son( 화자 ", 4) ;
내용 n 객체지향 q 객체 : 데이터중심의프로그래밍 q 캡슐화 : 개발자와이용자 구현감춤 q 재이용성 : 상속 다형성
2 가지의시점 n 개발과사용 ( 예 : 텔레비젼 ) 개발 n 내부를보지마라 n 내부를열면 AS 안됨 사용 n 내부에는흥미없음 ntv 프로가보이면 OK 인터페이스 ( 개발과사용의경계 ) n 채널변경 같은필요한처리 n공개된처리만사용만공개
프로그래밍수칙 n 수개월전의자신은이미다른사람 q 자신이짠프로그램도, 자세한것은잊어버린다 프로그래밍수칙 주석을잘단다 읽기쉬운코드를작성한다 처리단위별로함수화한다 다른사람을위해? 자신을위해!
자신도사용자 n 일단짠후에는, 자신도사용자가된다. 개발? 이용! n 어디를건드리면고장나나? n 어떤순서로작동하면작동안되나? n 내용은별로기억하지않는다 ntv 만잘나오면된다 항상사용자입장에서개발해야! n 내용 ( 구현 ) 은감춘다 n 인터페이스가되는처리만클래스밖에공개
Private 와 public n private : 클래스밖에서안보임 ( 은폐, 캡슐화 ) n public : 클래스밖에서도보임 ( 공개 ) 클래스정의입장 cl ass St udent Li st pr i vat e Li st <St udent > l i st ; pr i vat e i nt num; publ i c voi d Add( St udent s) ; publ i c voi d Remove( St udent s) ; 클래스사용입장 St udent Li st l i st = new St udent ; l i st. num = 0; l i st. Add( s) ; 에러 OK 밖에서안보임 list 를잘못사용하면잘못됨 리스트의길이 num 을함부로변경하면잘못됨 밖에서보임 Add 등을통해서 list 나 num 의내용을변경 지침 : 데이터감춤 (private) 처리를보인다 (public)
setter/getter n 단순한데이터도멤버함수를사용하여읽고쓴다 cl ass Per son st r i ng name; i nt age; publ i c voi d Set Name( st r i ng n) ; publ i c st r i ng Get Name( ) ; publ i c voi d Set Age( i nt a) ; publ i c i nt Get Age q 귀찮아도 public 으로하고싶은멤버의수만 Set/Get 짝으로 n setter/getter 를호출한다 n accessor 라고부르기도하다 q 이유 : n 내부사양이바뀌어도외부사양을바꾸지않기위해 n 다형성 ( 다음에설명 ) 을위해 n) ; voi d Name( st r i ng st r i ng Name( ) ; q C# 에서는 속성 이라는 accessor 용의구문이따로있다
내용 n 객체지향 q 객체 : 데이터중심의프로그래밍 q 캡슐화 : 개발자와이용자 구현감춤 q 재이용성 : 상속 다형성
클래스의개층구조 n 추상과구체화 A 사구현 B 사구현 TV C 사구현 n 상위개념과하위개념 동물 포유류 영장목 사람 조류 식육목 고릴라 파충류 소목
C++ 클래스의상속 n 데이터의승계와추가 기저클래스 cl ass Per son pr ot ect ed st r i ng name; pr ot ect ed i nt age; 파생클래스 cl ass St udent : Per son pr ot ect ed: i nt st udent I d; q 상위개념 : 기저 (base) 부모 (super) q 하위개념 : 파생 (derived) 자녀 (sub) q 클래스의뒤에 : 기저클래스명 q protected: n 클래스밖에서비공개 n 파생클래스에서공개 cl ass Teacher : Per son pr ot ect ed: Cour ce i nt er est ;
다형성 n 다형성 = 행동의변경 기저클래스 cl ass Per son publ i c vi r t ual i nt Get Age( ) } q 처리행동의변경 n 덮어쓰기 (override) q 덮어쓰고자하는처리에 virtual 을붙임 정직한사람 cl ass Tr uepenny : Per son publ i c over r i de i nt Get Age( ) r et ur n age; } 거짓말쟁이 cl ass Li ar : Per son publ i c 나이속임 over r i de i nt Get Age( ) r et ur n age - 2; } polymorphism: 많다+형태 다형성. 다양한행동
정적인형과동적인형 n 부모클래스의포인터에자식클래스의인스턴스대입이가능하다 Per son p1 = new Tr uepenny( ) ; Per son p2 = new Li ar ( ) ; 정적 동적 n 정적인형 : 변수의형 n 동적인형 : 실제로 new 로만든형 정적인형 동적인형 p1 Per son Tr uepenny p2 Per son Li ar
가상함수 예 n 가상함수 = virtual 키워드가붙는함수 q 일반함수 q 가상함수 Per son p1 = new Tr uepenny( ) ; Per son p2 = new Li ar ( ) ; i nt age_p1 = p1. Get Age( ) ; i nt age_p2 = p2. Get Age( ) ; 정적인형 : 정적인형에기반하여호출된다 : 동적인형에기반하여호출된다 ) 1. Get Age 가일반함수 동적인형 p1 Per son Tr uepenn y p2 Per son Li ar i nt Get Age( ) ; p1. Get Age( ) ; p2. Get Age( ) ; 2. Get Age 가가상함수 vi r t ual i nt Get Age( ) ; p1. Get Age( ) ; p2. Get Age( ) ; Per son 의 Get Age Per son 의 Get Age Tr uepenny 의 Get Age Li ar 의 Get Age