Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

7 장 프렌드와 연산자 중복 1 명품 C++. 친구란 ? 2 우리 집 냉장고 내 침대 우리 집 TV 우리 집 식탁 친구 친구 ? 내 가족의 일원은 아니지만 내 가족과 동일한 권한을 가진 일원으로 인정받은 사람.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
제2장 C 언어의 확장 C++(1).
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++로 프로그래밍한다는 것의 의미 세상에서 가장 간단한 C++ 프로그램
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++ 프로그래밍 기초 : 객체지향의 시작 C++로 프로그래밍한다는 것의 의미
C++ Espresso 제1장 기초 사항.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
8. 객체와 클래스 (기본).
C++ Espresso 제9장 다형성.
조 병 규 Software Quality Lab. 한국교통대학교
명품 C++ 8장 상속.
5장 배열 작성자 : 변재현.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 03. 클래스의 기본.
명품 C++ 7장 프렌드와 연산자 중복.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
6주차: Functions in C and Others
자바 5.0 프로그래밍.
C++ Programming: chapter 7 – inheritence
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
Java 6장. 클래스 : 속성 public class SumTest {
Lesson 7. 클래스와 메소드 - 1.
스택(Stack) 김진수
14. 예외처리.
11장. 1차원 배열.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
13. 연산자 오버로딩.
Chapter 3 클래스. 최호성.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
7장 인터페이스와 추상 클래스.
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
명품 C++ 9장 가상 함수와 추상 클래스.
가상함수와 추상 클래스.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 02. 자바 기본 문법.
Chapter 08. 함수.
멤버함수 중첩( 복사 생성자 ) - 연사자 중첩 - 동적 메모리를 가지는 클래스를 지원 하도록 멤버 함수 작성
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
JA A V W. 06.
12. 상속 : 고급.
객체기반 SW설계 팀활동지 4.
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
제 6 장 함수(functions).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
에어 PHP 입문.
Chapter 13. 템플릿(Template) 1
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Chapter 2 C++ 함수와 네임스페이스. 최호성.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
서브클래스 조 병 규 한 국 교 통 대 학 교 SQ Lab..
캡슐화 (Encapsulation) 두원공과대학 소프트웨어개발과 이 원 주.
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
자바 객체 지향 프로그래밍 Ps lab 김윤경.
상속 (Inheritance) private 전용부분 전용부분 공용부분 공용부분 public 기본 클래스
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab.

static 멤버 자료 (static member data) static 자료형 memberDataName1 [,memberDattName2] . . .; 해당 클래스의 모든 객체에서 멤버 자료(기억 장소)를 공동으로 사용하고자 할 경우 static을 선언한다. 클래스 설정 후 다음과 같은 형식으로 반드시 전역적으로 초기 값을 수록시켜 사용하여야 한다. 자료형 className::staticMemberDataName = value; SQ Lab.

(예) static 멤버 자료 /*001*/ // staticMemberData01cNcpp /*002*/ /*003*/ #include "iostream" /*004*/ using namespace std; /*005*/ class classX /*006*/ { /*007*/ private : /*008*/ int Total; /*009*/ static int staticTotal; /*010*/ /*011*/ public : /*012*/ classX(int initialValue=0) /*013*/ { /*014*/ Total = initialValue; /*015*/ } /*016*/ void adder(int x) /*017*/ { /*018*/ Total = Total + x; /*019*/ staticTotal = staticTotal + x; /*020*/ }; SQ Lab.

/*021*/ void display(char *object) /*022*/ { /*022*/ { /*023*/ cout << "\n " << object << " : " /*024*/ << "Total=>" << Total << " " /*025*/ << "staticTotal=>" << staticTotal; /*026*/ } /*027*/ }; /*028*/ /*029*/ int classX::staticTotal = 10; /*030*/ /*031*/ void main() /*032*/ { /*033*/ classX x1, x2; /*034*/ /*035*/ x1.display("x1"); /*036*/ x2.display("x2"); /*037*/ cout << "\n"; /*038*/ /*039*/ x1.adder(1); /*040*/ x1.display("x1"); /*041*/ x2.display("x2"); /*042*/ cout << "\n"; /*043*/ SQ Lab.

/*048*/ cout << "\n\n Type any character : "; /*049*/ cin.get(); /*044*/ x2.adder(3); /*045*/ x1.display("x1"); /*046*/ x2.display("x2"); /*047*/ /*048*/ cout << "\n\n Type any character : "; /*049*/ cin.get(); /*050*/ } SQ Lab.

/*007*/ private : /*008*/ int Total; /*009*/ static int staticTotal; static이 선언되지 않은 멤버 자료 Total과 static을 선언한 멤버 자료 staticTotal을 설정하였다. /*016*/ void adder(int x) /*017*/ { /*018*/ Total = Total + x; /*019*/ staticTotal = staticTotal + x; /*020*/ }; Total과 staticTotal에 전달된 x값을 누적하는 adder() 멤버 함수를 설정하였다.   /*029*/ int classX::staticTotal = 10; classX 클래스의 staticTotal에 10을 수록한다. static 멤버 자료는 반드시 전역으로 초기 값을 설정해 주어야 한다. /*033*/ classX x1, x2; classX형의 객체 x1과 x2를 생성한다. x1의 Total에 0이 수록되고, x2의 Total에 0이 수록되며 staticTotal은 x1과 xt2에서 공동으로 사용하여 값(10)이 같다. /*039*/ x1.adder(1); 실인자를 1로 하여 x1의 adder() 멤버 함수를 수행시킨다. x1의 Total에 1이 누적되고, staticTotal에 1이 누적된다. 따라서 x1의 Total은 1이고, x2의 Total은 0이며, x1과 x2의 staticTotal은 11이 수록되어 있다. SQ Lab.

/*044*/ x2.adder(3); 실인자를 3로 하여 x2의 adder() 멤버 함수를 수행시킨다. x2의 Total에 3가 누적되고, staticTotal에 3이 누적된다. 따라서 x1의 Total은 1이고, x2의 Total은 3이며, x1과 x2의 staticTotal은 14가 수록되어 있다. SQ Lab.

[결과] SQ Lab.

static 멤버 함수 (static member function) static 함수형 memberFunctionName([parameterList]); static으로 선언한 멤버 함수는 해당 클래스의 static 멤버 자료만 사용할 수 있다. SQ Lab.

(예) static 멤버 함수 /*001*/ // staticMemberFunction01cNcpp /*002*/ /*003*/ #include "iostream" /*004*/ using namespace std; /*005*/ class classX /*006*/ { /*007*/ private : /*008*/ int Total; /*009*/ static int staticTotal; /*010*/ /*011*/ public : /*012*/ classX(int initialValue=0) /*013*/ { /*014*/ Total = initialValue; /*015*/ } /*016*/ static void adder(int x) /*017*/ { /*018*/ staticTotal = staticTotal + x; /*019*/ // Total = Total + x; //error : illegal reference /*020*/ }; SQ Lab.

/*021*/ void display(char *object) /*022*/ { /*022*/ { /*023*/ cout << "\n " << object << " : " /*024*/ << "Total=>" << Total << " " /*025*/ << "staticTotal=>" << staticTotal; /*026*/ } /*027*/ }; SQ Lab.

/*007*/ private : /*008*/ int Total; /*009*/ static I nt staticTotal; static이 선언되지 않은 멤버 자료 Total과 static을 선언한 멤버 자료 staticTotal을 설정하였다. /*016*/ static void adder(int x) /*017*/ { /*018*/ staticTotal = staticTotal + x; /*019*/ // Total = Total + x; //error : illegal reference /*020*/ }; adder() 멤버 함수를 static 함수로 선언하였다. 이 함수에서 사용할 수 있는 멤버 자료는 반드시 static 으로 선언된 것이다. Total은 static 멤버 자료가 아니므로 이 static 함수에서는 사용할 수 없다. SQ Lab.

const 멤버 함수 함수형 memberFunctionName([parameterList]) const { 멤버 자료의 값을 참조만 할 수 있고, 새로운 값을 수록할 수는 없음 } const로 선언된 함수에서는 멤버 자료의 값만 참조할 수 있지 새로운 값을 수록하지는 못한다. - 멤버 자료의 값을 보호하여야 할 필요가 있을 경우 선언한다. - const 단어는 반드시 블록({}) 바로 앞에 기술한다. SQ Lab.

(예) const 멤버 함수 /*001*/ // constMemberFunction01cNcpp /*002*/ /*003*/ #include "iostream" /*004*/ using namespace std; /*005*/ class classX /*006*/ { /*007*/ private : /*008*/ int x, y, total; /*009*/ /*010*/ public : /*011*/ classX(int initialValue=0) /*012*/ { /*013*/ x = 10; /*014*/ y = 30; /*015*/ total = initialValue; /*016*/ } /*017*/ void display(char *object) const /*018*/ { /*019*/ cout << "\n " << object << "::x=====>" << x /*020*/ << "\n " << object << "::y=====>" << y /*021*/ << "\n " << object << "::total=>" << total; /*022*/ } SQ Lab.

/*029*/ // void constAdder(int x) const /*030*/ // { /*023*/ void Adder(int p) /*024*/ { /*025*/ x = x + 1; /*026*/ y = y + 2; /*027*/ total = total + p; /*028*/ } /*029*/ // void constAdder(int x) const /*030*/ // { /*031*/ // x = x + 3; /*032*/ // y = y + 4; /*033*/ // total = total + x; /*034*/ // } /*035*/ }; SQ Lab.

/*007*/ private : /*008*/ int x, y, total; 정수형 멤버 자료 x, y, total을 설정하였다. /*017*/ void display(char *object) const /*018*/ { /*019*/ cout << "\n " << object << "::x=====>" << x /*020*/ << "\n " << object << "::y=====>" << y /*021*/ << "\n " << object << "::total=>" << total; /*022*/ } display()를 const 멤버 함수로 선언하였다. 이 함수에서는 모든 멤버 자료(x, y, total)를 cout 문장에서 참조만 하였으므로 정상적이다. /*029*/ // void constAdder(int x) const /*030*/ // { /*031*/ // x = x + 3; /*032*/ // y = y + 4; /*033*/ // total = total + x; /*034*/ // } constAdder를 const 멤버 함수로 선언하였다. 이 함수에서는 모든 멤버 자료(x, y, total)를 참조도 하고 새로운 값을 수록도 하였다. 따라서 새로운 값을 수록하는 부분은 모두 잘 못(error)이다. SQ Lab.

mutable 멤버 자료 mutable 자료형 memberDataName; const 멤버 함수에서도 새로운 값을 수록할 수 있다. - mutable은 memberDataName 앞 어느 위치에 기술해도 된다. SQ Lab.

(예) mutable 멤버 자료 /*001*/ // mutableMemberData01cNcpp /*002*/ /*003*/ #include "iostream" /*004*/ using namespace std; /*005*/ class classX /*006*/ { /*007*/ private : /*008*/ mutable int x; /*009*/ mutable int y; /*010*/ int mutable total; /*011*/ /*012*/ public : /*013*/ classX(int initialValue=0) /*014*/ { /*015*/ x = 10; /*016*/ y = 30; /*017*/ total = initialValue; /*018*/ } SQ Lab.

/*019*/ void display(char *object) const /*020*/ { /*020*/ { /*021*/ cout << "\n " << object << "::x=====>" << x /*022*/ << "\n " << object << "::y=====>" << y /*023*/ << "\n " << object << "::total=>" << total; /*024*/ } /*025*/ void Adder(int p) /*026*/ { /*027*/ x = x + 1; /*028*/ y = y + 2; /*029*/ total = total + p; /*030*/ } /*031*/ void constAdder(int p) const /*032*/ { /*033*/ x = x + 3; /*034*/ y = y + 4; /*035*/ total = total + p; /*036*/ } /*037*/ }; SQ Lab.

/*052*/ cout << "\n\n Type any character : "; /*053*/ cin.get(); /*038*/ void main() /*039*/ { /*040*/ classX x1; /*041*/ /*042*/ x1.display("x1"); /*043*/ cout << "\n"; /*044*/ /*045*/ x1.Adder(3); /*046*/ x1.display("x1"); /*047*/ cout << "\n"; /*048*/ /*049*/ x1.constAdder(5); /*050*/ x1.display("x1"); /*051*/ /*052*/ cout << "\n\n Type any character : "; /*053*/ cin.get(); /*054*/ } SQ Lab.

/*007*/ private : /*008*/ mutable int x; /*009*/ mutable int y; /*010*/ int mutable t otal; 정수형 멤버 자료 x, y, total을 모두 mutable 선언을 하였으므로 const 멤버 함수에서 참조뿐만 아니라 새로운 값을 수록할 수도 있다. /*031*/ void constAdder(int p) const /*032*/ { /*033*/ x = x + 3; /*034*/ y = y + 4; /*035*/ total = total + p; /*036*/ } constAdder를 const 멤버 함수로 선언하였다. 이 함수에서는 모든 멤버 자료(x, y, total)에 원칙적으로 새로운 값을 수록시킬 수 없으나, 각 멤버 자료를 mutable로 선언하였으므로 새로운 값을 수록시킬 수 있다. SQ Lab.

const 객체 const className objectName(parameterList); - const는 objectName 앞 어느 위치에든 기술할 수 있다. SQ Lab.

(예) const 객체 /*001*/ // constObject01cNcpp /*002*/ /*003*/ #include "iostream" /*004*/ using namespace std; /*005*/ class classX /*006*/ { /*007*/ private : /*008*/ mutable int x; /*009*/ mutable int y; /*010*/ mutable int total; /*011*/ /*012*/ public : /*013*/ classX(int initialValue=0) /*014*/ { /*015*/ x = 10; /*016*/ y = 30; /*017*/ total = initialValue; /*018*/ }; /*019*/ SQ Lab.

/*020*/ void display(char *x1) const /*021*/ { /*021*/ { /*022*/ cout << "\n " << x1 << "::x=====>" << x /*023*/ << "\n " << x1 << "::y=====>" << y /*024*/ << "\n " << x1 << "::total=>" << total; /*025*/ } /*026*/ /*027*/ void constAdder(int p) const /*028*/ { /*029*/ x = x + 1; /*030*/ y = y + 3; /*031*/ total = total + p; /*032*/ }; /*033*/ /*034*/ void Adder(int p) /*035*/ { /*036*/ x = x + 2; /*037*/ y = y + 4; /*038*/ total = total + p; /*039*/ }; /*040*/ }; SQ Lab.

/*052*/ // x1.Adder(3); //error /*053*/ /*041*/ void main() /*042*/ { /*043*/ const classX x1; /*044*/ /*045*/ x1.display("x1"); /*046*/ cout << "\n"; /*047*/ /*048*/ x1.constAdder(3); /*049*/ x1.display("x1"); /*050*/ cout << "\n"; /*051*/ /*052*/ // x1.Adder(3); //error /*053*/ /*054*/ cout << "\n\n Type any character : "; /*055*/ cin.get(); /*056*/ } SQ Lab.

/*007*/ private : /*008*/ mutable int x; /*009*/ mutable int y; /*010*/ int mutable total; 정수형 멤버 자료 x, y, total을 모두 mutable 선언을 하였으므로 const 멤버 함수에서 참조뿐만 아니라 새로운 값을 수록할 수도 있다. /*020*/ void display(char *x1) const /*021*/ { /*022*/ cout << "\n " << x1 << "::x=====>" << x /*023*/ << "\n " << x1 << "::y=====>" << y /*024*/ << "\n " << x1 << "::total=>" << total; /*025*/ } display()를 const 멤버 함수로 설정하였다. /*027*/ void constAdder(int p) const /*028*/ { /*029*/ x = x + 1; /*030*/ y = y + 3; /*031*/ total = total + p; /*032*/ }; constAdder()를 const 멤버 함수로 설정하였다. SQ Lab.

/*034*/ void Adder(int p) /*035*/ { /*036*/ x = x + 2; /*037*/ y = y + 4; /*038*/ total = total + p; /*039*/ }; Adder()는 const를 선언하지 않은 멤버 함수로 설정하였다. /*043*/ const classX x1; classX형태의 객체 x1을 const 선언하여 생성하였다. x1의 const 멤버 함수인 display()와 constAdder()만을 호출(사용)할 수 있다. /*045*/ x1.display("x1"); /*048*/ x1.constAdder(3); /*049*/ x1.display("x1"); /*052*/ // x1.Adder(3); //error Adder()는 const 멤버 함수가 아니기 때문에 호출(사용)할 수 없다. SQ Lab.