다시 오신 걸 환영해요 마지막으로 구조에 관해
얘기할 것은 그게 함수와 어떻게 관련되는지
어떻게 구조가 인수로 매개 변수와 함수에 전달되는지 이게 왜 더 효율적인지예요
구조는 함수에 대한 인수죠
패밀리라는 구조물을
선포한 후에요 이 예제에선 명명된 가족을 생성하겠습니다
이 구조를 함수에 인수로 어떻게 넘길까요?
패밀리라는 구조가 있어요
여기에 캐릭터 배열이 많아요 이름,
아버지와 어머니 그리고 int 나이도 있죠
그게 우리 구조 정의예요
구조라는 걸 알 수 있는 건 구조 키워드가 있고 태그 이름과
중괄호 같은 게 있기 때문이죠
형제자매라는 함수에 어떻게 그 구조를
전달할까요?
구조를 선언한 것처럼 할 거예요 형식을
매개 변수 이름으로 지정하겠죠
아주 간단해요 이 경우에는 불리언 형제예요
형제자매가 불리언을 돌려주러 왔어요
두 가지 매개 변수가 필요해요 두 가지 구조요
먼저 유형을 파악해야 해요 유형 스트럭트 계열이죠
보다 고급 C에선 이 구조에 타자기로
입력해 다른 이름을 붙일 수 있어요 여기선 이름을 줄일 수 있죠
타자기에 관해선 얘기한 적 없지만요
그게 낫겠네요
하지만 이렇게 해야 해요 전체 형식을 정의해야 해요
구조 패밀리와 변수 이름이죠 다른 매개 변수처럼요
매개 변수 2개를 넘깁니다 멤버1과 멤버2죠
둘 다 타입 구조 가족이에요
기능 내에서 멤버에 액세스하고 싶으면 평소처럼
멤버에 액세스하죠
멤버1과 멤버2는 포인터가 아닙니다 그래서 대시를 사용하지 않고 포인터만 사용합니다
그들이 가리키는 것을 보려면 그들을 다시 참조해야 하니까요
이건 포인터가 아니니까 점만 찍으면 돼요 회원 1번, 어머니 2번, 어머니예요
멤버 1과 어머니 2는 캐릭터
배열이고 캐릭터 배열은 포인터예요
str 비교를 할 수 있게요 스트 비교는 같다면 등호를 반환합니다
멤버 1과 멤버 2 엄마 멤버가 같은지
확인하는 거죠 그렇다면 우린 true를 반환하겠죠
둘 다 이름이 같고 진짜 성이 같다면
둘은 남매일 테니까요
아주 간단해요
함수 선언에 그런 형식의 구조가
있으면 함수에 인수를 넘기기가 쉬워요
이 함수는 매개 변수가 2개인데 각각은 형식 가족
구조죠
그럼 기능 인수로 구조에 포인터를 두고 싶다면요?
앞서 언급했듯이 이게 더 낫습니다 패스 바이 값과
C를 다루고 있으니까요
값을 넘기면 복사해요
많은 데이터, 많은 큰 구조를 인수로
포함하는 구조가 있을 경우 그
구조의 모든 걸 실제 함수에 복사해야
해요
큰 구조물을 복사하는 데
시간이 걸릴 수 있어요
포인터가 있다면 주소만 복사하면 돼요
그게 훨씬 빠르죠 구조에 대한 포인터는
매개 변수와 기능으로 사용되어 메모리 소모와
구조를 복사하는 데 걸리는 시간을 피하죠
작은 구조는 별것 아니지만
포인터와 큰 구조는 꼭 사용하세요
그래서 이 경우 어떻게 하느냐? 여전히 구조 형식의 이름을 명시합니다
별표만 미리 붙이면 되죠 아주
간단해요 구조 내의 어떤 데이터도
변하는 걸 원치 않는다면 구조 형식 전에 상수를 사용할 수 있어요
주소가 바뀌는 게 싫으면 가족의 신호 뒤에 상수를 붙였어야죠
여기서도 똑같이 하고 있어요 하지만 이젠 다르게 액세스할
겁니다 이제 이건 포인터니까요 점 대신 대시를
새 기호보다 크게 액세스할 수 있죠
여기 점을 안 써도 돼요 포인터는 먼저
참조를 해제해야 하니까 괄호 안에 넣어야 해요 포인터를 해제하려면
구문이 더 필요하니까요 그리고 괄호 밖에 점을 넣어야 해요 그게
더 우선이니까요 대시를 쓰는 게 더 쉬워요
대시와 엄마보다 큰 것 대시와 엄마보다
큰 것 둘 다 포인트예요 str 비교에서 전달될 수 있죠
같다면 사실로 반환하세요 그렇지 않으면 거짓을 반환하죠 아주 간단해요
앞서 말했듯이 Modifier를 사용하면
됩니다 조직원의 변경을 허용하고 싶지 않다면요
구조가 가리키는 것을 포인터 앞에 놓으세요
가족보다 더 중요할 수 있어요
이 경우 가족에겐 타입F가 있어요
여기서는 가족을
구성하거나 가족의 의견을 피력하는 거죠
액세스 역시 같은 방법으로 아무것도 수정하지 않죠 가셔도 돼요
컴파일러는 불평 안 할 거예요
상수 Modifier를 쓸 수도 있어요 주소 자체를
수정하고 싶지 않다면요
이 구조들을 바꾸려고 시도하면 컴파일 중에 오류 메시지가 발생해요
가족 별 다음에
상호를 붙이는 거예요
무슨 뜻이냐면 p-member의 값은
바꿀 수 없다는 거예요 포인터의 값은 주소를 뜻하죠
하지만 이건 별로 유용하지 않아요 값을
전달할 때 주소를 복사해 전달하는 거니까요
이렇게 할 필요는 없지만 할 수는 있어요
여기서 다시 p 멤버의 주소를 변경할 수 있어요
이 경우엔 그냥 데이터에 엑세스해서 동일한지 보는 거죠
각 매개 변수 정의에서 인다이렉션 연산자는
상수 키워드 앞에 있어요
그 별표는 매개 변수 이름 앞에 없어요
포인터에 저장된 주소는 수정할 수 없어요 별표 뒤에 있거든요
그게 매개 변수 이름 타입 앞에 있다면 그게
가리키는 실제를 수정할 수 있어야 하죠
인다이렉션 연산자가 매개 변수 이름 앞에 있다면 그 전 상수
안에 있는 건 가리키는 걸 수정할
수 있어야 한다는 뜻이죠 주소만 말하면 돼요
포인터에 저장된 주소는 수정할 수 없어요
여기서 보호되는 건 포인터예요 포인터가 가리키는 구조가
아니라요 상수나 다른 포인터 매개 변수처럼요 스트럭츠와는 차이가 없어요
함수인 포인터로부터 구조를 반환하고 싶다면
함수 프로토타입은 선언에서 일반적인 방식으로 이 반환
값을 표시해야 해요
여기서 재미 포인터와 데이트하려면
치라고 해야죠 포인터든
아니든 상관없어요 유형 Date의 구조를 반환하는 무인수 함수의 프로토타입이에요
함수로부터 구조를 반환하기가 아주 쉽죠 가격은 얼마나 될까요?
이제 함수에서 하나 이상의
요소나 데이터 항목을 반환할 수 있어요
구조를 리턴하면 10개의 값 10개의 다른 데이터 항목을 리턴할 수 있어요
정말 멋지죠? 함수에서 하나 이상을 반환할 수 있어요
아주 귀중하죠
그래서 구조에 포인터를 리턴하는 게 더 편리합니다 구조만 리턴하는 것보다요
구조에 포인터를 반환하면 힙에서 생성됩니다 모든 포인터는
힙에서 생성되니까요
좀 더 오래간다는 뜻이죠
이 말은 임의로 삭제하고 관리할 수 있다는 거죠
이 예제에선 펀드라는 이름의 구조를 만들고 있어요
뱅크라는 이름의 캐릭터 배열과
더블을 포함하고 특정 길이로 저장된 또 다른
캐릭터도 포함하죠 재미 길이가 50인 줄 알았어요
저장된 게 두 개예요
SUM이라는 함수가 있는데 그 구조를 매개 변수로 받아들이죠
그 안에 있는 건 첫 번째 구조에서 은행
펀드와 저축 펀드를 반환하는 거예요 그럼 은행에
있는 금액이 반환되죠
이 예제에서 섬은 그냥 더블이죠
포인터를 돌려주진 않을 거예요 매개 변수로 포인터를 취하는 거죠
메인 기능에 type구조펀드라는
구조 변수를 생성해요
몇 가지 값으로 초기화하고 호출 SUM을
출력할 거예요 다른 변수와 마찬가지로 구조를 지나가죠
다시 참조할 필요 없어요 포인터가 아니에요 특별히 뭘 할 필요는 없어요
함수 선언에 저 구조 형식이 있는지만 확인하면 돼요 다른
건 다 정상이에요
몇 가지 당부할게요
함수에 구조를 전달할 때는 항상 포인터를 사용해야 한다고 말씀드렸었죠
왜요? 왜냐하면 c의 이전 버전은 구조를
통과시키지 않거든요.
하지만 포인터는 허용하죠.
그러니 어떤 호환성도 피할 수 있어요
옛날 버전 c를 사용하면 그 프로그램은 작동할 거예요
따라서 단일 주소를 전달하는
것도 시간 복사가 더 효율적이죠
하지만 이렇게 하면 매개 변수를 전달하면 그게 함수 안의
구조에 대한 포인터예요 데이터 보호가 덜해지죠
그래서 함수의 일부 연산은 본래 구조의 데이터에 무심코
영향을 미칠 수 있죠
여기서 예선전을 사용해야 해요
실제 형식 전에 컨스트를 사용해요
별표 다음에 말고 매개 변수 이름 전에
형식 전에요
전달 구조의 장점은 인수입니다 함수는
원본 데이터의 복사본과 작동하죠
원본 데이터로 작업하는 것보다 안전해요
그게 여러분이 인수로 구조를 넘기는 유일한 시간입니다 포인터가 아니라요
프로그래밍 스타일도 좀 더 명확하죠
구조화된 포인터를 인수로 전달하는 것과 비교했을 때 구조적인
인수를 전달하는 것의 큰 단점은 오래된
구현을 다루지 않는 것입니다 시간과 공간을
낭비하고 특히 큰 구조를 가지고
있을 때에는 각 멤버를 위해 많은 복사 작업을 해야 하기
때문이죠 그러니까 명심하세요
대부분의 경우 구조에 포인터를 전달하는
게 더 효율적이고 시간도 절약되죠
프로그래머들은 효율성을 위해 구조 포인터를 기능 인수로 사용합니다
필요할 때는 불일치를 사용하죠 이게 여러분이 원하는 조합이에요
보호가 걱정된다면 효율성을 위해 함수 포인터를
사용하세요 그런 다음 함수 안에서
실수하는 건 없도록요 일반적인 포인터처럼요
다 비슷비슷하게요 하지만 포인터는
효율성에서 훨씬 더 중요합니다 큰 구조니까요
가치로 처리하는 구조는 대개 작은 구조에 적용됩니다
그런 규칙들을 고려해야 하죠
작으면 포인터가 아닌 구조물도 통과할 수 있어요
역시 중요한 개념이죠 구조와 매개 변수로서의
포인터 전달 인수, 반환 포인터와
관련해서요 이제 이것의 일부를 구현할
수 있어요 우린 많은 예를 제시하죠 개념은 이해했어요 구문은 이해했어요
이제 몇 가지 문제를 보여드릴게요 여러분이 실제로 이걸 하는 거죠
구문을 외웠어요 이제 프로그램에서 구조를 생성하고 싶다면 어떻게
하는지 아시죠?
다음 강의에서 몇 가지 문제를 내어
구조에 관한 모든 것을 알려드리고자 해요
고마워요