C++/C++ : Study

OOP - (2) 클래스와 객체

더블유제이플로어 2024. 9. 29. 02:47
#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