다시 오신 걸 환영해요
여긴 새로운 구역이에요 이 섹션은 포인터스예요
이 코스에서 가장 중요한 부분일 거예요
이 코스에서 가장 어려운 구간일 거예요 포인터와 C의
개념은 까다로운 개념이에요
하지만 아주 천천히 살펴볼 거예요
강의도 많이 하고 차근차근 진행할 거예요
가장 높은 단계부터 시작해서 점점 더 자세히 살펴볼 거예요
C 언어를 최대한 활용하려면 포인터를 이해해야
해요 아주 중요하죠
맨 위부터 시작해보죠 인다이렉션 개념에 관해 얘기해보죠
본질적으로 포인터와 같은 개념이에요
포인터는 간접이라는 개념과 아주 흡사해요
일상생활에서 간접적으로 말씀하시잖아요 예를 들어 간접이
뭔지 설명하자면 회사에서
신제품을 사야 할 때처럼요
예를 들어 프린터에 넣을 잉크 카트리지를 새로 사야 한다고 해보죠
큰 회사에서 일한다면 새 구매를
하려면 특정 부서를 거쳐야
할 거예요 아마 구매팀으로 갈 거예요
구매 부서에 전화해서 새
카트리지를 주문할 거예요
현지 상점에서 주문하고 싶은 실제
상품을 찾아내는 게 그들의 일이죠
이게 무슨 뜻이냐면 여러분은 해당 항목을 직접 주문하지 않는다는 거죠
남에게 대신 해달라고 하는 거예요
그럼 그들의 전문성과 지식을 통해 누가 해당
제품을 갖고 있는지 알려주고 다시
돌려주죠
그러니까 당신에 대한 건 간접적인 거예요 그냥 가게에 가서 살
수 있는 게 아니에요 구매 부서에 가면 담당
부서에서 알아서 다 처리해 줘요
프로그래밍에서 포인터의 개념과 같아요
프로그래밍 언어에서 인다이렉션은 값 자체 대신 이름이나
컨테이너를 이용해 뭔가를 참조하는 거예요
변수 이름을 써서 상호 작용을 이용하죠
데이터에 접근하기 위해 메모리 주소를 사용하지 않아요
변수 이름을 사용하죠
가장 흔한 형태의 간접화는 메모리 주소를 통해 어떤 값을
조작하는 거예요
그러니까 변수 이름으로 메모리
주소를 나타내는 인다이렉션에 대한 아주 간략한 설명 외에도 그
주소 자체를 이용해 메모리 주소로 값을 조작하는 거죠
주소요
포인터는 간접적인 수단으로 특정 데이터 항목의 값에 접근하죠
값이 메모리 주소인 변수죠 이걸 이해하는
게 중요해요
지금까지 배운 바로는 특정 유형의 데이터와
숫자, 문자, 두 배 부동
소수점 숫자가 포함돼 있어요
이번에는 어떤 데이터도 저장하지
않는 변수를 사용할 거에요.
데이터 저장소 유형은 메모리 주소예요
메모리 주소는 정수로 나타납니다 16진수죠
하지만 여전히 메모리
주소예요
주소의 값이 되고 메모리의
다른 위치가 됩니다 기존 변수이거나 동적으로
할당하는 새로운 위치라면요
새 카트리지를 구매할 때는 구매부를 거쳐야
하는 이유가 있듯이 카트리지를
특정 상점에서 주문할 필요가 없어요
포인터와 C#을 사용하는 게 합리적인 이유도
있어요 주소, 메모리 주소를 나타내는 변수를 사용해서요
코스 맨 처음에 메모리 주소 얘길 했었죠
프로그램을 실행할 때마다 변수가 메모리에 저장되죠
그 메모리에 특정 주소가 있어요 데이터를 되찾으려면 주소를 알아야
해요 어디로 운전해서 갈 때나 위치 주소를 알 때 집 주소를 알아야 하는
것처럼요
여러분 프로그램에서 포인터를 사용하는 건 C 언어에서 사용 가능한 가장 강력한 도구 중 하나죠
그래서 이해하는 게 중요해요
실질적인 C# 프로그램은 모두 포인터를 사용해요
이 개념을 이해해야 해요
프로그래머들은 자바나 C#과 같은 현대적인 언어를
프로그래밍해 놓았기 때문에 이와 관련해서
걱정할 필요가 없습니다 메모리
할당이나 포인터와 관련된 문제가 없기
때문이죠
비록 지하에 있지만 자바는
참조의 복사본을 갖고 있어서 포인터를 사용하죠
같은 개념이에요 하지만 c에서는 주소를 나타내는
변수를 명시적으로 갖게 되죠
포인터는 C 언어에서 가장 헷갈리는 개념 중 하나죠
남용되는 경향이 있고 완전히
이해되지 않는 경향이 있죠 특히 새 프로그래머들이요
따라서 초기에 이 개념을 파악하는 게 중요해요
갈수록 고급 C#과 고급 포인터 개념으로
들어갈수록 무슨 일이 벌어지는지를요
만약 처음에 이것을 이해하지 못했다면 공부하고,
공부하고, 포인터로 코드 작성하는 것을 연습하세요.
컴파일러는 변수에 저장된 데이터의
유형을 알아야 하죠 이건 정규 변수와 같아요
포인터를 생성할 때 데이터 타입을 명시해야 하죠
컴파일러가 이걸 알아야 하는 이유는 변수에 대한 이유와 같습니다 데이터를
가리키고 있다고 해도 얼마나 많은 데이터를 할당할지 알아야 하죠
모든 포인터는 특정 변수 유형과 연관이 있어요
해당 형식의 변수를 가리키는 데만 사용될 수 있죠
포인터 정의에 관해 얘기할 때 이것의 예제를 보여드릴게요
예를 들어 형식 포인터의 포인터는
형식 int의 변수만 가리킬 수 있죠
변수는 주소 값을 갖고
있어요 그게 포인터죠
그 주소는 메모리 어딘가에 값이 있을 수 있어요
부동 소수점 수에 대한 형식 포인터는 형식 부동 소수점 수 변수만 가리킬 수 있죠
여기 포인터라는 개념을
제시하는 그림이 있어요
구문은 신경 쓰지 마세요
이전 강의에서 간단히 다뤘듯이 & 별표는 신경
쓸 필요가 없어요 여기서 주목해야 할
건 포인터가 주소를 갖는 방법입니다 그 주소는 값을
포함하지만 메모리 어딘가에 있을 수 있죠
이 예제에선 정규 숫자를 생성하는데 백만
번은 만들었죠 그럼 별표가 붙은 이 구문이 나옵니다 포인터라는
걸 의미하죠 나중에 자세히 살펴볼게요
&는 주소라는 표시이기도 하죠
이 예제에서 type int p number 포인터를 생성하면
주소를 할당하는 거죠 포인터는 주소만 저장하니까요
메모리에 어떻게 배치되느냐면
변수 네임 넘버가 있고
넘버 값은 99죠
메모리에 주소도 있어요
메모리의 주소가 포인터의 값이에요
p 번호는 주소 1008을 가리키는 포인터예요
1008의 값은 99이고 변수 번호도
포함하고 있어요
결국 이렇게 되는군요 이게 명확하지 않다면 이걸 한 시간
동안 보면서 확실히 이해해야 해요
포인터는 주소에 대한 값을 갖고 있어요
그걸 저장하죠
그런 다음 특정 구문을 이용해 해당 주소의 값에 액세스할 수 있어요
그럼 왜 포인터를 사용할까요? 왜 이 개념을 끌어오죠? 이미 존재하는
데이터 타입을 사용하면 안 되나요?
문자열을 사용하고 싶을 때 문자열을 사용하면 안 되나요?
변수만으로 데이터에 접근하는 건 너무 제한적이에요
포인터로 어떤 위치에도 접근할 수 있고 메모리의 어떤
위치도 변수로 다룰 수 있습니다. 포인터로 연산도
수행할 수 있어서 더 쉽고요.
C에서 포인터는 배열과 문자열을 더 쉽게 사용하게
해줘요 이 부분도 다룰 텐데 포인터를 사용할 때의 또 다른 이점이죠
포인터는 같은 공간과 메모리를 여러 곳에서 참조하게 해주죠
한 장소에서 메모리를 업데이트하면
프로그램의 다른 곳에서 변화를 볼 수 있어요
전역 데이터를 사용하지만 함수 안에 캡슐화된 방법이죠
데이터 구조의 구성 요소를 공유함으로써 메모리 공간도 많이
절약할 수 있어요
C가 발명됐을 때는 1970년대였다는 걸 기억하세요
C는 아주 효율적이고 수준이 낮아야 해요
포인터를 통해 메모리에 직접 접근하는
건 아주 효율적이고
빠르죠
포인터는 전달되는 데이터를 변수로 수정하는 함수도
제공하죠 참조에 의해서요 이 문제에 대해 강의를 할 거예요
여기서 포인터를 이용해 함수에 인수를 넘길 수 있어요
그 함수 안에서 데이터를 변경하면
그 함수 바깥에 반영될 거예요
더 이상 글로벌 데이터를 사용하지 않아도 되죠
함수 안의 데이터를 사용하고 데이터를
포인터로 전달하고 함수 밖의 데이터는
할당되죠 따라서 모든 게 밀접하게
연결된 전역 변수를 사용하는 단점은 없어요
데이터를 알아야 하는 함수만 데이터로 제한할 수 있죠
말씀드린 것처럼 프로그램을 최적화해 더 빨리 실행하고
메모리는 덜 쓰게 할 수 있습니다
중요한 개념이죠 특히
실시간 프로그램에서요
포인터는 함수로부터 다양한 값을 가져오게 해주죠
데이터 함수를 전달하는 함수에 대해 얘기했죠
데이터를 리턴하는 방법도 다뤘죠
함수에서 한 가지 값만 반환할 수 있죠
하지만 포인터를 사용하면 함수에서 여러 개의 값을 반환할 수 있어요
그 얘길 할 거예요 큰 이점이죠
동적 메모리 할당도 다룰 텐데요
프로그램을 위한 메모리를 생성하는 것은 컴파일러에 의해
암묵적으로 이루어집니다 변수를 선언했을 때요
int 변수를 선언하면 자동으로 4 바이트를 생성합니다 예를 들어서요
배열을 사용할 때 배열의 크기를 지정할
때 그 크기는 컴파일 때 할당돼요
그것보다 더 많은 데이터를 저장하려 한다면 망하는 거죠 프로그램이
작동하지 않을 거예요
하지만 런타임에 필요한 만큼
메모리를 생성할 능력이 있다면 그건
엄청난 거죠 포인터는 이걸 가능하게 하죠
런타임 동적, 메모리 할당 때 메모리를 생성할 수 있죠
이 얘기도 할 거예요
더 복잡한 데이터 구조를 설계하고 개발할 수 있죠
데이터 구조는 데이터를 저장하는 거예요
데이터 구조의 예는 큐를 쌓거나 링크된 목록이죠
포인터를 사용하면 훨씬 쉽게 만들 수 있어요
포인터는 직접 메모리 접근을 제공합니다 효율적이고 빠르죠
포인터는 중요한 개념이 될 거예요 조언에 관한 강의를 많이 할 거예요
제가 이 모든 개념에 관해 얘기할 때 집중해주시기 바랍니다 C# 프로그래밍
언어를 이해하는 데 중요하고 필수적인 것들이니까요
행운을 빌고 시작할게요 고마워요