상속 기말 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+ + 에서 클래스를 사용하여 개를 나타내는 방법을 보여줍니다. 생성자와 소멸자를 통해 객체의 생명 주기를 관리하고, 멤버 함수를 통해 개의 이름과 나이를 다룰 수 있습니다. 이를 통해 객체 지향 프로그래밍의 기본 개념을 이해할 수 있습니다.