ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴프실] 5일차 -클래스
    공부/cpp 2023. 2. 23. 18:16

    배열은 어떠한 이유로 사용을 하는가?

    어떠한 자료형을 한꺼번에 저장을 할 때 사용한다.

    이런 배열의 한계점은

    각각의 저장 장소에 서로 다른 자료형은 저장을 할 수가 없다.

     

    예를 들어 성적처리를 해야하는데

    성적표에는

    이름도 있고, 학번도 있고, 학과도 있고, 성적도 있다.

    문자, 숫자, 문자, 문자 이렇게 여러개가 들어갈 수가 없고.

    이름이 들어가는 배열 따로, 학과, 학번, 점수 들어가는 배열 따로 만들어서 처리를 할 수 밖에 없다.

    이런 과정은 굉장히 번거롭다.

     

    c언어에서 이런 것을 해결하는 것이 구조체였다.

     

    그 구조체 같은 개념이 cpp에서 클래스이다.

    근데 클래스는 여러가지 자료형의 데이터 뿐만 아니라 함수(클래스 내의 함수는 메소드라 한다.) 까지 저장이 가능하다.

     

    클래스를 예를 들면 붕어빵틀을 예시를 든다.

    붕어빵 틀은 클래스이고, 붕어빵의 재료는 데이터이다. 만든 붕어빵은 객체(object), 인스턴스(instance)라고 한다.

     

    클래스를 설계도라고 생각해도 된다.

    예를 들어 스마트폰을 만든다고 가정해보자

     

    먼저 브랜드 : 삼성, 애플

    색상 : 화이트, 블랙

    가격

     

    이런 것들은 속성이다. 이런 속성은 멤버변수(데이터)로 구현한다.

     

    반면,

    카메라로 촬영한다.

    전화통화를 한다.

    손전등을 밝힌다.

     

    이런 것들은 동작이라고 한다. 동작은 멤버 함수(메서드)로 구현한다.

     

    class Phone { //클래스 명 (대소문자 관계없다. 하지만 통상적으로 대문자를 쓴다.)

    public : //접근 제어자

        string maker; //멤버변수들

        string model;

        string color;

     

        void call(); //멤버함수들(메서드)

        void camera();

        void intro();

    };

     

    어디서 초기화를 할지 누가 접근을 할지 정할 수 있다.

    만일 정하지 않으면 클래스 내에서만 접근 할 수 있다.

     

    그래서 어떻게 접근을 할지를 미리 정의해줘야한다.

    그게 바로 접근제어자(access modifier)라고 한다.

    public이면 어디에서나 접근할 수 있다.

    protected : 상속 관계에서만 접근 가능

    private : 외부에서는 접근이 불가능하다. 같은 클래스 내에서만 접근 가능

     

    기본적으로 설정하지 않으면 private이 적용이되고, 선언을 할때는

    private : 이런식으로 :을 붙여서 정의한다.

     

    초기화나, 함수의 정의는 클래스 내부에서도 할 수 있지만, 일반적으로 클래스 밖에서 정의한다.

     

    void Phone :: call(){

    cout << "전화하기" << endl;;}

    여기서 ::은 클래스에 속한; 클래스가 가지고 있는; 클래스에 정의되어있는 이라는 뜻이다.

    여기서는 Phone 클래스에 속한 메서드 call()이라는 뜻이다.

     

    void Phone::carmera(){

    cout << "촬영하기" << endl;

    }

     

    void Phone::intro(){

    cout << "제조사 " << maker << " 모델 " << model << " 색상 " << color << " 가격 " << price << endl;

    //printf 써봤는데, 입력값이 제대로 출력이 안되는 현상이 있음 아마 클래스는 cpp 문법이어서 그런 것 같다.

    int main(){

    //인스턴스(객체) 화하는 법

    Phone phn; //객체 생성

    phn.maker = 'LG'; 클래스 내에서는 ::을 썼지만, 객체에서 함수나, 변수에 접근할 때는 .을 쓴다.

    phn.model = "happy";

    phn.color = "blk';

    phn.price = 10000000;

     

    phn.call();

    phn.camera();

    phn.intro();

    /*객체 안에 있는 값을 쉽게 바꿀 수 있기에 자칫하면 의도하지 않은 값이 들어갈 수 있다. 이때문에 클래스는 캡슐화와 은닉화를 지원한다.*/

     

    return 0;

    }

     

    우리가 접근제어자를 public이라 두었기 때문에 메인 함수에서 클래스로 접근이 가능하다.

    그래서 main에서 멤버 변수 값을 막 수정할 수 있었지만, 의도되지 않은 값이 들어갈 수 있기 때문에

    접근 제어자로 public 대신 private를 써주면 된다.

    하지만, private로 바꾸면 main에서 클래스 내에 접근을 못해서 오류가 난다.

    그래서 클래스에 접근을 하려면, 메서드를 통해서 접근을 해야한다.

    그래서 멤버 변수만 private로 하고, 메서드는 public으로 하면된다.

     

    class Phone { //클래스 명

    private : //접근 제어자

        string maker; //멤버변수들

        string model;

        string color;

    public :

        void call(); //멤버함수들(메서드)

        void camera();

        void intro();

    //main에서 클래스 내에 있는 멤버변수에 접근하기 위해서 메서드를 하나 더 선언한다.

        void setMaker(string _maker){

        if  (_maker != "Samsung"){

            cout << "잘 못 입력하셨습니다." <<endl;

            return;}

     

    // phn 객체에서 입력되는 데이터를  _maker 변수로 집어넣어준다. 이런 객체의 값을 받아오는 인수 변수는 일반적으로      _를 변수앞에 써준다.

        maker = _maker // 캡슐화 : setMaker를 통해 입력되는 값을 제한시킴

        }

    };

     

    int main(){

    Phone phn;

    phn.setmaker("LG");

    return 0;

    }

     

    setMaker 메서드를 통해 값을 클래스내에 간접적으로 전달한다.

     

    생성자

    객체가 생성되는 순간 호출되는 메서드

    내가 클래스 내부에서 선언하지 않았어도 자동으로 기본 생성자가 선언된다. 

     

    생성자의 위치는 public 안에 어디든지 괜찮다.

    생성자는 클래스 명과 똑같다.

    그냥 클래스 내부에 ,public 부분에 Phone(); 하면 생성자가 선언된 것이다.

     

    생성자를 클래스 밖에 구현(?)할 때는

    클래스명::생성자(){

    문장;}

    이런식으로 하면된다.

    다른 메서드들과 다른 특이한 점은 return 타입. 즉, 함수의 반환형이 없다는 것이다.

     

    그럼 왜 쓰는지를 모르겠다.

    '공부 > cpp' 카테고리의 다른 글

    부동소수점 정리  (0) 2023.03.07
    헷갈리는 보수 개념 정리  (0) 2023.03.07
    [컴프실] 5일차  (0) 2023.02.22
    [컴프실] 4일차  (1) 2023.02.21
    [컴프실] 3일차  (1) 2023.02.18
Designed by Tistory.