• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

15:36 에서 왜 class가 좋은지 설명해주셨는데

21.01.31 21:06 작성 조회수 151

0

안녕하세요.

1. 제목 그대로 왜 class가 좋은지 말씀해주셨는데요, 간단하게 정리하면 이 부분에서 class가 좋은 이유가 결국 메모리를 먹지 않기 때문이라고 할 수 있을까요?

2. 그리고 class와 구조체의 메모리와 관련해서 질문이 있습니다.

Friend jj;

cout << &jj << endl;

Friend_struct a;

cout << &a << endl;

->

00F9F858

00F9F7E8

Friend는 class이고 Friend_struct는 구조체인데요, 메모리 할당 측면에서 class와 structure가 어떻게 다른지 확인해보고 싶은데 Friend 자체는 instantiation이 되지 않았기 때문에 주소를 출력할 수 없는 것처럼 구조체인 Friend_struct역시 마찬가지인가요?

그리고 구조체에서도 instance, instantiation이라는 개념이 있는지 궁금합니다.

답변 1

답변을 작성해보세요.

4

안소님의 프로필

안소

2021.02.01

안녕하세요.

1. 그렇다기보단 클래스가 좋은 이유는 곧 객체지향프로그래밍의 장점 때문이나 마찬가지입니다. 객체지향 프로그래밍의 특징은 은닉성, 추상화, 캡슐화, 상속성, 다형성.. 이런 특징들이 있는데 이런것들도 다 클래스-객체의 장점이나 마찬가지라고 볼 수 있으니 꼭 찾아보셨으면 좋겠어요! 제가 이걸 다 설명드리면 너무 길어지니 객체지향에 대해서 간단하게만 설명드리도록 하겠습니다.

인스턴스는 이 세상에 존재하는(=메모리에 존재하는) 사물이고 이 인스턴스를 찍어내는 클래스는 실존 하는 것은 아니고 "머릿 속"에 존재하는(=메모리에 존재하지 않는) 어떤 추상적인 설계도라고 생각해주시면 됩니다. 

자동차들을 만들려면 자동차들이 가져야 하는 공통적인 속성과 기능이 있겠죠. 속성엔 자동차의 이름, 엔진성능, 최대속도,바퀴개수 이런 것들이 들어갈 수 있겠고 기능엔 브레이크걸기, 시동걸기 등등 이런 것들이 들어갈 수 있겠습니다. 이렇게 머릿속으로 자동차라면 이런 속성들과 이런 기능들을 가져야 한다고 공통적이고 추상적인 설계도를 머릿 속으로 정해놓으면 이 설계도를 바탕으로 자동차들을 실제로 만들어냅니다(Instantiate). 이 추상적인 자동차의 설계도가 클래스 Class Car 가 되겠고 이 클래스를 바탕으로 공장에서 만들어진 실존하는 자동차들이 바로 객체입니다. Car sedan;  Car truck;  Car bus;  이런식으로 그 자동차 설계도(클래스)로부터 세단, 트럭, 버스 이런 세상에 실존하는 자동차들(객체)를 만드는 원리와 같습니다. 실제로 만들어진 자동차은 모두 같은 설계도로 만들어졌지만 이름, 엔진성능,  바퀴 개수 등등이 다를 수 있습니다. 우리가 사과라고 부를 수 있는 사과의 추상적인 특성들이 있죠. 그러나 실제로 존재하는 사과들은 조금 멍이 들어있을 수도 있고 풋사과라 초록색일 수도 있고 하죠. 사물로 존재하는건 아니지만 우리가 생각하는 사과의 추상적인 특징들이 바로 클래스라고 할 수 있고 이 세상에 실제로 존재하는 다양한 사과들이 바로 객체라고 할 수 있겠습니다.

구조체와 마찬가지로, 관련있는 속성(변수)들과 기능(함수)들을 한데 모아 관리하면 더 좋겠죠. 그래서 구조체처럼 관련 있는 변수들과 함수들을 묶은게 바로 클래스인데 이렇게 관련있는 변수와 함수들을 한데 모아 Instantiate 할 수 있고, 이 instance 들의 공통적이고 추상적인 설계도와 같은 역할을 하는 것이 클래스의 장점이라고 생각해주시면 될 것 같습니다. 이런 머릿속의 추상적인 설계도와 같은 역할이니 당연히 메모리를 차지하지 않는것이구요! (실존하는 어떤 사물이 아닌 머릿속 설계도)

관련있는 변수들을 한데 모아 관리하기 때문에 

위와 같이 각각의 독립적인 변수로서 넘길 필요 없이

이렇게 클래스로 모두 한데 묶으면 함수 호출할 때도 너무 깔끔해지죠! 

2. 구조체도 클래스와 똑같아요. 구조체 정의는 클래스 정의와도 같고 구조체 생성하는 것은 객체 생성과도 비슷합니다. 그냥 클래스와 비슷하게 생각해주시면 됩니다. 

구조체와 클래스의 유일한 차이점은, 클래스는 접근지정자들을 사용할 수 있다는 것에 반해 구조체는 접근 지정자가 없다는 것 뿐입니다. 클래스는 private, protected, public 이런 접근지정자들로 접근의 정도를 설정할 수 있고 은닉할 수도 있어요. (객체 지향의 특징 중 하나인 은닉성) 그러나 구조체는 이런게 안되서 그냥 구조체의 모든 멤버들이 public이라고 생각해주시면 될 것 같습니다. 이것도 클래스 장점이라고 볼 수 잇겠네요. 객체지향의 특성들 찾아서 읽어보시는 것을 추천합니다!