인프런 커뮤니티 질문&답변

eunjin님의 프로필 이미지
eunjin

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

알고리즘교안 p101 Point구조체 정의하기 코드해석 불가ㅠㅠ

작성

·

215

·

수정됨

1

이 코드 아예 해석이 안됩니다.......

(참고로 언어는 C 하나 배워봤고 그 다음으로 지금 C++ 처음 공부해보는데 그래서 이해 못하는부분이 있는건지..조차 모르겠네요ㅠ)

일단 4번째줄 Point 구조체 안에 int형 멤버변수 y,x까지는 알겠는데

그 다음줄 Point(int y, int ) : y(y), x(x){} 부터 끝까지 아예 뭔소린지 모르겠습니다.

이전 질문들 검색해보니 연산자 오버라이딩이라고 설명해주신 글이 있던데, 읽고 나서 '아 저 코드가 새롭게 연산자를 오버라이딩하는 코드구나'라는건 인지했는데 여전히 코드는 어떻게 해석하는지 모르겠어요.

일단 Point는 우리가 방금 정의한 사용자 정의 자료형인데, 자료형 다음에 변수명이 와야 정상인거같은데 5,6번째줄 Point다음에 괄호가 바로 나오는것도 형식이 이해가 안가고,

제가 지금까지 교안으로만 학습한 바로는, 범위기반for루프에서 : 기호를 사용한 형식이 있었던 것 말고는 : 를 본적이 없어서 Point(int y, int ) : y(y), x(x){} 여기 들어가는 : 기호가 무슨뜻인지 모르겠고, y(y), x(x)의 괄호도, 끝의 {}도 뭔지 모르겠어요.

bool은 참거짓 판별 타입인데 저기서 왜 bool이 쓰였는지, operator는 뭔지, &는 주소를 나타낼때 쓰는거밖에 모르는데 const Point & a의 &는 내가 아는 의미가 맞는지, 맞다면 a는 정체가 변수인지 뭔지, a.x도 역시 a가 뭔지 모르니까 해석이 안되네요ㅠㅠ

죄송합니다 너무 총체적난국이죠..?ㅠㅠ지금 여기서부터 p109까지 코드가 겹치는부분이 많아서 거의 이해가 힘든 상황이라 일단 p110으로 넘어가서 공부하고 있겠습니다...

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 은진님 ㅎㅎ

 

일단 Point는 우리가 방금 정의한 사용자 정의 자료형인데, 자료형 다음에 변수명이 와야 정상인거같은데 5,6번째줄 Point다음에 괄호가 바로 나오는것도 형식이 이해가 안가고,

>>

자료형 다음에 변수명이 와야 정상입니다. 네 맞습니다. int a = 1; 이런식을 되어야 하죠. 다만,

    Point(int y, int x) : y(y), x(x){}
    Point(){y = -1; x = -1; }

앞의 코드를 보면 이것은 자료형을 선언하는게 아니라 struct 내부의 생성자를 선언하는 부분입니다.

생성자를 선언하는 부분은 언어마다 다른데요. 자바스크립트는 이런식으로 선언합니다 여기서 this가 의미하는 바는 Polygon이라는 class를 기반으로 생성되는 객체를 지칭하는 것이구요. 즉, 여기서의 this는 Polygon을 가리키는 것입니다. class내부에서 해당 class명을 가리키는 것이죠. 조금은.. 유사하죠?? ㅎㅎ

class Polygon {
  constructor() {
    this.name = 'Polygon';
  }
}

생성자를 선언하는 것은 언어마다 다르기 때문에 아 그냥 C++에서는 이런식으로 선언하는구나 라고 이해를 하시면 됩니다. 하나하나 설명을 하자면요.

y, x를 기반으로 객체를 만들면 해당 y, x가 할당이 되는 것입니다.

Point(int y, int x) : y(y), x(x){}

자바스크립트로 따지면 이렇게 name이 들어왔을 때 ~~ 해당 객체의 name으로 설정된다는 의미와 같습니다.

class Person {
  constructor(name) {
    this.name = name;
  }

아래의 코드는 만약 어떠한 값도 매개변수로 주어지지 않은 경우 -1로 초기화가 된다는 의미입니다.

    Point(){y = -1; x = -1; }

Point(int y, int ) : y(y), x(x){} 여기 들어가는 : 기호가 무슨뜻인지 모르겠고, y(y), x(x)의 괄호도, 끝의 {}도 뭔지 모르겠어요.

>> 그냥 생성자함수를 정의하는 규칙이다라고 생각하시면 됩니다.

bool은 참거짓 판별 타입인데 저기서 왜 bool이 쓰였는지

>> 사실 operator의 < 이나 >는 단순합니다. 어떤 요소들을 비교해서 그게 더 커? 또는 작가? 즉, true, false를 기반으로 정렬을 하거나 if문을 통해 해당 요소들의 크기를 비교하는데 쓰이는 것이죠. 그렇기 때문에 bool 타입입니다.

operator는 뭔지

>> 해당 부분은 설명은 아래에 설명되어있습니다. [연산자(operator) 오버로딩입니다]

&는 주소를 나타낼때 쓰는거밖에 모르는데

>> call by reference를 의미합니다. 해당 부분은 교안에 설명되어있습니다.

교안내의 참조에 의한 호출을 참고 부탁드립니다.

const Point & a의 &는 내가 아는 의미가 맞는지, 맞다면 a는 정체가 변수인지 뭔지,

>> 매개변수라서 임시변수라고 생각하시면 됩니다.

예를 들어,

#include <bits/stdc++.h>
using namespace std; 
int b = 1; 
void f(int ffff){
    cout << ffff << "\n";
} 
int main() { 
    f(b); 
    return 0;
}

앞의 코드를 실행시키면 1이 출력이 되죠? b라는 변수로 선언했음에도 불구, 매개변수는 해당 이름을 아무렇게나 지을 수 있습니다. 어떠한 Point 타입의 변수를 받아 로직을 실행한다는 의미입니다.

a.x도 역시 a가 뭔지 모르니까 해석이 안되네요ㅠㅠ

>> 해당 객체의 x라는 멤버변수를 참조한다는 의미입니다. 예를 들어 볼게요.

A라는 타입을 가진 kundol이라는 객체는 a, b라는 멤버변수를 가집니다. 그냥 해다 요소안에 a, b라는 이름으로 들어있는 값을 끄집어낼 수 있다라는 의미입니다.

 

#include <bits/stdc++.h>
using namespace std;  
struct A{
    int a, b; 
};
 
int main() { 
    A kundol = {1, 2};
    cout << kundol.a << '\n'; 
    return 0;
}

앞의 코드처럼 해당 요소 중 하나인 a라는 값을 끄집어내는 것을 볼 수 있스빈다. 실행해보시면 1이라는 값이 출력되는 것을 볼 수 있습니다.

죄송합니다 너무 총체적난국이죠..?ㅠㅠ

>> 아닙니다. 이해안되시면 언제든 질문주세요. ㅎㅎ 이해 못하고 넘어가시는 것보다 계속해서 질문주시고 이해하고 넘어가는게 좋습니다.

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

eunjin님의 프로필 이미지
eunjin

작성한 질문수

질문하기