인덕대 C++-출처 smile han

c++11주차

Plki 2024. 11. 11. 16:49

상속 기말 30% /  12월16일 기말 /  12월9일 학과공모전

\객체지향 언어의 4가지 주요 특징은 다음과 같습니다:

1. **캡슐화 (Encapsulation)**: 데이터와 그 데이터를 처리하는 메서드를 하나의 단위인 객체로 묶는 것을 의미합니다. 이를 통해 데이터의 보호와 코드의 모듈화를 도모할 수 있습니다.

2. **상속 (Inheritance)**: 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)가 물려받는 기능입니다. 상속을 통해 코드의 재사용성을 높이고, 계층 구조를 만들 수 있습니다.

3. **다형성 (Polymorphism)**: 동일한 인터페이스를 통해 서로 다른 객체가 각각의 방식으로 동작할 수 있는 능력입니다. 이는 메서드 오버라이딩과 오버로딩을 통해 구현됩니다.

4. **추상화 (Abstraction)**: 복잡한 시스템에서 필요하지 않은 세부 정보를 숨기고, 중요한 정보만을 드러내는 과정입니다. 이를 통해 사용자에게 더 간단하고 명확한 인터페이스를 제공합니다.


 

코어션 (자동형변환)  EX) 1+2.5->1.0+2.5로변환

 

 

 

 

 

 

 

 

 

 

함수오버로딩

똑같은 이름의 함수를 여러 개 만들수 있다.

에러

컴파일러가 실매개변수의 입력 자료형에 따라서 자동적으로 해당 함수를 연결해준다. 그렇기에 에러남.  

 

함수중첩을 하는 2가지 경우=시험

1.매개변수의 형이 다른 경우

2.매개변수의 개수가 다른 경우

 

생성자 함수

생성자는 객체를 만들때 초기화 하는 용도로 사용

소멸자는 청소

 

 

 

#include <iostream>
class Dog {
int age;
public:
Dog() { age = 1; }
Dog(int a) { age = a; }//생성자 중첩
~Dog() { std::cout << "bye\n"; }
int getAge() {return age;}
void setAge(int a){age = a;}
};

int main()
{
Dog coco, happy(3);
//coco.setAge(1);
std::cout << coco.getAge() << std::endl;
std::cout << happy.getAge() << std::endl;
return 0;
}

 

 

 

#include <iostream>
using std::cout;
using std::endl;
class Dog {
private:
int age;
public:
Dog() { age = 1; }
// 매개변수가 없는 생성자
Dog(int a) { age = a; }
// 매개변수가 하나인 생성자
~Dog();
int getAge();
void setAge(int a);
};
Dog::~Dog()
{
std::cout << "소멸\n";
}
int Dog::getAge()
{
return age;
}
void Dog::setAge(int a)
{
age = a;
}
int main()
{
Dog happy[5];
Dog meri[5] = { 1,2,3,4,5 };
for (int i = 0; i < 5; i++)
std::cout << happy[i].getAge() <<
"," << meri[i].getAge() << std::endl;
return 0;
}

소멸자 10번 사용 [5]

 

 

 

 

디폴트 인자

디폴트 매개변수(default parameter) 또는 디폴트 인자(default argument)를 지원하는 프로그래밍 언어는 다음과 같습니다:

1. **C++**
   - C++에서는 함수 정의 시 매개변수에 기본값을 지정할 수 있습니다. 호출 시 해당 인자를 생략하면 기본값이 사용됩니다.
   ```cpp
   void func(int x, int y = 10) {
       // y의 기본값은 10
   }
   ```

2. **Python**
   - Python에서도 함수 정의 시 매개변수에 기본값을 설정할 수 있습니다. 호출 시 기본값을 사용하도록 지정할 수 있습니다.
   ```python
   def func(x, y=10):
       # y의 기본값은 10
   ```

3. **JavaScript**
   - ES6부터 JavaScript는 함수 매개변수에 기본값을 지정할 수 있습니다.
   ```javascript
   function func(x, y = 10) {
       // y의 기본값은 10
   }
   ```

4. **Ruby**
   - Ruby에서도 함수 매개변수에 기본값을 설정할 수 있습니다.
   ```ruby
   def func(x, y = 10)
       # y의 기본값은 10
   end
   ```

5. **Swift**
   - Swift는 함수 매개변수에 기본값을 설정할 수 있는 기능을 제공합니다.
   ```swift
   func func(x: Int, y: Int = 10) {
       // y의 기본값은 10
   }
   ```

6. **Kotlin**
   - Kotlin에서는 매개변수에 기본값을 지정할 수 있습니다.
   ```kotlin
   fun func(x: Int, y: Int = 10) {
       // y의 기본값은 10
   }
   ```

7. **C#**
   - C#에서도 메서드 매개변수에 기본값을 설정할 수 있습니다.
   ```csharp
   void Func(int x, int y = 10) {
       // y의 기본값은 10
   }
   ```

8. **TypeScript**
   - TypeScript는 JavaScript의 슈퍼셋으로, 함수 매개변수에 기본값을 설정할 수 있습니다.
   ```typescript
   function func(x: number, y: number = 10) {
       // y의 기본값은 10
   }
   ```


 

#include <iostream>
int add(int i, int j) // 형식매개변수
{
return(i + j);
}
int main()
{
std::cout << add() << ","; // 오류
std::cout << add(10) << ","; // 오류
std::cout << add(10, 20); // 30
return 0;
}
//오류 이유는 i,j의 값이 들어가지 않아서
#include <iostream>
int add(int i =1, int j =2) // 형식매개변수
{
return(i + j);
}
int main()
{
std::cout << add() << ","; // 실매개변수 없음, 3
std::cout << add(10) << ","; // 실매개변수 한 개, 12
std::cout << add(10, 20); // 실매개변수 두개, 30
return 0;
}/*add()로 호출할 경우에는 i=1, j=2
add(10)으로 호출할 경우에는 i=10, j=2
add(10,20)으로 호출하면 i=10, j=20
즉 형식매개변수보다 적은 실매개변수로
호출할 경우 왼쪽의 매개변수부터 값을
할당받는다.*/
//간단, 디폴트는 빈 매게변수 공간에 대신 들어가는 대체제

 //주의사황  임의에 문자에 디폴트 인자를 주기 시작하면 게속 할당해야 한다. 

int add(int i=1, int j)
{
return(i + j);
}

//오류

int add(int i, int j=2)
{
return(i + j);
}

//가능

 

#include <iostream>
int add(int i = 1, int j = 2);//선언부에게 만 디폴트 값을 준다
int main()
{
std::cout << add() << ","; //
std::cout << add(10) << ","; //
std::cout << add(10, 20); //
return 0;
}
int add(int i , int j )
{
return(i + j);
}//정의부 작성x

 

 

 

 

#include <iostream>
class Dog {
private:
int age;
public:
Dog(int a = 1) { age = a; } // 디폴트 매개변수 사용은 함수 중첩
// 디폴트 매개변수를 갖는 생성자
~Dog();
int getAge();
void setAge(int a);
};
Dog::~Dog()
{
std::cout << "소멸\n";
}
int Dog::getAge()
{
return age;
}
void Dog::setAge(int a)
{
age = a;
}
int main()
{
Dog meri, happy(5);
std::cout << happy.getAge() << "," <<meri.getAge() << std::endl;
return 0;
}
//meri의 값이 지정되지 않으면 int a=1이 적용되어 나이가 한살로 설정
//나이가(2)로 설정되어있다면 age = a;이 적용되어 나이가 2로 설정

Dog() {age=1;} 나 Dog(int a){age=a;}를 추가할 수 있을까?

NO 둘중 하나만 사용 둘다 호출이 되기 떄문

ㅡㅡㅡ

Dog() {age=1;}//선언부에만 디폴트 값

};

Dog::Dog(int a){age=a;}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include <iostream> // 입출력 스트림을 사용하기 위한 헤더 파일
#include <string> // 문자열을 사용하기 위한 헤더 파일
class Dog { // Dog 클래스를 정의
private:
int age; // 고양이의 나이를 저장하는 멤버 변수
std::string name; // 고양이의 이름을 저장하는 멤버 변수
public:
// 기본 생성자: 매개변수가 없고, 기본값으로 age를 1, name을 "강아지"로 초기화
Dog() {
age = 1; // 기본 나이 설정
name = "강아지"; // 기본 이름 설정
}
// 두 개의 매개변수를 받는 생성자: 나이와 이름을 사용자로부터 입력받아 초기화
Dog(int a, std::string n) {
age = a; // 주어진 나이로 초기화
name = n; // 주어진 이름으로 초기화
}
// 소멸자: 객체가 소멸될 때 호출되어 "bye~" 메시지를 출력
~Dog() {
std::cout << "bye~\n";
}
// 이름을 반환하는 메서드
std::string getName() {
return name; // 이름 반환
}
// 이름을 설정하는 메서드
void setName(std::string n) {
name = n; // 주어진 이름으로 설정
}
// 나이를 반환하는 메서드
int getAge(); // 메서드 선언 (정의는 아래에서)
// 나이를 설정하는 메서드
void setAge(int a); // 메서드 선언 (정의는 아래에서)
};
// 나이를 반환하는 메서드의 정의
int Dog::getAge() {
return age; // 나이 반환
}
// 나이를 설정하는 메서드의 정의
void Dog::setAge(int a) {
age = a; // 주어진 나이로 설정
}
int main() {
// coco는 기본 생성자를 사용하여 생성 (나이: 1, 이름: "강아지")
Dog coco;
// happy는 두 개의 매개변수를 받는 생성자를 사용하여 생성 (나이: 3, 이름: "해피")
Dog happy(3, "해피");
// coco의 이름과 나이를 출력
std::cout << coco.getName() << " " << coco.getAge() << std::endl;
// happy의 이름과 나이를 출력
std::cout << happy.getName() << " " << happy.getAge() << std::endl;
return 0; // 프로그램 종료
}

 

 

 

 

 

코코에서 에러

에러 해결 디폴트 인자 사용

#include <iostream> // 입출력 기능을 사용하기 위한 헤더 파일
#include <string> // 문자열을 사용하기 위한 헤더 파일
class Dog { // Dog 클래스를 정의
private:
int age; // 개의 나이를 저장하는 멤버 변수
std::string name; // 개의 이름을 저장하는 멤버 변수
public:
// 생성자: 기본값을 가진 매개변수를 사용하여 age와 name을 초기화
Dog(int a = 1, std::string n = "강아지") {
age = a; // 주어진 나이로 초기화 (기본값은 1)
name = n; // 주어진 이름으로 초기화 (기본값은 "강아지")
}
// 소멸자: 객체가 소멸될 때 호출되어 "bye~" 메시지를 출력
~Dog() {
std::cout << "bye~\n";
}
// 개의 이름을 반환하는 메서드
std::string getName() {
return name; // name 멤버 변수를 반환
}
// 개의 이름을 설정하는 메서드
void setName(std::string n) {
name = n; // 주어진 이름으로 설정
}
// 개의 나이를 반환하는 메서드 (선언)
int getAge();
// 개의 나이를 설정하는 메서드 (선언)
void setAge(int a);
};
// 개의 나이를 반환하는 메서드의 정의
int Dog::getAge() {
return age; // age 멤버 변수를 반환
}
// 개의 나이를 설정하는 메서드의 정의
void Dog::setAge(int a) {
age = a; // 주어진 나이로 설정
}
int main() {
// coco는 기본 생성자를 사용하여 생성 (age: 1, name: "강아지")
Dog coco;
 
// happy는 두 개의 매개변수를 받는 생성자를 사용하여 생성 (age: 3, name: "해피")
Dog happy(3, "해피");
// coco의 이름과 나이를 출력
std::cout << coco.getName() << " " << coco.getAge() << std::endl;
// happy의 이름과 나이를 출력
std::cout << happy.getName() << " " << happy.getAge() << std::endl;
return 0; // 프로그램 종료
}
 
 
함수을 밖으로 꺼냄
#include <iostream>
class Dog {
private:
int age;
std::string name;
public:
//Dog() { age = 1; name = "강아지"; }//생성자 (함수) 중첩
Dog(int a=1, std::string n="강아지") { age = a; name = n; }
~Dog() { std::cout << "bye~\n"; }
std::string getName();
void setName(std::string n);
int getAge();
void setAge(int a);
};
int Dog::getAge() { return age; }
void Dog::setAge(int a) { age = a; }
std::string Dog::getName() { return name; }
void Dog::setName(std::string n) { name = n; }
int main()
{
Dog coco, happy(3, "해피");
//coco.setAge(1);
std::cout <<coco.getName()<< coco.getAge() << std::endl;
std::cout << happy.getName() << happy.getAge() << std::endl;
return 0;
}

 

 

함수 밑으로 정리 

#include <iostream>
class Dog {
private:
int age;
std::string name;
public:
//Dog() { age = 1; name = "강아지"; }//생성자 (함수) 중첩
Dog(int a = 1, std::string n = "강아지");//선언부에만 디폴트
~Dog();
std::string getName();
void setName(std::string n);
int getAge();
void setAge(int a);
};
int Dog::getAge() { return age; }
void Dog::setAge(int a) { age = a; }
std::string Dog::getName() { return name; }
void Dog::setName(std::string n) { name = n; }
Dog::~Dog() { std::cout << "bye~\n"; }
Dog::Dog(int a, std::string n ) { age = a; name = n; }//선언부에만 디폴트
int main()
{
Dog coco, happy(3, "해피");
//coco.setAge(1);
std::cout <<coco.getName()<< coco.getAge() << std::endl;
std::cout << happy.getName() << happy.getAge() << std::endl;
return 0;
}

 

 

 

 

this->

#include <iostream>
class Dog {
private:
int age;
std::string name;
public:
Dog(int a = 1, std::string n = "강아지");//선언부에만 디폴트
~Dog();
std::string getName();
void setName(std::string n);
int getAge();
void setAge(int a);
};
int Dog::getAge() { return age; }
void Dog::setAge(int a) { this->age = age; }//this->
std::string Dog::getName() { return name; }
void Dog::setName(std::string name) { this ->name = name; }//this->
Dog::~Dog() { std::cout << "bye~\n"; }
Dog::Dog(int a, std::string n ) { age = a; name = n; }//선언부에만 디폴트
int main()
{
Dog coco, happy(3, "해피");
//coco.setAge(1);
std::cout <<coco.getName()<< coco.getAge() << std::endl;
std::cout << happy.getName() << happy.getAge() << std::endl;
return 0;
}

 

 

const

#include <iostream>
class Dog {
private:
int age;
std::string name;
public:
Dog(int a = 1, std::string n = "강아지");//선언부에만 디폴트
~Dog();
std::string getName()const;
void setName(std::string n);
int getAge()const;
void setAge(int a);
};
int Dog::getAge() const { return age; }//const
void Dog::setAge(int a) { this->age = age; }//this->
std::string Dog::getName() const { return name; }//comst
void Dog::setName(std::string name) { this ->name = name; }//this->
Dog::~Dog() { std::cout << "bye~\n"; }
Dog::Dog(int a, std::string n ) { age = a; name = n; }//선언부에만 디폴트
int main()
{
Dog coco, happy(3, "해피");
//coco.setAge(1);
std::cout <<coco.getName()<< coco.getAge() << std::endl;
std::cout << happy.getName() << happy.getAge() << std::endl;
return 0;
}

 

 

 

 

 

아래는 주어진 C++ 코드에 대한 간단하고 자세한 설명과 주석입니다. 초등학생도 이해할 수 있도록 쉽게 설명하겠습니다.
```cpp
#include <iostream> // 표준 입출력 기능을 사용하기 위해 필요한 헤더 파일
#include <string> // 문자열을 사용하기 위해 필요한 헤더 파일
// Dog라는 클래스를 정의합니다.
class Dog {
private:
int age; // 개의 나이를 저장하는 변수
std::string name; // 개의 이름을 저장하는 문자열 변수
public:
// 생성자 선언: 기본값을 가진 매개변수를 사용하여 개를 초기화합니다.
Dog(int a = 1, std::string n = "강아지"); // 기본값: 나이는 1, 이름은 "강아지"
// 소멸자 선언: 객체가 사라질 때 호출됩니다.
~Dog();
// 개의 이름을 반환하는 메서드: const는 이 메서드가 객체의 상태를 변경하지 않음을 나타냅니다.
std::string getName() const;
// 개의 이름을 설정하는 메서드
void setName(std::string n);
// 개의 나이를 반환하는 메서드
int getAge() const;
// 개의 나이를 설정하는 메서드
void setAge(int a);
};
// 나이를 반환하는 메서드의 정의
int Dog::getAge() const {
return age; // age 변수를 반환합니다.
}
// 나이를 설정하는 메서드의 정의
void Dog::setAge(int a) {
this->age = a; // 주어진 값을 age에 저장합니다. this->는 현재 객체를 가리킵니다.
}
// 이름을 반환하는 메서드의 정의
std::string Dog::getName() const {
return name; // name 변수를 반환합니다.
}
// 이름을 설정하는 메서드의 정의
void Dog::setName(std::string name) {
this->name = name; // 주어진 값을 name에 저장합니다. this->는 현재 객체를 가리킵니다.
}
// 소멸자 정의: 객체가 사라질 때 호출됩니다.
Dog::~Dog() {
std::cout << "bye~\n"; // "bye~" 메시지를 출력합니다.
}
// 생성자 정의: Dog 객체를 초기화합니다.
Dog::Dog(int a, std::string n) {
age = a; // 주어진 나이로 초기화합니다.
name = n; // 주어진 이름으로 초기화합니다.
}
int main() {
// coco는 기본 생성자를 사용하여 생성합니다. (age: 1, name: "강아지")
Dog coco;
// happy는 두 개의 매개변수를 받는 생성자를 사용하여 생성합니다. (age: 3, name: "해피")
Dog happy(3, "해피");
// coco의 이름과 나이를 출력합니다.
std::cout << coco.getName() << " " << coco.getAge() << std::endl;
// happy의 이름과 나이를 출력합니다.
std::cout << happy.getName() << " " << happy.getAge() << std::endl;
return 0; // 프로그램이 정상적으로 종료됩니다.
}
```
### 코드 설명
1. **헤더 파일 포함**:
- `#include <iostream>`: 이 코드는 우리가 콘솔에 출력할 수 있도록 도와줍니다. 예를 들어, `std::cout`을 사용하여 화면에 글자를 출력할 수 있습니다.
- `#include <string>`: 이 코드는 문자열을 사용할 수 있도록 도와줍니다. 예를 들어, 개의 이름을 저장할 수 있습니다.
2. **Dog 클래스**:
- **클래스란?**: 클래스는 데이터와 그 데이터를 다루는 함수를 함께 묶는 일종의 틀입니다. 여기서 `Dog` 클래스는 개에 대한 정보를 담고 있습니다.
- **멤버 변수**:
- `int age`: 개의 나이를 저장하는 변수입니다.
- `std::string name`: 개의 이름을 저장하는 변수입니다.
3. **생성자**:
- **생성자란?**: 객체가 만들어질 때 호출되는 특별한 함수입니다. `Dog(int a = 1, std::string n = "강아지")`는 기본값이 있는 생성자로, 나이를 주지 않으면 `1`, 이름을 주지 않으면 `"강아지"`로 설정합니다.
4. **소멸자**:
- **소멸자란?**: 객체가 메모리에서 사라질 때 호출되는 함수입니다. 여기서는 `"bye~"`라는 메시지를 출력합니다.
5. **멤버 함수**:
- `getName()`: 개의 이름을 반환합니다. (이름을 알고 싶을 때 호출)
- `setName(std::string n)`: 개의 이름을 설정합니다. (이름을 바꾸고 싶을 때 호출)
- `getAge()`: 개의 나이를 반환합니다. (나이를 알고 싶을 때 호출)
- `setAge(int a)`: 개의 나이를 설정합니다. (나이를 바꾸고 싶을 때 호출)
6. **main 함수**:
- `Dog coco;`: 기본 생성자를 사용하여 `coco`라는 개를 만듭니다. 이 개의 나이는 `1`, 이름은 `"강아지"`입니다.
- `Dog happy(3, "해피");`: `happy`라는 개를 만들면서 나이를 `3`, 이름을 `"해피"`로 설정합니다.
- `std::cout << coco.getName() << " " << coco.getAge() << std::endl;`: `coco`의 이름과 나이를 출력합니다.
- `std::cout << happy.getName() << " " << happy.getAge() << std::endl;`: `happy`의 이름과 나이를 출력합니다.
- `return 0;`: 프로그램이 정상적으로 종료됨을 나타냅니다.
### 요약
이 코드는 C++에서 클래스를 사용하여 개를 나타내는 방법을 보여줍니다. 생성자와 소멸자를 통해 객체의 생명 주기를 관리하고, 멤버 함수를 통해 개의 이름과 나이를 다룰 수 있습니다. 이를 통해 객체 지향 프로그래밍의 기본 개념을 이해할 수 있습니다.

 

'인덕대 C++-출처 smile han' 카테고리의 다른 글

12주차  (1) 2024.11.18
12주차 예습  (0) 2024.11.17
11주차예습  (0) 2024.11.10
10주차  (6) 2024.11.04
10주차 예습  (0) 2024.11.02