Class 클래스 c++
c언어의 구조체와 비슷한 형태로
이전에 사용했던 자동차 구조체의 예를 이용하여 클래스를 학습하겠다.
클래스의 장점은 대학시절에 배웠던 정보은닉과 상속이 가능하다는 점으로 기억한다....
윤성우 열혈 c++의 책을 기반으로 자세히 학습해보겠다!!
먼저, struct(구조체)와 다르게 class는 main에서 변수 선언 후에 바로 초기화가 불가능하다
struct stCar{ };
stCar structCar = {"run99",100,0}; 으로 초기화가 가능하였다.
하지만 클래스에서는 클래스 내에 선언된 변수는 클래스 내에 선언된 함수를 통해서만 접근이 가능하다!
따라서 아래의 예를 보자.
24번 줄의 빨간줄
즉, struct와 같이 초기화가 가능하지 않다. 오른쪽 그림은 struct 24라인을 보면 문제가 없다!!
*struct는 default가 public이여서 클래스에서 변수가 private설정되어 접근이 불가한거 아닌가? 라고 생각할 수 있지만 아래의 코드를 보면 그렇지 않다
* 중요한 점은 클래스 선언된 변수는 클래스에서 선언된 함수로 접근이 가능하다는 것!!!
접근제어 지시자 = public, private, protected이다.
이 뒤에는 세미콜론 ( ; ) 이 아닌 콜론 ( : ) 이 붙는다.
왜냐하면 접근제어 지시자는 특정 위치정보를 알리는 레이브(라벨)이기 때문이다.
그래서 switch 문에서 case도 레이블이기 때문에 콜론이 붙는다.
이전의 struct로 만든 내용과 동일함 하지만 class를 이용하여 구현.
여기서 윤성우님의 책은 c컴파일러를 사용하기에 char *s = "hello"; 가 가능하다.
하지만 c++ 컴파일러를 사용하는 사람들에게는 문법 오류가 발생한다.
-구글링 결과 c++컴파일러에서는 개정된 문법을 적용하였기 때문이라고 한다.
따라서 const 를 붙여줘야한다.
그 이유는 다음과 같다.
초보자의 경우에는
char *s = "hello";
*s = 'p' ;와 같이 변경하는 실수를 범할 수 있기 때문에 이를 사전에 방지하고자 c++ 컴파일러에서는 const를 붙여 변경이 불가하도록 변경한 것이다.
-참고- 자세한 내용은 아래 블로그를 읽어 보세요~!
문자열 상수를 char *에 대입하면 오류 발생!
: C 언어 관련 전체 목차 http://blog.naver.com/tipsware/221010831969 이 문제의 근본적인 원인에 대해...
blog.naver.com
용어
1) 객체
c++ 은 객체지향 프로그래밍이라고 알고있을 것이다. 이 객체가 나온 이유는 바로 클래스를 통해서 하나의 특정한 객체를 정의할 수 있기때문이다.
예를 들면 자동차라는 클래스는 자동차의 속성(변수)과 행동(함수)를 가지게된다. 클래스 하나로 하나의 객체를 표현하고 정의할 수 있기에 객체지향프로그램이라고 하는것이다.
따라서 그림(3)에서 60줄에 mycar라는 객체를 생성한것이고 61줄에서 initMembers() 멤버함수를 통해서 값을 초기화 해주었다.
2) 멤버 함수, 멤버 변수
class 내부에 선언된 변수와 함수를 멤버 변수, 멤버 함수라고 부른다.
3) 클래스 선언, 클래서 정의
클래스 선언과 정의를 설명하기 전에 c++ 클래스는 .h (header file)헤더파일과 .cpp 소스파일로 나눌 수 있다.
.h 파일에는 class의 선언을 담고 .cpp는 클래스의 정의(멤버함수 정의)를 담는다.
아래의 코드를 보면 쉽게 이해가 가능하다.
그림의 순서대로 main.cpp, class.h, class.cpp이다.
class.h ( 헤더 )는 선언부분이고
class.cpp ( 소스 )는 정의 부분이다.
만약 Break(), ShowCarState()부분이 inline화 되어진다면 어떻게 달라질까?
inline을 다시 생각하면 "컴파일 과정에서 함수의 호출 문이 있는 곳에 함수의 몸체 부분이 삽입되어야 한다" 이다.
만약에 inline을 소스부분에 선언하고 main을 컴파일 하게 되면 다음과 같이 진행된다.
1. 소스를 한줄 씩 읽고 inline으로 선언된 Break()를 만나게 된다.
2. class가 정의와 구현으로 나누어저있기에 컴파일러는 Break()가 멤버함수가 맞는지를 확인한다.
3. 하지만, Break()는 inline으로 선언이 되어있기 때문에 Break()의 호출 문장이 Break의 함수 몸체로 대체되어야 하는데 .h 헤더파일에는 정의만 되어있기 때문에 오류가 발생한다.
따라서 이를 해결하기 위해서는
inline으로 선언할 함수의 정의는 헤더파일에 정의를 해주면 컴파일러가 헤더파일에서 바로 Break()를 멤버함수 확인과 동시에 함수 몸체를 대체할 수 있다.
다음과 같이 오류가 발생한다.
올바른 코드
.h 헤더파일에 선언을 하게되면 성공적으로 컴파일이 완료된다.