Language/C++

[C++] Class & 접근제어지시어

검은 까마귀 2024. 1. 22. 11:31

# Class(클래스)란?

class는 OOP에서 특정 Object를 생성하기 위해서 변수와 메소드를 정의하는 일종의 틀이라고 할 수 있다. 객체를 정의하기 위한 메소드와 변수로 구성된다.

Method(메소드) : OOP에서 객체와 관련된 서브틴이자 클래스가 갖고 있는 function이다. 데이터와 멤버변수에 대한 접근 권한을 갖고 있다.

Variable(변수) : 데이터의 위치를 저장하는 역할을 한다. 

 

일종의 틀, 즉 템플릿을 사용하면 Object를 분류할 떄 멤버의 자료형을 미리 정하지 않고 객체를 사용할 때 결정할 수 있게된다.

C++에서 클래스는 구조체의 상위 호환이라고 할 수있게된다. 구조체에 대한 이해는 아래 글을 참고하면 된다.

2024.01.19 - [Language/C++] - [C++] Structure Type(구조체)

 

[C++] Structure Type(구조체)

# 구조체란? 구조체(Structure Type)은 C++의 기본적인 타입(int, char, double 등등)들을 통해서 새롭게 정의를 할 수 있는 사용자 정의 타입이다. 개인적인 생각인데 해당 발상은 타입별로 자료형을 따로

blaj2938.tistory.com

 

하지만 C++에서 구조체도 멤버로 method를 가질수 있기때문에 C++에서 클래스와 차이는 접근제어자 차이일 뿐 나머지는 거의 같다. Struct도 사용이 가능하지만 Class와 Sturct의 차이는 Default 접근제어자의 차이이다. 


Class ➡️ Private

Struct Type ➡️ Public

 

또한, 우리가 OOP를 하다보면 자주 등장하는 용어인 Instance라는 것이 있는데 이는 메모리에 올라간 Object를 의미하게 된다.

 

# Class(클래스)의 활용

Class를 선언한다는 것은 OOP의 특징중 추상화를 사용자 정의 타입으로 구현한것이다.  사실 이런한 클래스를 선언하는 방법은 구조체의 선언과 비슷한데 아래는 주소록 서비스를 구현하면서 구조체와 클래스를 선언한 방법이다.
(inf 가 코드로 인식되는 오류가 있는듯....)

struct AddressInfo {
    string name;
    string address;
    string phoneNumber;
    string email;

    AddressInfo(string n, string a, string p, string e) : name(n), address(a), phoneNumber(p), email(e) {}
};

// 연결 리스트의 노드
class Node {
public:
    AddressInfo info;
    Node *next;

    Node(AddressInfo info) : info(info), next(nullptr) {}
};

 

보면 Node라는 클래스를 만들어서 접근제어자 Public을 활용해서 만들었다. 접근제어자 혹은 지시제어자는 정보의 은닉을 위한 키워드이기 때문에 객체에 대한 접근 권한을 명시한다. 나는 아래서 주소정보를 모아두는 주소록을 Linkedlist로 구현하기 위해서 다른 객체에서도 접근할 수 있도록 설정해 두었다.

 

그리고 함수(method)도 클래스(class)에 넣을 수 있는데 아래에 추가한 함수는 주소록에 주소록관련된 정보를 담아 넣는 함수를 만들어서 넣었다.  이렇게 Linkedlist 데이터 필드로 선언된 주소정보 구조체에 데이터를 담아서 함수호출을 하면된다.

class AddressBook {
private:
    Node *head;

    // 주어진 이름을 가진 노드를 찾는 함수
    Node *findNode(string name) {
        Node *current = head;
        while (current != nullptr) {
            if (current->info.name == name) {
                return current;
            }
            current = current->next;
        }
        return nullptr;
    }

public:
    AddressBook() : head(nullptr) {}

    // 주소록에 주소 정보 추가
    void addAddress(AddressInfo info) {
        Node *newNode = new Node(info);
        newNode->next = head;
        head = newNode;
    }
}

 // 구조체에 담아서 함수 호출
 // myBook.addAddress(AddressInfo(name, address, phoneNumber, email));

 

사실 이전에 프로그래밍을 조금이라도 공부한 사람이라면 이해하기는 어렵지가 않다. 함수호출이나 함수 생성은 기본적인 내용이기 때문이다.

 

그냥 공부하다보니깐 개인적으로 뭔가 C++의 구조체랑 클래스가 현업에서는 어떻게 쓰이는지는 모르겠다. 대게 구조체 자체에는 멤버 함수를 사용을 안하고 데이터의 바이트 사이즈가 정밀하게 이동하거나 데이터가 전송될때 데이터 유실 여부를 확인하기 위해서 사용하는 것 같은 느낌이 강했고, 클래스는 OOP를 위해 생긴 데이터 타입이기 때문에 상속이나 정보 은닉, 멤버함수를 사용할때 자주 사용하는 것 같다. (모던 C++이라는 책을 읽어봐야 할 것같다....!!, OOP를 지향한다면 클래스를!)

 

# 접근제어 지시자

OOP에서 접근 제어는 필수적인 요소이다. 

  • OOP 특징
    1. 추상화
    2. 캡슐화
    3. 정보 은닉
    4. 상속성
    5. 다형성

접근제어자를 사용하게되면 캡슐화를 더욱이 강화할 수 있게된다. 그 이외에도 유지보수성(아직 경험하지 못함)용이하고 의존성을 낮추는 거(경험하지 못함), 코드 가독성을 높일 수 있게된다.

2022.01.10 - [Language/Java] - [JAVA] 제어자(modifier)

위에 글을 JAVA에서 제어자에 대해서 포스팅한 글이다. C++과 연관지어서 생각해보면 더 쉽게 이해할 수 있다.

 

JAVA의 제어자와 C++의 접근제어자에 차이는 default가 없다.

  • public
  • private
  • protected

# public

  • 그냥 다 접근 할 수 있다.

 

 

# private

  • 그냥 다 접근 할 수 없다.

# protected

  • 다른 패키지의 일반 클래스는 접근 불가능 하다.

 

 

 

 

공부하다보니깐 사실 JAVA의 OOP 개념과 큰차이는 없어서 전혀 어렵지는 않았다. 그냥 C++ 문법이 사실 어렵지... 계속 string을 써야하는데 String을 쓴다던지.... 이런 문제는 자주 사용하지 않아서 생기는 문제이기 때문에 어떤 방식으로 연습해야할지는 아직 의문이다. 생각보다 주소록 만드는 것이 어렵지는 않았지만, 뭔가 기능 구현은 다 해뒀지만 정렬하는 자료구조에 대해서 더 고민을 해봐야겠다.

 

반응형