C++ chap.03: 클래스와 객체
학습 목표 실세계의 객체와 C++ 객체에 대해 이해한다. C++ 클래스를 작성할 수 있다. 객체를 생성하고 활용할 수 있다. 생성자와 소멸자를 알고 작성할 수 있다. private, protected, public 접근 지정자를 이해한다. 인라인 함수의 목적을 이해하고 활용할 수 있다. C++ 구조체를 작성하고, 클래스와의 차이점을 안다. 헤더 파일과 cpp 파일을 분리하여 C++ 프로그램을 작성할 수 있다. 객체 세상의 모든 것이 객체 ex) TV, 의자, 책 객체는 캡슐화된다 캡슐화(encapsulation): 객체의 본질적인 특성 객체를 캡슐로 싸서 그 내부를 보호하고 볼 수 없게 함 ex) 캡슐에 든 약은 어떤 색인지 어떤 성분인지 보이지 않고, 외부로부터 안전, TV, 냉장고, 카메라, 인체 목..
2023.09.20
C++
no image
C++: 데이터 타입
void /* 함수 반환 형식으로 사용되는 경우: 함수가 값을 반환하지 못 함 함수의 매개 볌수 목록에 사용되는 경우: 함수가 매개 변수를 사용하지 않음을 지정 */ //문자형 char /* 바이트: 1 byte 값의 범위: -128 ~ 127 한쌍의 단일 따옴표를 이용하여 표기 */ string //정수형 int, long, long int /* 바이트: 4 byte 값의 범위: -2,147,483,648 ~ 2,147,483,647 */ short int /* 바이트: 2 byte 값의 범위: –32,768 ~ 32,767 */ long long /* 바이트: 8 byte 값의 범위: –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 */ //실수형 f..
2023.09.06
C++
no image
chap.00: C++의 기초
//basic.c #include int g = 20; //전역 변수 int add(int x, int y) { //함수 정의 return x+y; } int main() { int a, b, sum; //지역 변수 scanf(" %d %d", &a, &b); //입력 sum = a + b; printf("sum: %d", sum); //출력 return 0; //생략 가능 } //basic.cpp #include using namespace std; int g = 20; //전역 변수 int add(int x, int y) { //함수 정의 return x+y; } int main() { int a, b, sum; //지역 변수 cin >> a >> b; //입력 sum = a + b; cout //s..
2023.09.05
C++

C++ chap.03: 클래스와 객체

crimsonhat
|2023. 9. 20. 08:36

학습 목표

  1. 실세계의 객체와 C++ 객체에 대해 이해한다.
  2. C++ 클래스를 작성할 수 있다.
  3. 객체를 생성하고 활용할 수 있다.
  4. 생성자와 소멸자를 알고 작성할 수 있다.
  5. private, protected, public 접근 지정자를 이해한다.
  6. 인라인 함수의 목적을 이해하고 활용할 수 있다.
  7. C++ 구조체를 작성하고, 클래스와의 차이점을 안다.
  8. 헤더 파일과 cpp 파일을 분리하여 C++ 프로그램을 작성할 수 있다.

객체

  • 세상의 모든 것이 객체 ex) TV, 의자, 책
  • 객체는 캡슐화된다
    • 캡슐화(encapsulation): 
    • 객체의 본질적인 특성
    • 객체를 캡슐로 싸서 그 내부를 보호하고 볼 수 없게 함 ex) 캡슐에 든 약은 어떤 색인지 어떤 성분인지 보이지 않고, 외부로부터 안전, TV, 냉장고, 카메라, 인체
    • 목적: 객체 내 데이터에 대한 보안, 보호, 외부 접근 제한
  • 객체의 일부분 공개; 객체의 일부 요소는 공개된다
    • 외부와의 인터페이스(정보 교환 및 통신)를 위해 객체 일부분 공개
    • TV의 경우, On/Off 버튼, 밝기 조절, 채널 조절, 음량 조절 버튼 노출. => 리모컨 객체와 통신하기 위함
  • 객체는 상태(state)와 행동(behavior)으로 구성
    • TV 객체 사례
      • 상태
        • on/off 속성 - 현재 작동 중인지 표시
        • 채널(channel) - 재 방송중인 채널
        • 음량(volume) - 현재 출력되는 소리 크기
      • 행동
        • 켜기(power on)
        • 끄기(power off)
        • 채널 증가(increase channel)
        • 채널 감소(decrease channel)
        • 음량 증가(increase volume)
        • 음량 줄이기(decrease volume)

클래스

  • 객체를 만들어내기 위해 정의된 설계도, 틀
  • 클래스는 객체가 아님, 실체도 아님
  • 멤버 변수와 멤버 함수 선언

객체

  • 객체는 생성될 때 클래스의 모양을 그대로 가지고 탄생
  • 멤버 변수와 멤버 함수로 구성
  • 메모리에 생성, 실체(instance)라고도 부름
  • 하나의 클래스 틀에서 찍어낸 여러 개의 객체 생성 가능
  • 객체들은 상호 별도의 공간에서 생성
class TV {
    bool on;
    int channel;
    int volume;
public:
    void powerON();
    void powerOff();
    void increaseChannel();
    void decreaseChannel();
    void increaseVolume();
    void decreaseVolume();
};

 

 


클래스 작성

  • 멤버 변수와 멤버 함수로 구성
  • 클래스 선언부와 클래스 구현(정의)부로 구성

클래스 선언부(class declaration)

  • class 키워드를 이용하여 클래스 선언
  • 멤버 변수와 멤버 함수 선언
    • 멤버 변수는 클래스 선언 내에서 초기화할 수 없음
    • 멤버 함수는 원형(prototype) 형태로 선언
  • 멤버에 대한 접근 권한 지정
    • private, public, protected 중의 하나
    • 디폴트는 private
    • public: 다른 모든 클래스나 객체에서 멤버의 접근이 가능함을 표시

클래스 구현(class implementation)

  • 클래스에 정의된 모든 멤버 함수 구현

 

#include <iostream>
using namespace std;

class Circle { //Circle 선언부
public:
    int radius;
    double getArea();
};

double Circle::getArea() { //Circle 구현부
    return 3.14*radius*radius;
}

int main() {
    Circle donut; //객체 donut 생성
    donut.radius = 1; //donut의 멤버 변수 접근 => donut 객체의 반지름을 1로 설정
    double area = donut.getArea(); //donut의 멤버 함수 호출 => donut 객체의 면적 알아내기
    cout << "donut의 면적은 " << area << endl; 
    
    Circle pizza;
    pizza radius = 30; //pizza 객체의 반지름을 30으로 설정
    area = pizza.getArea(); //pizza 객체의 면적 알아내기
    cout << "pizza 면적은 " << area << endl;
}

범위 지정 연산자(::): 


 

 

'C++' 카테고리의 다른 글

C++: 데이터 타입  (0) 2023.09.06
chap.00: C++의 기초  (0) 2023.09.05

C++: 데이터 타입

crimsonhat
|2023. 9. 6. 10:45
void
/*
함수 반환 형식으로 사용되는 경우: 함수가 값을 반환하지 못 함
함수의 매개 볌수 목록에 사용되는 경우: 함수가 매개 변수를 사용하지 않음을 지정
*/
//문자형
char
/*
바이트: 1 byte
값의 범위: -128 ~ 127
한쌍의 단일 따옴표를 이용하여 표기
*/

string
//정수형
int, long, long int
/* 
바이트: 4 byte
값의 범위: -2,147,483,648 ~ 2,147,483,647 
*/

short int
/* 
바이트: 2 byte
값의 범위: –32,768 ~ 32,767
*/

long long
/* 
바이트: 8 byte
값의 범위: –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
*/
//실수형
float
/* 
바이트: 4 byte
값의 범위: -2,147,483,648 ~ 2,147,483,648 
소수점 범위: 6자리
*/

double
/* 
바이트: 8 byte
값의 범위: -2,147,483,648 ~ 2,147,483,648 
소수점 범위: 15자리
*/
//논리형
bool
/*
바이트: 1 byte
값의 범위: 0 ~ 1
불의 변수에는 값 true와 false가 있다
C에서는 거짓이면 0, 참이면 0이 아닌 값이었다
*/

'C++' 카테고리의 다른 글

C++ chap.03: 클래스와 객체  (0) 2023.09.20
chap.00: C++의 기초  (0) 2023.09.05

chap.00: C++의 기초

crimsonhat
|2023. 9. 5. 21:15
//basic.c

#include <stdio.h>

int g = 20; //전역 변수

int add(int x, int y) { //함수 정의
	return x+y;
}

int main() {
	int a, b, sum; //지역 변수
	scanf(" %d %d", &a, &b); //입력
	sum = a + b;
	printf("sum: %d", sum); //출력
	return 0; //생략 가능
}
//basic.cpp

#include <iostream>
using namespace std;

int g = 20; //전역 변수

int add(int x, int y) { //함수 정의
	return x+y;
}

int main() {
	int a, b, sum; //지역 변수
    cin >> a >> b; //입력
    sum = a + b;
    cout << "sum: " << sum; //출력
    return 0; //생략 가능
}

입력: 2 5

출력: sum: 7

 

using namespace std; // C++은 클래스를 사용해서 cin과 cout을 쓰려면 선언을 해야한다
cin >> //scanf
cout << //printf

C/C++ 기본적인 구성 비교

공통

  • #include 사용
  • 변수와 변수 선언
  • 함수 구성 및 선언
  • main() 함수
  • 연산자
  • 전역 변수와 지역 변수

추가된 사항

  • 헤더 파일 <stdio.h>에 <iostream> 추가
  • 헤더 파일에 .h 사용하지 않음
  • 입출력 함수 scanf/printf에 cin(console input)/cout(console output) 추가 
  • 데이터 타입(void, char, int, short int, long int, long, long long, float, double, bool) - bool 추가: bool 타입의 상수 true, false 사용 가능
  • endl == "\n"

 

//bool 데이터 타입 예시

#include <iostream>
using namespace std;

int main() {
	bool test = true;
    cout << "1.bool: " << test << endl;
    
    test = false;
    cout << "2.bool: " << test << endl;
    return 0;
}

출력:
1.bool: 1

2.bool: 0

 

[주의]: bool의 데이터 값의 입력은 true/false로 입력 가능, 그러나 출력은 1/0으로 표현됨


//1-1
#include <iostream>
using namespace std;

int g = 20; 

int add(int x, int y) {
	reuturn x + y;
}

int main() {
    int a, b, sum;
    cout << "두 정수를 입력하세요 >>"; //프롬프트 출력
    cin >> a >> b;
    sum = a + b;
    cout << "합은 " << sum << "\n";
    cout << "합은 " << add(a, b) << "\n";
    cout << "전역 변수 g 값은 " << g;
    
    return 0;
}

 

C/C++ 연산자

int a = 5, b = 10, c;

 

조건문

반복문

  • for(start value; condition; step size) {

    to do;

    }

 

포인터

 

int addArray(int a[], int size) { //배열을 매개 변수로 가진 함수, a는 포인터 역할을 한다, a -> n[0]
...
} //int addArray(int *a, int size)가 가능

int n[5] = { 1, 2, 3, 4, 5 };
int s = addArray(n, 5); //배열 n을 매개 변수로 전달
int m[3] = { 1, 2, 3};
int t = addArray(m, 3); //배열 m을 매개 변수로 전달
n[0] n[1] n[2] n[3] n[4]
1 2 3 4 5
a[0] a[1] a[2] a[3] a[4]

 

  • 실행 중 메모리 주소 값
  • 주소(포인터)를 이용하여 메모리에 직접 값을 쓰거나 메모리로부터 값을 읽어올 수 있음
int n = 10;
int *p; //정수를 저장하는 변수의 주소를 저장할 수 있는 포인터 변수 p 선언
p = &n; //p에 n의 주소를 저장

int n[10];
int *p = n;
n[0] n[1] n[2] n[3] n[4] n[5] n[6] n[7] n[8] n[9]
          8   99    
p + 0 p +1  p +2 p + 3            
n[5] = 8 배열 n의 시작 위치에서 5만큼 떨어진 주소에 8 기록
n + 5 n[5]의 주소
*(n + 5) n[5]에 8 기록
p = p + 7 p는 n[7]의 주소
*p = 99 n[7]에 99 기록

 

#include <iostream>
using namespace utd;

int main() {
	int a = 10;
    int *pa = &a; //*pa == 간접적으로 접근 가능한 공간의 데이터
    
    cout << "1. a: " << a << endl; //10
    cout << "2. &a: " << &a << endl; //a의 주소
    cout << "3. pa: " << pa << endl; //*pa의 주소
    cout << "4. &pa: " << &pa << endl; //pa의 주소
    cout << "5. *pa: " << *pa << endl; //10
    
    *pa = 5; //*pa가 간접적으로 사용 가능한 변수의 메모리 공간을 의미, 할당 연산자 왼쪽은 "메모리 공간"으로 해석해야 함! 
    cout << "6. a: " << a << endl; //5
    cout << "9. *pa: " << *pa << endl; //5
    
    a = *pa + 2;
    cout << "8. a: " << a << endl; //7
    cout << "9. *pa: " << *pa << endl; //7
    }

 

#include <iostream>
using namespace std;

int main() {
    int n[10];
    int i;
    int* p;

    for (i = 0; i < 10; i++)
        *(n + i) = i * 3; //배열의 이름 n을 주소처럼 사용 가능

    p = n; //포인터 p에 배열 n의 시작 주소를 설정한다
    for (i = 0; i < 10; i++)
        cout << *(p + i) << ' '; //포인터 p를 이용하여 배열 n의 원소 접근

    cout << endl;

    for (i = 0; i < 10; i++) {
        *p = *p + 2;
        p++;
    }

    for (i = 0; i < 10; i++)
        cout << n[i] << ' ';
    cout << endl;
}

 

//포인터로 정수 2개를 받아 비교하는 함수 equal()을 작성하라
#include <iostream>
using namespace std;

bool equal(int* p, int* q); //함수의 원형 선언

int main() {
	int a = 5, b = 6;
    if (equal(&a, &b)) //함수 호출: 호출 결과가 true/false이므로 if문 조건에 사용 가능
    	cout << "equal" << endl;
    else
    	cout << "not equal" << endl;
}

bool equal(int* p, int* q) { //포인터 매개 변수 2개
	if (*p == *q)
    	return true;
    else 
    	return false;
}

 

//배열을 비교하는 함수
#include <iostream>
using namespace std;

bool equalArray(int* p, int* q, int size); //함수의 원형 선언

int main() {
	int a[] = { 1, 2, 3, 4, 5 };
    int b[] = { 1, 2, 3, 4, 5 };
    
    if (equalArray(a, b, 5)) //함수 호출
    	cout << "array is equal" << endl;
    eles
    	cout << "array isn't equal" >> endl;
}

bool equalArray(int* p, int* q, int size) {
	int i;
    for (i = 0; i < size; i++) {
		if (*p != *q)
        	return false;
        p++;
        q++;
    }
    return true;
}

 

'C++' 카테고리의 다른 글

C++ chap.03: 클래스와 객체  (0) 2023.09.20
C++: 데이터 타입  (0) 2023.09.06