클래스(class)란?
C++에서 클래스(class)란 구조체의 상위 호환으로 이해할 수 있습니다.
C++의 구조체는 멤버로 함수를 포함할 수 있기에, C언어의 구조체보다 좀 더 확장된 의미를 가집니다.
C++에서 이러한 구조체와 클래스의 차이는 기본 접근 제어의 차이일 뿐, 나머지는 거의 같습니다.
C++에서는 이러한 클래스를 가지고 객체 지향 프로그램을 작성할 수 있습니다.
객체 지향 프로그래밍(OOP, Object-Oriented Programming)
객체 지향 프로그래밍에서는 모든 데이터를
객체(object)로 취급하며, 객체가 바로 프로그래밍의 중심이 됩니다.
객체(object)란 간단히 이야기하자면 실생활에서 우리가
인식할 수 있는 사물로 이해할 수 있습니다.
이러한 객체의 상태(state)와 행동(behavior)을
구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍입니다.
또한, 이와 같은 객체를 만들어 내기 위한 틀과 같은 개념이
바로 클래스(class)입니다.
멤버 함수
일반적으로 함수를 이용해서 인스턴스를 넘겨줘서 출력을 해줫을 것이다.
#include <iostream>
class Cat
{
public:
int age;
int weight;
char name[20];
};
void PrintCat(const Cat cat)
{
std::cout << "Cat's name: " << cat.name << std::endl;
std::cout << "Cat's age: " << cat.age << std::endl;
std::cout << "Cat's weight: " << cat.weight << std::endl;
}
int main()
{
Cat yamyami;
yamyami.age = 7;
yamyami.weight = 4;
//yamyami.name = "yamyami";
const char name[20] = "yamyami";
for (int i = 0; i < 20; i++)
{
yamyami.name[i] = name[i];
}
Cat geegee;
// gee gee 정보를 채워서 출력해보세요.
PrintCat(yamyami);
PrintCat(geegee);
return 0;
}
JavaScript
복사
하지만 반복적으로 함수안에 해당 클래스 인스턴스(객체)를 인자로 넣어줘야하기 때문에 귀찮다.
그래서 함수를 클래스 또는 구조체안에 넣어버려서 멤버 변수처럼 멤버함수를 만들었다.
class Cat
{
public:
void PrintCat()
{
std::cout << "Cat's name: " << name << std::endl;
std::cout << "Cat's age: " << age << std::endl;
std::cout << "Cat's weight: " << weight << std::endl;
}
int age;
int weight;
char name[20];
};
int main()
{
Cat yamyami;
yamyami.age = 7;
yamyami.weight = 4;
//yamyami.name = "yamyami";
const char name[20] = "yamyami";
for (int i = 0; i < 20; i++)
{
yamyami.name[i] = name[i];
}
Cat geegee;
// gee gee 정보를 채워서 출력해보세요.
//PrintCat(yamyami);
yamyami.PrintCat();
geegee.PrintCat();
//PrintCat(geegee);
return 0;
}
JavaScript
복사
하지만 대게 또 멤버변수는 접근제한 private 가려놓는게 좋다. 왜? 데이터 임의접근해서 값을 바꾸는 행위는 프로그램에 큰 문제를 야기시킬수 있기떄문에 대게 감춰둔다. 접근하지 못하도록
그래서 우리는 값을 바꾸거나 가져오는 행위를 가능하게 하기 위해서 get,set 함수를 만들어서 사용한다.
#include <iostream>
// 객체 지향 프로그래밍 이란?
class Cat
{
public:
void PrintCat()
{
std::cout << "Cat's name: " << mName << std::endl;
std::cout << "Cat's age: " << mAge << std::endl;
std::cout << "Cat's weight: " << mWeight << std::endl;
}
void SetAge(int age) { mAge = age; }
int GetAge() { return mAge; }
void SetWeight(int weight) { mWeight = weight; }
void SetName(const char* name)
{
for (int i = 0; i < 20; i++)
{
mName[i] = name[i];
}
}
private:
int mAge;
int mWeight;
char mName[20];
};
int main()
{
Cat yamyami;
//yamyami.age = 7;
yamyami.SetAge(7);
//yamyami.weight = 4;
yamyami.SetWeight((4));
//yamyami.name = "yamyami";
//const char name[20] = "yamyami";
//for (int i = 0; i < 20; i++)
//{
// yamyami.name[i] = name[i];
//}
yamyami.SetName("yamyami");
Cat geegee;
// gee gee 정보를 채워서 출력해보세요.
//PrintCat(yamyami);
yamyami.PrintCat();
geegee.PrintCat();
//PrintCat(geegee);
return 0;
}
JavaScript
복사
아래내용은 중요한 내용은 아니나 용어를 확립하기위해서 일단은 참고만 하여
학습을 하면 좋다. 잘 이해가 안가더라도 넘어가도 상관없다.
객체 지향 프로그래밍의 특징
객체 지향 프로그래밍이 가지는 특징은 다음과
같습니다.
1. 추상화(abstraction)
2. 캡슐화(encapsulation)
3. 정보 은닉(data hiding)
4. 상속성(inheritance)
5. 다형성(polymorphism)
위와 같은 객체 지향 프로그래밍의 특징을 차례차례
수업을 통해 살펴볼 것입니다.
객체의 예
객체(object)
•
고양이
멤버 변수(member variable)
•
cat.name_ = "나비"
•
cat.family_ = "코리안 숏
헤어"
•
cat.age_ = 1
•
cat.weight_ = 0.1
멤버 함수(member function)
•
cat.Mew()
•
cat.Eat()
•
cat.Sleep()
•
cat.Play()
고양이 객체는 모두 위와 같은 멤버 변수와 멤버 함수를
가지지만, 각 멤버 변수의 값은 인스턴스마다 전부 다를 것입니다.
인스턴스(instance) == 객체 라고불리기도 한다.
C++에서 클래스는 구조체와 마찬가지로 사용자가 정의할 수
있는 일종의 타입입니다.
따라서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의
객체를 선언해야 합니다.
이렇게 선언된 해당 클래스 타입의 객체를
인스턴스(instance)라고 하며, 메모리에 대입된 객체를 의미합니다.
하나의 클래스에서 여러 개의 인스턴스를 생성할 수
있습니다.
이러한 인스턴스는 독립된 메모리 공간에 저장된 자신만의 멤버
변수를 가지지만, 멤버 함수는 모든 인스턴스가 공유합니다.
연습문제
문제 1번
세 문장을 2차 배열(3 x 10)에 입력 받아주세요
각 문장의 맨 마지막 글자들을 출력하시면 됩니다
각 문장 마지막 글자를 찾는 함수를 만들어서 풀어주세요.
함수 원형 : char findChar(char* str) 과 같은 형태로 작성하여 풀어주시면 됩니다.
입력 예제
MINCODING
APPLE
SKTOWN
출력 결과
GEN
문제 2번
아래 배열을 하드코딩 해주세요.
문자 2개를 입력 받아주세요.
그리고 입력받은 문자들이 배열에 몇개 존재하는지 찾는 함수를 만들어 출력해주세요.
함수 원형 : int findCharCount(char str[4][4]) 와 같은 형태입니다.
만약 B, F를 입력 받았다면,
B : 3개, F : 3개 총 6개이므로 6을 출력하면 됩니다.
입력 예제
B F
출력 결과
6
문제 3번
한 문장과 숫자 하나를 입력 받으세요 (입력 문장은 최대 5글자)
그 숫자에 해당하는 배열 index에다가 문자 "A"를 추가한 후 출력 하는 함수를 만들어
주세요.
입력 예제
show
2
출력 결과
shAow
문제 4번
크기가 4인 배열 A B 두개를 만들고,
숫자 8개를 A배열과 B배열에 입력받아주세요
1중 for문을 돌려
아래의 규칙대로 result 배열을 완성시켜주세요
완성된 result 배열을 출력하면 됩니다.
입력 예제
3 4 1 2
5 3 8 9
출력 결과
12 12 4 7
문제 5번
문장 하나를 입력받고 제거할 index를 입력 받으세요.
그리고 새로 만든 함수에 해당 문장과 index를 전달인자로 전달해주세요.
해당하는 index의 글자를 제거하고 출력하는 함수를 만드세요.
입력 예제
gtkbacd
3
출력 결과
gtkacd
문제 6번
세 문장을 입력받고 이 문장에 M 이라는 글자가 존재하는지 찾아 출력 해 주세요.
(각 문장당 최대 10글자)
isExist 함수를 이용하여 찾아 주세요.
M을 찾으셨다면 M이 존재합니다
M을 찾지 못하였다면 M이 존재하지 않습니다
를 출력 해 주세요.
입력 예제
CODING
MBC
WORLD
출력 결과
M이 존재합니다
문제 7번
아래 배열을 하드코딩 해 주세요
M | T | K | C |
그리고 찾을 문자를 하나 입력받아주세요
Flag기법을 쓰지않고, isExist함수를 써서
입력받은 문자가 위 배열에 존재하는지 출력 해 주세요
"발견" 또는 "미발견"을 출력하시면 됩니다
입력 예제
T
출력 결과
발견
문제 8번
아래 배열을 하드코딩 하고, 문자 2개를 입력받아주세요
G | K | T |
P | A | C |
입력받은 문자 2개가 모두 배열안에 존재한다면 "대발견" 출력,
문자 둘 중 하나만 발견된다면 "중발견" 출력,
아무 문자도 없다면 "미발견" 출력 해 주세요
isExist 함수를 써서 문제를 풀어주세요.
입력 예제
G A
출력 결과
대발견
문제 9번
숫자 6개를 배열에 입력받아 주세요.
1차원 배열에 1중 for문을 다음과 같은 규칙 돌려주세요.
반복적으로 누적합을 아래와 같이 구하면 됩니다.
누적합을 구하는 연산을 함수로 묶어서 구현해주세요.
누적합 구하는 함수를 5번 반복실행하여
최종적으로 완성된 배열을 출력 해 주세요.
입력 예제
3 4 1 4 2 6
출력 결과
3 7 8 12 14 20
문제 9번
자동차 클래스를 설계하고 객체를 생성하여 화면에 출력해보세요.
자동차 클래스는 4개의 Wheel(바퀴) 객체를 가지고 있고 속도와 연료를 가지고 있습니다.
적절한 데이터 타입을 활용하여 다음과 같은 클래스를 설계해보세요.
모든 멤버변수 값들은 private으로 선언해야 합니다.
객체는 다음과 같이 2개 만들어주세요. ferai, avante 객체 2개를 생성하고
각각 임의의 맞게 값을 대입해주세요. 그러기 위해선 멤버함수를 따로 선언하여 해당
객체의 값을 세팅해줄수 있는 함수를 만들어야 합니다.
그리고 PrintData라는 멤버함수를 만들어서 각각의 값을 콘솔창에 출력 가능하게 만들어주세요.
출력결과
feraril
speed : 200km
fuel : 100l
wheel[0] : size 5inch radius 20cm
wheel[1] : size 5inch radius 20cm
wheel[2] : size 5inch radius 20cm
wheel[3] : size 5inch radius 20cm
avante
speed : 100km
fuel : 50l
wheel[0] : size 3inch radius 20cm
wheel[1] : size 3inch radius 20cm
wheel[2] : size 3inch radius 20cm
wheel[3] : size 3inch radius 20cm
복습문제
문제 1번
숫자 3개를 변수 a, b, c에 입력 받으세요.
출력함수를 만들어 전달인자로 넘겨주세요.
함수 안에서는 a ~ b까지 숫자를 c번 반복해서 출력 해 주세요
입력 예제
2 5 3
출력 결과
2 3 4 5
2 3 4 5
2 3 4 5
문제 2번
아래와 같이 'A'에서부터 알파벳 순서대로 2차 배열에 값을 채워주세요
(2중 for문을 이용해서 값을 채워주세요)
그리고 좌표를 입력 받고, 좌표에 해당하는 값을 출력 해 주세요
[힌트] 아래와 같이 for문을 돌리면 됩니다.
아래와 같이 for를 돌리면 되는 이유를 생각해보세요
for (x=2; x>=0; x--)
for (y=5; y>=0; y--)
입력 예제
0 2
출력 결과
F
문제 3번
숫자 6개를 입력받고, 2x3배열에 입력받은 숫자로 값을 채워주세요
만약 1, 3, 5, 2, 6, -5를 입력 받았다면, 아래와 같이 값을 채우면 됩니다.
그리고
max의 좌표를 구해주는 함수와
min의 좌표를 구해주는 함수를 각각 만들고,
Max와 Min의 좌표를 출력 해주세요.
[힌트1]
void abc(int* p)
{
*p = 100;
}
int main()
{
int d;
abc(&d);
cout << d; //100이 출력 됩니다.
return 0;
}
[힌트2]
void getMax(int* dy, int* dx);
void getMin(int* dy, int* dx);
이렇게 두 함수를 만들면 되고,
main 함수에서는
getMax(&maxY, &maxX);
getMin(&minY, &minX);
이렇게 함수 호출하면 max좌표와 min좌표를 전달받을 수 있습니다.
입력 예제
1 3 5 2 6 -5
출력 결과
(1,1)
(1,2)
문제 4번
숫자 2개를 먼저 index 0과 index 1에 입력 받으세요
그리고 아래 규칙처럼 총 6칸에 숫자를 모두 채운 후
두 수의 곱을 구하는 함수를 만들어주세요.
해당 함수에 배열의 2개의 인자를 반복적으로 넣어 아래 그림처럼
최종적으로 나오는 숫자를 출력 해 주세요
입력 예제
4 2
출력 결과
2048
문제 5번
문장 하나를 입력받으세요
그리고, 각각의 변수 a, b에 문자를 입력 받아주세요
문장에 입력받은 a의 문자값이 있다면, b의 문자값으로 바꾸어주는 함수를
만들어 주세요.
입력 예제
goodbook
o
z
출력 결과
gzzdbzzk
문제 6번
대문자로 구성된 한 문장을 입력 받으세요. (최대 10글자)
한 문장에서 사전순으로 가장 뒤에 나오는 글자의 index와
가장 앞에 나오는 글자의 index를 찾아 출력 해 주세요.
max, min 함수를 이용해 문제를 풀어주세요.
(단, 같은 글자는 입력하지 않습니다.)
예로들어 FEBIZ를 입력한다면
max에 해당하는 알파벳은 Z 이고, 4번 index에 있습니다.
min에 해당하는 알파벳은 B 이고, 2번 index에 있습니다.
출력결과는
4
2
입력 예제
ABCDE
출력 결과
4
0
문제 7번
7x4 배열을 만들고, 2중 for문을 돌려 아래 그림과 같이 값을 채워주세요.
그리고 숫자 3개를 입력 받습니다.
각 숫자에 해당하는 Line을 0으로 바꾸어주세요.
만약 1, 2, 5를 입력 받았다면
1번Line, 2번Line, 5번Line을 0으로 채워주는 함수를 만들어 주고
연산한후 출력하면 됩니다.
입력 예제
1 2 5
출력 결과
1 2 3 4
0 0 0 0
0 0 0 0
13 14 15 16
17 18 19 20
0 0 0 0
25 26 27 28
문제 8번
두 문장을 아래와 같이 하드코딩 해 주세요.
두 글자를 입력받고 두 글자의 존재 여부를 출력 해 주세요.
isExist 함수를 사용하여 문제를 풀어 주세요.
A와 Z를 입력하였다면
A : 존재
Z : 없음
을 출력 해 주세요.
입력 예제
A Z
출력 결과
A : 존재
Z : 없음
Level16.5 사각형 출력하기 [난이도 : 4]
문제 9번
숫자 2개와 문자 1개를 입력 받으세요
그리고 아래 예제에서 규칙을 찾아 출력 해 주세요
(3중 for문을 써서 문제를 풀어주세요)
ex) 만약 2 3 A 를 입력 받았다면
AAA
AAA
AAA
AAA
이렇게 출력하시면 됩니다
ex) 만약 3 5 B 를 입력 받았다면
BBBBB
BBBBB
BBBBB
BBBBB
BBBBB
BBBBB
이렇게 출력하시면 됩니다
[힌트] 2중 for문을 아래와 같이 감싸면
3중 for문으로 해결할 수 있습니다.
for (z = 0; z<2; z++)
{
// 2중 for문으로 사각형 출력
}
입력 예제
2 4 R
출력 결과
RRRR
RRRR
RRRR
RRRR
문제 10번
Player 클래스는 Weapon 무기 객체를 가지고 있고 hp를 가지고 있습니다. Weapon은 문자열(char 배열)로 구성되어 있습니다.
힌트
class Weapon
{};
class Player
{
private:
Weapon myWeapon;
};
int main()
{
return 0;
}
JavaScript
복사
적절한 데이터 타입을 활용하여 다음과 같은 클래스를 설계해보세요.
모든 멤버변수 값들은 private으로 선언해야 합니다.
객체는 다음과 같이 2개 만들어주세요. warrior, archer 객체 2개를 생성하고
각각 무기에 sword bow값으로 세팅해주세요. 그러기 위해선 멤버함수를 따로 선언하여
객체의 값을 세팅해줄수 있는 함수를 만들어야 합니다.
그리고 PrintInfo 멤버함수를 만들어서 각각의 값을 콘솔창에 출력 가능하게 만들어주세요.
출력결과
warriot
hp : 200
weapon : sword
archer
hp : 100
weapon : bow