SeoulTech 2011-2 nd 프로그래밍입문 (2) Chapter 6. 구조체와클래스 박종혁교수 (http://www.parkjonghyuk.net) Tel: 970-6702 Email: jhpark1@snut.ac.kr
Learning Objectives 구조체 구조체형 함수매개변수로서의구조체 구조체초기화 클래스 정의, 멤버함수 public 과 private 멤버 accessor 와 mutator 함수 구조체 vs. 클래스 6-2
구조체 두번째집합적자료형 : 구조체 집합의의미는 그룹화 배열 : 같은형의값의집합 구조체 : 다른형의값의집합 배열과같이하나의아이템으로취급한다 주요한차이점 : 구조체는먼저 정의 해야한다 다른변수들보다앞서서선언 6-3
구조체형 구조체는전역으로정의 ( 일반적 ) 메모리에할당되는것이아니다 공간확보자 (placeholder) 로서의역할 새로운형 ( 사용자정의형 ) 을생성하는것 정의 : struct CDAccountV1 새로운구조체형의이름 { }; double balance; double interestrate; int term; 멤버들의이름 6-4
구조체변수선언 구조체형을정의하고, 새로운형의변수를선언하는것 : CDAccountV1 account; 기본형의선언과동일하다 변수 account 는 CDAccountV1 형 멤버값 을가진다 구조체의각부분 6-5
구조체멤버접근 도트 (.) 연산자를이용하여멤버에접근 account.balance account.interestrate account.term 멤버변수 라고부름 구조체변수의부분 다른구조체는같은이름의멤버변수를가질수있다 충돌없음 6-6
디스플레이 6.1 구조체정의 (1 of 3) 6-7
디스플레이 6.1 구조체정의 (2 of 3) 6-8
디스플레이 6.1 구조체정의 (3 of 3) 6-9
구조체함정 구조체정의이후의세미콜론 (;) 세미콜론이반드시존재해야한다 : struct WeatherData { double temperature; double windvelocity; }; 세미콜론필요! 세미콜론전에구조체변수를선언할수있기때문에필요하다 6-10
구조체할당 CropYield 구조체 두개의구조체변수선언 : CropYield apples, oranges; 두변수모두 CropYield 구조체형 단순하게할당이가능하다 : apples = oranges; oranges 의멤버변수가 apples 의각각의멤버변수로단순하게복사된다 6-11
함수인자로서의구조체 기본형자료와비슷하게전달 Pass-by-value (Call-by-balue) Pass-by-reference (Call-by-reference) 또는복합적으로사용 함수에의해리턴될수도있다 리턴형은구조체형이된다 함수정의부내의리턴문은호출자에게구조체변수를전달한다 6-12
계층적구조체 ( 구조체멤버를가지는구조체 ) (1) 번구조체의태그가 (2) 번구조체의멤버로들어있다. 사용방법 PersonInfo person; person.birthday; person.birthday.year; struct Date (1) { Int month; int day; int year; }; struct PersonInfo (2) { double height; int weight; Date birthday; }; 6-13
구조체초기화 선언과동시에초기화가능 예 : struct Date { int month; int day; int year; }; Date duedate = {12, 31, 2003}; 선언에서세개의멤버변수모두에게초기화데이터를제공 6-14
구조체와유사 클래스 멤버변수뿐만아니라 멤버함수 가추가된다 OOP(object-oriented programming) 의핵심 객체에초점을맞춘다 객체 : 데이터와연산을모두포함한다 C++ 에서, 클래스형의변수가객체가된다 6-15
클래스정의 구조체의정의와비슷하다 예 : class DayOfYear 새로운클래스형의이름 { public: void output(); 멤버함수! int month; int day; }; 단지멤버함수의원형인것에주목! 함수의구현부는다른부분에위치한다 6-16
객체의선언 다른변수의선언과동일 사전정의형, 구조체형 예 : DayOfYear today, birthday; DayOfYear 형의두개의객체를선언 객체가포함하는것 : 데이터 ( 멤버변수 ) month, day 연산 ( 멤버함수 ) output() 6-17
클래스멤버접근 멤버들에는구조체와같은방법으로접근 예 : today.month today.day 멤버함수접근 : today.output(); 멤버함수의호출 6-18
클래스멤버함수 클래스멤버함수는반드시정의또는구현되어야한다 다른함수의정의와같다 main() 함수이후에정의가능 소속된클래스를반드시명시해야한다 : void DayOfYear::output() { } :: 는영역지정연산자 (scope resolution operator) 또는범위결정연산자 컴파일러에게함수가어떤클래스의멤버인지를알려준다 :: 이전의아이템을제한자라고한다 6-19
클래스멤버함수의정의 output() 멤버함수의정의에주목 ( 다음예제 ) 클래스멤버변수를사용 제한이없다 함수는클래스의모든객체에대하여사용된다 현재사용되는객체의데이터를참조 예 : today.output(); today 객체의데이터를출력한다 6-20
디스플레이 6.3 멤버함수를가지는클래스 (1 of 4) 6-21
디스플레이 6.3 멤버함수를가지는클래스 (2 of 4) 6-22
디스플레이 6.3 멤버함수를가지는클래스 (3 of 4) 6-23
디스플레이 6.3 멤버함수를가지는클래스 (4 of 4) 6-24
도트 (.) 와영역지정연산자 멤버가어디에속하는지지정하는데사용 도트 (.) 연산자 : 특정개체의멤버변수를지정 영역지정연산자 : 어떤클래스의멤버함수인지를지정 6-25
클래스의지위 클래스는모든것을갖춘형! int, double 등과같은하나의형 클래스형의변수를가질수있다 객체라고부른다 클래스형의매개변수를가질수있다 Pass-by-value (Call-by-value) Pass-by-reference (Call-by-reference) 다른형과같이클래스형을사용할수있다! 6-26
캡슐화 (Encapsulation) 다음을포함하는어떠한데이터형 데이터 ( 자료의범위 ) 연산 ( 데이터를조작할수있는 ) 예 : int 자료형은 : 데이터범위 : +-32,767 연산 : +,-,*,/,%,logical,etc. 클래스도동일하다 우리는데이터를명시하고, 연산은데이터의조작을허용한다! 6-27
추상데이터형 (Abstract Data Types) 추상 (Abstract) 프로그래머는세부사항을모른다 약어로 ADT 데이터와데이터의값을세팅하는연산의집합 ADT 는 언어에독립적이다 C++ 에서 ADT 는클래스를이용하여구현 C++ 클래스는 ADT 를정의 다른언어들또한 ADT 구현 6-28
캡슐화 캡슐화의확장 하나의단위로모든것을전달 클래스의선언 객체를가진다 객체는다음을캡슐화한다 데이터 ( 멤버변수 ) 자료의연산 ( 멤버함수 ) 6-29
OOP 의규칙 정보의은닉 클래스의사용자는연산이어떻게동작하는지에대한세부적인사항을알수없다 데이터의추상화 사용자는 ADT/ 클래스내에서데이터가어떻게취급되는지에대한세부사항을알지못한다 캡슐화 데이터와연산을함께제공하지만, 세부사항은숨겨짐 6-30
public 과 private 멤버 ( 접근제어자 ) 클래스내의데이터는대부분정의안에서 private 으로설계! OOP 규칙의유지 사용자로부터데이터 ( 멤버변수 ) 를숨긴다 연산을통해서만데이터의조작을허용 멤버함수를사용 public 아이템 ( 대체로멤버함수 ) 은사용자의접근이가능하다 6-31
public 과 private 예 (1/2) 이전의예를수정 : class DayOfYear { public: void input(); void output(); private: int month; int day; }; 데이터 ( 멤버변수 ) 는 private 객체는데이터를직접접근하지못한다 6-32
public 과 private 예 (2/2) 이전의예에서 객체의선언 : DayOfYear today; 객체 today 는 public 멤버에만접근이가능하다 cin >> today.month; // 허용되지않음! cout << today.day; // 허용되지않음! 대신 public 연산을호출해야한다 : today.input(); today.output(); 6-33
public 과 private 스타일 public & private 은혼용이가능 더욱일반적으로 public 이먼저위치한다 클래스를사용하는프로그래머에게편의를제공하기위함 private 데이터는사용자와무관하므로숨겨진다 클래스정의외부에서는 private 데이터의접근과수정이불가능하다 6-34
accessor 와 mutator 함수 객체는데이터를조작할수있는무엇인가가필요하다 accessor 멤버함수호출 객체가데이터를읽을수있도록허용 get 멤버함수 라고도한다 멤버변수의단순검색 mutator 멤버함수 객체가데이터를변경할수있도록허용 set 멤버함수 라고도한다 응용에기초한조작 6-35
인터페이스 (Interface ) 와 구현 (Implementation) 의분리 클래스의사용자는클래스의구현이어떻게되어있는지세부적으로알필요는없다 OOP 의규칙 캡슐화 (encapsulation) 사용자는단지 사용방법 이필요 클래스의인터페이스 (interface) 라고부른다 C++ public 멤버함수와그에연관된주석을지칭한다 클래스의구현은숨겨진다 멤버함수는다른부분에정의 사용자는볼수없다 6-36
구조체 vs. 클래스 구조체 일반적으로모든멤버는 public 멤버함수가없다 클래스 일반적으로모든데이터멤버는 private 인터페이스멤버함수는 public 기술적으로는같다 개념적으로는매우다른매커니즘 6-37
객체중심의사고 프로그래밍에대한초점 ( 패러다임 ) 의변화 이전 알고리즘이중심 OOP 객체 ( 데이터 ) 중심 알고리즘은여전히존재한다 단지자신의데이터에초점을준다 데이터를만들거나수정 소프트웨어솔루션의설계 다양한객체의정의와그것들이상호작용하는방법 6-38
요약 (1/2) 구조체는다른데이터형의집합 클래스는하나의단위 ( 객체 ) 에서데이터와함수를복합적으로사용한다 멤버변수와멤버함수 public 클래스외부에서접근가능 private 멤버함수의정의를통해서만접근가능 클래스와구조체형은함수의형식매개변수가될수있다 6-39
요약 (2/2) C++ 클래스의정의 두개의핵심부분으로구분한다 인터페이스 (Interface): 사용자가필요로하는부분 구현 (Implementation): 클래스의동작방법에대한세부적인부분 6-40
Q&A 1-41