본문 바로가기
OLD/[C++]개념정리

[개탱][C++][Data Abstraction][Class][클래스][수정이 필요합니다..ㅠ]

by 개탱 2018. 1. 2.
728x90

Data Abstraction (자료 추상화) : 서로 밀접한 연관이 있는 data와 함수를 묶어서 표현하는 방식

= Class



Class를 만들 때 생각해내야 할 것들.

1. Class 이름 ( 목적, 사용법 등을 생각해낸다. )

2. Class에 소속된 함수의 이름을 생각해낸다.

3. 함수들을 사용 함

4. specification을 정한다.(사용 방법&사용 목적)



4번까지 짠것들이  [ stub ]  :: 목적만 명시해주고 세부 내용들을 만들어 두지않는 클래스.

>>누가 스텁만 짜줘! 라고 하면 클래스의 헤더파일에는 함수명들, 필요 멤버같은것들을 생성해주고 주석처리로 그 함수등의 멤버들에 대한 설명만 해주면된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef _STACK_H
#define _STACK_H
 
#define MAX 100
class Stack{
private:
    int _iStackArray[MAX]; 
    int _iTop;
public:
    void push(int iNum); //스택에 값을 추가
    int pop(); // 스택의 마지막 값을 삭제후 리턴
    int size(); // 스택의 총 사이즈
    int peek(); // 스택의 마지막 값을 리턴
    void printAll(); // 스택의 모든 내용을 출력
public:
    Stack();
 
};
 
#endif
cs


5. implementation(구현)

1. 데이터 멤버를 선언

2. 함수 body coding




http://gaetaeng.tistory.com/20

[분리컴파일 Separate compilation]


분리컴파일에서 봤던 구조체를 만들고 헤더파일 하나에 관련이 있는 함수들을 묶어놓은것은 관습으로 할뿐 역시나 불편하다.

만약 구조체 안에 함수도 넣을 수 있으면 얼마나 좋을까 ?



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef _STACK_H
#define _STACK_H
 
typedef struct stack
{
    int s[100];
    int top;
}STACK;
 
 
extern void push(STACK *s, int data);
extern int pop(STACK *s);
 
#endif
 
cs


이렇게 되있는 것을


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef _STACK_H
#define _STACK_H
 
typedef struct stack
{
    int s[100];
    int top;
 
    void push(STACK *s, int data);
    int pop(STACK *s);
 
}STACK;
 
 
#endif
cs


이렇게 사용이 가능하면 얼마나 좋을까 싶어서 나온게 Class



1
2
3
4
5
6
7
8
9
10
11
12
13
14
//stack.h
#ifndef _STACK_H
#define _STACK_H
 
class STACK
{
public:
    int s[100];
    int top;
    void push(int data);
    int pop();
};
 
#endif
cs

1
2
3
4
5
6
7
8
9
10
11
//stack.cpp
#include "stack.h"
 
void STACK::push(int data){
    top = top+1;
    s[top] = data;
}
int STACK::pop(){
    top = top -1;
    return s[top+1];
}
cs


위에 보면 STACK::push 라고 되있는데 이것은 push 라는 함수가 STACK 라는 클래스 외에도 다른 클래스들에도 존재할수 있기때문에 STACK 라는 클래스에 포함된 push 라는 함수라고 표현을 해주는 것.

[이부분에 대해서는 나중에 따로 글을 써보겠습니다!]


Data Member / Member Function

 - 클래스 내부의 변수들에 대해서는 Data Member 라고 부르며

 - 클래스 내부의 함수들에 대해서는 Member Function 이라고 부른다.

1
2
3
4
5
6
7
8
9
10
11
12
13
//stack.h
#ifndef _STACK_H
#define _STACK_H
 
class STACK
{
public:
    int s[100]; // Data Member
    int top;
    void push(int data); // Member Function
    int pop();
};
#endif
cs




1
2
3
4
5
6
7
8
9
10
11
//stack.cpp
#include "stack.h"
 
void STACK::push(int data){
    this->top = this->top+1;
    this->s[this->top] = data;
}
int STACK::pop(){
    top = top -1;
    return s[top+1];
}
cs


위와 같이 Member Function 내부에서 Data Member 를 부를때 this->top 이런식으로 해야하지만

타자치기 싫으므로 this-> 를 생략해도 된다. 




 (서비스의) 사용자

(서비스의) 공급자 

 사용자 입장에서 알아야 되는 내용

 공급자 입장에서 알아야 되는 내용 

 목적 :

 사용방법 : 

  만드는 방법 : 자세한 내용, 재료 . .  등등

 명세부 ( specification )

 구현부 ( implementation ) 




사용자들이 알아야되는 specification 부분은 public(공용)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//stack.h
#ifndef _STACK_H
#define _STACK_H
 
class STACK
{
public:
    int a;
private:
    int b;
private:
    void c();
};
 
#endif
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(){
    
    STACK s1;
    STACK s2;
    s1.top = -1//초기화문
    s2.top = -1//initializeation
    int x;
    s1.push(100);    
    s1.push(200);
    s1.push(300);
    x = s1.pop();
    x = s1.pop();
    s1.push(400);
    x = s1.pop();
    x = s1.pop();
 
    printf(" x  = %d\n",x);
 
    s2.push(10);
    s2.push(20);
    x = s2.pop();
    printf(" x = %d\n",x);
cs

으로 표현해주며

공급자들이 알아야되는 implementation 부분은 private(사적인) 등으로 표현을 한다.


여기서 공급자는 STACK 라는 클래스를 만든 사람이 공급자가 되며.

사용자는 Main을 만들어서 STACK 클래스를 사용하는 사람이 사용자 이다.


기본적으로 public / private 등등 아무것도 쓰지 않았을 경우 private 가 defualt 이다.


기본적으로 만들어진 Data Member들은 사용되기전에 초기화를 해주는게 좋다.

그래서 나온게 생성자 ( constructor )

1. 클래스명과 같다.

2. return 타입이 없다.

3. 클래스의 객채가 정의 될 때 자동으로 호출이 된다.

 STACK.h

STACK.cpp 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//stack.h
#ifndef _STACK_H
#define _STACK_H
 
class STACK
{
public:
    STACK();
    int s[100]; // Data Member
    int _top;
    void push(int data); // Member Function
    int pop();
};
 
#endif
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//stack.cpp
#include "stack.h"
 
STACK::STACK()
{
    _top = -1;
}
void STACK::push(int data){
    this->_top = this->_top+1;
    this->s[this->_top] = data;
}
int STACK::pop(){
    _top = _top -1;
    return s[_top+1];
}
cs


*관습*ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

|  클래스 내부에서 Data Member 를 선언해준뒤

|  함수에서 사용하다보면 fomal paramenter 또는 Local Variable 과 햇갈릴수가 있기 때문에

 Data Member 에서 선언을 해줄때 앞에 ' _ ' 를 붙여주거나 

|  m_ 를 앞에 붙이는다. ( Member 라는 의미 )

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(){
    
    STACK s1;
    STACK s2;
    s1.top = -1//초기화문
    s2.top = -1//initializeation
    int x;
    s1.push(100);    
    s1.push(200);
    s1.push(300);
    x = s1.pop();
    x = s1.pop();
    s1.push(400);
    x = s1.pop();
    x = s1.pop();
 
    printf(" x  = %d\n",x);
 
    s2.push(10);
    s2.push(20);
    x = s2.pop();
    printf(" x = %d\n",x);
cs
 위 코드를 실행한다고 가정하였을 때

클래스 타입을 가진 변수를 정의하면 STACK s1; STACK s2;

그 변수에 필요한 메모리를 할당해준 뒤, 그 변수의 Constructor(생성자) 을 확인하러 간다.


Constructor 를 확인하러 서 내부 Constructor 를 진행할 때 필요한 메모리 할당이 되는데 

그때 항상 this 메모리가 할당되어서 

STACK s1; 일때 s1의 생성자 즉

STACK 클래스 내부에 있는 STACK() 이라는 생성자가 호출이 되는데 

이때 this는 s1을 가리킨다.


클래스 타입의 변수를 생설할시  

클래스 타입을 가진 변수의 메모리내부에 this 라는 변수(?)가 항상 할당된다.

(이때 this 는 해당 자기 자신을 가리키는 pointer 라고 생각하자)



그 뒤 this 가 가리키는 (this는 s1을 가리키므로) top 의 값을 -1로 설정한다.. 이런식으로 진행이 된다.

(물론, this->top  이지만 치기싫어서 this-> 생략 하고 top 이라고만 써도 된다.)




댓글