도슐랭스타

C++ 맛보기와 C복습(4)-구조체, 객체지향 프로그래밍 본문

C++

C++ 맛보기와 C복습(4)-구조체, 객체지향 프로그래밍

도도.__. 2023. 10. 11. 12:48

C++ 기본 소스

#include <iostream> 
int main() 
{
    std::cout << "Helo World!" << std::endl;
}

C의 구조체는 변수만 멤버로 넣을 수 있지만 C++의 클래스는 변수와 함수를 멤버로 넣을 수 있다!

#include <iostream> 
struct Man {
    int age; //멤버
    double weight; 
};
int main() 
{
    struct Man dodo; //C++에서는 struct을 생략해도 된다.
    dodo.age = 100;
    dodo.weight = 50;
    std::cout << dodo.age << std::endl;
    std::cout << dodo.weight << std::endl;
}

C++에서는 struct을 생략해도 된다.

#include <iostream> 
struct Man {
    int age; //멤버
    double weight; 
};
int main() 
{
	Man minsu;
    Man *minjung;
    minsu.age = 1; //일반 구조체는 "."으로 접근
    minjung->age =2; //포인터 구조체는 "->"로 접근
}
#include <iostream> 
struct Man {
    int age; //멤버
    double weight;
};
int main()
{
    Man dodo = { 1, 3.5 };
    std::cout << dodo.age << " " << dodo.weight << std::endl; //1 3.5
    dodo.age = 10;
    dodo.weight = 30.5;
    std::cout << dodo.age << " " << dodo.weight << std::endl;//10 30.5
}
#include <iostream> 
struct Man {
    int age; //멤버
    double weight;
};
int main()
{
    Man dodo = { 1, 3.5 }, dodo1;
    dodo1 = dodo; //멤버 복사
    std::cout << dodo1.age << " " << dodo1.weight << std::endl;
    std::cout << dodo.age << " " << dodo.weight << std::endl;
}

대입하면 멤버들이 모두 복사된다.


소프트웨어 위기(software crisis)

  •  소프트웨어의 대규모화, 복잡화 -> 개발비용 증가
  • 소프트웨어 가격 상승폭 증가
  • 유지보수의 어려움과 개발 적체 현상 발생

객체 지향 프로그래밍은 자료와 처리하는 동작이 한 꺼번에 묶인다.

클래스는 객체의 타입(Object Type)이다. 클래스는 설계도이고 그 설계도로 만든 집이 객체이다.

객체는 구체적으로 존재하는 단 하나만이어야한다.
ex. 클래스가 개라면 인스턴스(객체)는 우리집 강아지=구체적인 몸무게, 품종, 이름 등 구체적인 자료를 대입할 수 있음.
ex. 클래스가 고양이라면 인스턴스(객체)는 우리집 고양이= 구체적인 몸무게, 품종, 이름 등 구체적인 자료를 대입할 수 있음.

객체지향 프로그래밍의 중심 기술

  1. 캡슐화
  2. 상속성
  3. 다형성

클래스를 만드는 것 자체가 캡슐화를 하는 것임.

상위 클래스의 속성을 상속받은 하위 클래스 : 파생 클래스(derived class), 자식 클래스(child class, subclass) : 
상위 클래스 : 기본 클래스(base class), 부모 클래스(parent class, superclass)

다형성 - 이름을 하나만 쓰는 것.

#include <iostream> 
class Man {
    int age; //멤버
    double weight;
};
int main()
{
    Man dodo = { 1, 3.5 }, dodo1;
    dodo1 = dodo;
    std::cout << dodo.age << " " << dodo.weight << std::endl;
    std::cout << dodo1.age << " " << dodo1.weight << std::endl;
}

이렇게 하면 에러가 난다.

#include <iostream> 
class Man {
private: //지역변수로 만들어준다.
    int age; //멤버
    double weight;
};
int main()
{
    Man dodo = { 1, 3.5 }, dodo1;
    dodo1 = dodo;
    std::cout << dodo.age << " " << dodo.weight << std::endl;
    std::cout << dodo1.age << " " << dodo1.weight << std::endl;
}

이렇게 해도 에러가 난다.

#include <iostream> 
class Man {
public: //전역변수로 만들어줌.
    int age;
    double weight;
};
int main()
{
    Man dodo = { 1, 3.5 }, dodo1;
    dodo1 = dodo;
    std::cout << dodo.age << " " << dodo.weight << std::endl;
    std::cout << dodo1.age << " " << dodo1.weight << std::endl;
}

public:을 써주면 전역변수로 만들어서 어디서도 밑의 변수들을 접근할 수 있게 된다.

관리하기 쉬워서 대부분 private로 변수를 감춰서 지정해둔다.

#include <iostream> 
class Man {
private: //캡슐화한 것.(감췄음)
    int age;
    double weight;
public:
    int getAge() { //출력함수, 리턴 / 리턴할 값의 자료형을 함수의 자료형으로 준다.
        return age;
    }
    int getWeight() {
        return weight;
    }
    void setAge(int a) { //입력함수, 대입 / 리턴할 값이 없으면 void를 함수의 자료형으로 준다.
        age = a;
    }
    void setWeight(int w) {
        weight = w;
    }
};
int main()
{
    Man dodo;
    dodo.setAge(100); //이제 접근할 수 있는 것은 전역함수만 있음.(dodo.age는 사용 불가능)
    dodo.setWeight(20);
    std::cout << dodo.getAge() << std::endl;
    std::cout << dodo.getWeight() << std::endl;
}

지역변수인 age와 weight를 사용할 수 있는 문이나 통로 같은 개념으로 전역함수를 만들고 사용한다.

캡슐화가 되어있지 않으면 나중에 변수 멤버의 값이 막 바뀔 수 있다.
소스 재활용에도 용이하다.


도슐랭스타
★★☆☆☆ :어렵,,
오.. 객체지향은.. 어렵네요.. 자바스크립트에서 조금이라도 배웠으니 괜찮을 줄 알았는데 아니다!!!ㅋㅋㅋㅋㅋㅋㅋ
C++에서의 클래스는 그저 '틀' 그자체임 그저 '설계도'니까 이걸로 직접 무엇을 할 수는 없지만 js에서의 프로토타입은 '틀'이면서 확장이 가능한 '원형'이다. 그 원형을 복사해서 어딘가를 조금 수정하면 인스턴스다. 그래서 프로토타입으로 만든 인스턴스는 그 자체로도 또 하나의 프로토타입이 될 수 있는 것이다!!!
예전에 js 객체를 설명했던 글의 그림에서 하트의 프로토타입은 사실 점선이 아닌 실선의 그저 색이 없는 하트가 더 맞는 말이다.(틀의 기능만을 하는 것은 아니라는 의미)

js의 객체가 궁금하다면 여기로↓

 

JavaScript-객체(object)

객체 '복합 자료형'이다. 객체 안에 숫자, 문자열 등 여러 가지 자료형이 포함되기 때문이다. 언제 사용하는가? 회원 정보를 저장한다면 이름, 아이디, 비밀번호, 생년월일, 가입 날짜, 이메일 등

dodo5517.tistory.com

출처:https://www.youtube.com/@smilehan8416

 

Smile Han

 

www.youtube.com

 

반응형
Comments