#include <iostream>
using namespace std;
int main()
{
Player player1; // 정의된 클래스 기반으로 만들어진 객체
player1.x = 10; player1.y = 10; player1.speed = 2;
player1.Move(2, 3);
return 0;
}
// 클래스 정의
class Player
{
public :
int x, y;
int speed;
void Move(int dx, int dy)
{
x += dx * speed;
y += dy * speed;
}
};
(Summary) Class and Object
◆ 클래스란?
◆ 객체란?
◆ 클래스의 선언과 객체의 생성
◆ 접근 제한자
◆ 멤버 변수와 멤버 함수
◆ 명세와 구현의 분리
◆ 구조체 vs 클래스
Class and Object
#include <iostream>
using namespace std;
int main()
{
int player1_x, player1_y;
int player1_speed;
int player2_x, player2_y;
int player2_speed;
int monster1_x, monster1_y;
int monster1_speed;
...
}
player 1, 2 , moster 등 변수들을 데이터로 만들어서 관리를 해야한다.
이 코드를 객체지향으로 쓴다면 아래 코드처럼 된다.
#include <iostream>
using namespace std;
int main()
{
Player player1; // 정의된 클래스 기반으로 만들어진 객체
player1.x = 10; player1.y = 10; player1.speed = 2;
player1.Move(2, 3);
return 0;
}
// 클래스 정의
class Player
{
public :
int x, y;
int speed;
void Move(int dx, int dy)
{
x += dx * speed;
y += dy * speed;
}
};
클래스를 만들어서 사용할 수 있고,
함수가 한꺼번에 묶여져있다.
클래스를 기반으로 어떤 실제 객체를 만들어서
player1 객체를 가지고 위치를 조정하거나 움직이거나
작업들을 분리할 수 있다.
코드가 깔끔하고 보기 편해진다.
◆ 클래스
● 객체(object)가 생성되기 위한 툴
☞ 객체가 가져야 할 데이터와 기능을 정의
● 사용자 정의 "자료형" (user-defined data type)
● 멤버 변수를 가짐 (데이터)
☞ 속성 (property, attribute), 필드(field), 클래스 변수(class variable) ≈ 멤버 변수의 또 다른 용어
● 멤버 함수를 가짐 (함수, 동작)
☞ Methode ≈ 멤버 함수의 또다른 용어
● 데이터와 함수를 은닉 가능
● 인터페이스를 공개 가능
메모리에 올라가는게 객체 , 클래스는 객체를 어떻게 만들지 설명이다.
멤버 변수 멤버 함수 용어를 기억할 것.
클래스가 가지고 있는 데이터는 멤버 변수
- 클래스가 가지고 있는 데이터는 멤버 변수
- 클래스가 가지고 있는 함수는 멤버 함수
속성 / 프로퍼티 / 필드 / 클래스 변수라고 하면
멤버 변수와 같은 의미이다.
메소드 역시 멤버 함수와 동일한 의미이다.
C#은 Methode 라는 것은 표준용어로 사용해서
C# 에서는 메소드라고 이야기를 한다.
C++ 에서는 멤버 함수, 멤버 변수라고 표현을 한다.
◆ 객체
● 클래스로부터 생성된 객체
☞ (메모리에 올라간 객체는 인스턴스로 구분하여 명명하는 경우도 있다.)
● 객체는 개별적으로 관리되며, 원하는 만큼 생성이 가능하다.
● 객체를 통해서 클래스에 정의된 멤버 함수를 호출 가능하다.
● 개념적인 예시
☞ "영희"는 학생이라는 클래스 객체
☞ "진수"도 학생이란는 클래스 객체
☞ 영희와 진수는 각각의 학과, 학번, 키, 몸무게, 나이 등의 멤버 변수(데이터)를 가지고 있다.
클래스를 왜 정의를 하는가?
객체를 만들어서 메모리에 올려서 사용하기 위해서이다.
클래스는 도장같은 개념이다.
도장만 있다고 그림이 생기는게 아니라, 도장을 가지고 찍어야 그림이 나와야한다.
도장을 꽝 찍어서 생긴 그림을 객체라고 한다.
클래스에 생성된 객체가 메모리에 올라가서 일을 하게 된다.
객체를 여러개 만들 수 있는 의미는
Player p1; Player p2;
이렇게 p1 , p2 등등 여러개의 객체를 생성할 수 있다는 의미이다.
클래스에 정의된 함수는(멤버 함수) 객체를 사용하여 호출한다.
예를들어 학생이라는 클래스를 만들 고 싶다면
학생들의 학번 / 이름 / 전화번호 / 학과 등 데이터들을 가지고 클래스를 만든다.
영희라는 객체 하나, 진수라는 객체 하나를 선언하면
Student 영희; Student 진수;라고 선언한다.
클래스는 학생의 정보를 저장할 수 있도록 하는 템플릿을 만들어 둔것이고,
실제로 "영희"는 학생에 대한 데이터를 가지고 있는 객체이다.
중요한 Part이다.★★★★★
◆ 클래스와 객체
● 클래스는 자료형(ex. int) 처럼 사용한다.
● 클래스는 새로운 데이터 타입을 만드는 것이다.
int highScore;
int lowScore;
Player Kim;
Player Lee;
Player 라는 클래스를 만들면
kim 이라는 객체 , Lee 라는 객체를 만들 수 있다.
기존에 변수 선언 방식과 동일하다
(자료형) 변수 이름;
이런식으로 기존 변수와 동일하게 메모리에 자리를 잡는다.
Class Definition
◆ 클래스와 정의
● 기본 모양
class ClassName
{
// declarations;
};
● 예시
class Player
{
// attributes
// 멤버 변수, 데이터
string name;
string health;
int xp;
// method
// 멤버 함수, 행위/기능
void Talk(string text);
bool IsDead();
};
Create Object
◆ 객체의 생성
Player kmj;
Player star;
Player *mina = new Player();
delete mina;
포인터를 이용하여 힙 메모리 영역으로 선언하고 메모리 해제할 수 있다.
Account Example
◆ 계좌 클래스
#include <iostream>
using namespace std;
int main()
{
// 객체의 생성
Account KimAccount;
Account LeeAccount;
Account* parkAccount = new Account();
delete parkAccount;
}
class Account {
string name; // 예금주 이름
double balance; // 계좌 잔액
bool Withdraw(double amount); // 출금
bool Deposit(double amount); // 입금
};
Player 라는 클래스와 Account 클래스를 번갈아 가면서 사용할 예정이다.
Accessing Class Members
◆ 클래스 멤버의 접근
● 멤버 변수
● 멤버 함수
● 어떠한 멤버 변수 / 함수는 접근이 불가능 할 수 있다. (정보 은닉)
● 멤버 변수 / 함수에 접근하기 위해서는 객체가 필요하다.
☞ (static 멤버의 경우는 예외이다.)
클래스 안에 데이터와 동작이 정의되어 있다.
클래스 멤버/ 함수에 어떻게 접근해야할까?
접근을 하기 위해서 멤버 접근 연산자를 사용한다.
정보 은닉에 의해 어떠한 멤버 변수나 멤버 함수는 접근을 못 할 수 있다.
멤버 변수와 멤버 함수를 접근하기 위해서는 객체가 필요하다.
중요한 Part이다.★★★★★
◆ 클래스 객체인 경우
● "." 연산자를 사용한다. (멤버 접근 연산자)
Player player1;
player1.name;
player1.Move(2, 3);
player1안에 있는 name 를 접근하려면
객체.name으로 접근하면 된다.
멤버 함수도 동일하게 객체.Move()로 접근하면 된다.
중요한 Part이다.★★★★★
◆ 객체의 포인터인 경우
● 역참조 후 점 연산자 사용한다.
Account* parkAccount = new Account();
(*parkAccount).balance;
(*parkAccount).Deposit(1000.00);
● 화살표 연산자 (member of pointer 연산자) 사용
Account* KimAccount = new Account();
KimAccount->balance;
KimAccount->Deposit(1000.00);
역참조해서 연산자를 사용하는 것 보다는
화살표 연산자를 사용하는 편이 더 많다.
member of point 라고 한다.
왼쪽이 포인터 일 때
포인터가 가리키고 있는 클래스 객체의 멤버에 접근하기 위해서
화살표 연산자를 사용하여 사용할 수 있다.
https://youtu.be/BL0qzWC8I24?si=YkFlHBy8BSinehzg
'C++ > C++ : Study' 카테고리의 다른 글
OOP - (4) 멤버 함수 (0) | 2024.10.14 |
---|---|
OOP - (3) 멤버 접근 제한자 (0) | 2024.10.14 |
OOP - (1) OOP 개요(배경설명) (0) | 2024.09.28 |
C++ 포인터 참조자 (7) 포인터 vs 참조자 (0) | 2024.09.25 |
C++ 포인터 참조자 (6) 참조자 (0) | 2024.09.22 |