개발 앞 단계에서 문제를 해결 -> 설계를 잘하자
유지보수가 용이한 코드를 만들자 -> 객체지향 프로그래밍 => Class를 사용
수정사항이 발생했을 때 영향을 적게 받도록 설계
세부사항을 숨기고 사용자가 꼭 알아야 하는 부분만 보이도록 설계
class name{
멤버(변수, 함수)
};
멤버 함수
: 필요한 동작은 멤버 함수로 정의. 보통 멤버 함수는 외부에서도 접근하게 하는 경우가 많다.
멤버 변수
: 세부 데이터는 멤버 변수로 관리한다. 멤버 함수에서 필요한 정보나 class 자체에서 내부 연산시 필요한 정보를 관리한다. 보통 외부에서 접근하지 못하게 한다.
-> 필요한 동작만 공개하고 세부 데이터는 숨겨 변화에 유연하게 대처할 수 있도록 하자
#include <iostream>
#include <algorithm> //max 함수 사용
#include <string>
using namespace std;
class Student
{
//동작 정의(이를 멤버함수라고 합니다)
double getAvg();
int getMaxNum();
//데이터 정의(이를 멤버변수라고 합니다.)
int kor;
int eng;
int math;
};
double Student::getAvg()
{
return (kor + eng + math) / 3.0;
}
int Student::getMaxNum()
{
return max(max(kor, eng), math);
// 다른 방법 return max({ kor, eng, math });
}
double Student::getAvg(): getAvg()가 어디에 속해있는지 나타냄
class name:: member function -> 어떤 class의 멤버 함수이다.
class는 헤더 파일에 구현하고 멤버함수는 소스 파일에 구현한다.
클래스 멤버 함수나 변수에 접근할 때는 객체 뒤에 멤버 접근 연산자.를 사용한다.
접근 지정자로 멤버의 접근 권한을 제어할 수 있다.
private으로 설정)public클래스 외부에서 접근 가능. 일반적으로 멤버 함수는 public으로 설정private: 클래스 외부에서 접근할 경우 컴파일 에러 발생. 클래스 내부에서는 서로 공유한다. 일반적으로 멤버 변수는 private으로 설정한다.protected상속 관계일 때 접근 가능#include <iostream>
#include <algorithm> //max 함수 사용
#include <string>
using namespace std;
class Student
{
public:
//동작 정의(이를 멤버함수라고 합니다)
double getAvg();
int getMaxScore();
private:
//데이터 정의(이를 멤버변수라고 합니다.)
int kor;
int eng;
int math;
};
double Student::getAvg()
{
return (kor + eng + math) / 3.0;
}
int Student::getMaxScore()
{
return max(max(kor, eng), math);
}
int main()
{
Student s; // 객체: 변수로 선언되어서 메모리에 잡힘-> 인스턴스화 한다.
s.getAvg();
return 0;
}
class: 객체를 만드는 틀, 설계도
객체, 인스턴스: class가 메모리에 올라간 상태
private에 있는 변수를 제어한다. 내가 의도한 대로 코드를 제어하기 위해 사용한다.
setter: 멤버 변수를 바꿀 때 사용. 의도한 경우에만 값을 수정할 수 있게 해줌
getter: 값을 가져올 때 사용. 변수를 노출시키지 않고 값을 확인하게 해줌(Read only)
객체가 생성될 때 한 번씩 자동으로 호출되는 특별한 멤버 함수
멤버 변수를 초기화하거나 객체가 동작할 준비를 하기위해 사용한다.
class 이름과 동일한 이름을 가진 함수로 정의되고 반환형을 명시하지 않는다.
멤버 초기화 리스트는 생성자의 코드 부분 보다 먼저 실행 된다.
class Name{
private:
string name;
public:
Name(string str) : name(str){} //입력 받은 str으로 name을 초기화한다.
};
중복정의 문제를 피하기 위해 클래스 선언은 헤더 파일, 클래스 정의는 소스파일로 나눠 해당 클래스를 사용하는 소스파일에서만 헤더를 include하여 사용한다.
헤더파일을 여러 파일에서 사용하면 중복 선언될 수 있는데 이를 피하기 위해 #ifndef 사용