본문 바로가기
ⓢⓣⓤⓓⓨ/자료구조

[자료구조] 문자열과 포인터, 구조체, 객체와 포인터

by heaven00 2021. 5. 10.
728x90

 

 

 

 

 

사실 학교에서 자료구조 튜터링을 하고 있는데,

뭔가 가르쳐주는 입장에서는 완벽하게 이해를 해야할 것 같아서,

수업도 다시 듣고 복습도 하면서 궁금했던 부분을 다시 찾아보고 공부하는 중이다.

그런데 열심히 자료조사도하고 피피티도 만들었는데, 한시간 반 수업하고 끝내기에는 (내 기준) 너무 아쉬워서 

티스토리에도 열심히 정리를 해보려고 한다.

 

( 우리 튜티들 만약 이 글을 보고 있다면 그냥 무시해주세요 ㅠ )

 

그리고 느낀점도 적을 것이다

나중에는 꼭 교수님같은 강의력을 가진 발표력 만렙이 되어있기를 ^^..~

 

 

 

 


문자열과 포인터

 

1. 문자와 문자열

 

문자: 컴퓨터가 기억하거나 송출할 수 있는 숫자나 알파벳 또는 특수 문자를 이르는 말

  - 문자 상수: ‘A‘

  - 문자 변수: char형 변수

 

 

문자열: 연속된 문자들의 모임

  -널 종료 문자열: 끝을 나타내는 널 문자를 함께 저장

  -문자열 상수: “hello world“, “A”

  -문자열 변수: 문자 배열(char 배열)

  -만약, 배열의 6번째에 null을 넣어주면 hello까지 출력( *(ptr + 5) = ‘\0’;)

 

 

 

 

 

2. 문자열 문자배열

 

문자열: char s1[10] = “String”

  – 일반적으로 저장되는 문자의 개수는 배열 크기보다 작음

  – 저장한 문자들 다음에 \0’을 넣어 뒤의 공간과 구분

  – “ ”로 표시, 배열의 특성을 가지나 약간의 예외가 있음

  – 문자열은 문자배열과는 다르나, 배열의 특성은 그대로 가짐

  – 이 경우, string 내에 저장되는 문자의 개수는 보이는 것 보다 1개 더 많음 (즉, 보이는 문자 바로 뒤에 NULL(‘\0’) 문자가 자동 추가)

 

문자배열: s2[10] = {‘S’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’};

 

 

차이점: 문자열 배열은 항상 마지막에 이 문자열을 종료한다는 null값을 넣는데 문자 배열은 넣지 않는다.

 

 

 

3. 문자배열, 정수 배열

 

문자배열: 배열 명을 써주면 한번에 들어있는 정보 모두 출력해줌. (인자 값으로 줄 주소 값이 넘어가기 )

정수 배열: 모든 데이터 출력하고 싶으면 루프 돌며 그 위치에 해당하는 원소 출력 해야함

 

 

 

 

 

4. 문자열 선언

 

  - 문자열 크기: 저장할 문자열의 길이 + 1

  - 저장할 문자열의 길이 +1보다 문자열의 크기가 작으면 오류 발생! => Null이 들어갈 자리가 없기 때문!

 

 

 

 

 

5. 문자배열 초기화

 

-문자열의 끝에 널 문자 저장!

-배열의 나머지 원소도 널 문자로 초기화

ex) char str[10] = “abc”;

 

-배열 크기 생략 가능

ex)  char str[] = “abc”;  //배열크기는 4!

 

-배열 전체 널 문자로 초기화 가능

ex) char str[] = “”;

 

 

 

 

 

 

동적 메모리 할당

1. 동적 메모리 할당 vs 정적 메모리 할당

 

- 동적 메모리 할당

  * 력되는 데이터에 맞게 기억공간을 확보 하는 것 (프로그램 실행 중 결정)

 

  Int num;

  cin>>num;

  int *ptr = new int[num];  // ptrnum개의 원소로 이루어진 배열을 가리킴

 

 

- 정적 메모리 할당

 * 프로그램을 작성하는 단계에서 필요한 기억공간의 크기를 결정하는 것

 

int examples[10];  //examples 배열에는 10개의 원소가 들어갈 수 있다.

 

 

2. 동적 메모리할당 사용 이유

 

- 정적 메모리 할당을 하게 되면, 기억공간이 낭비될 경우가 많다.

(큰 배열을 선언해야 하므로)

 

=> 메모리의 낭비를 최소화 하기 위해 입력되는 데이터에 맞게 기억공간 할당

 

 

 

 

 

 

 

구조체, 객체와 포인터 관계

1. 구조체와 배열

 

- 구조체

 * 타입이 다른 데이터를 하나로 묶는 방법

  Ex) 학생 구조체

      이름: 문자열

      나이: int

      점수: float

 

 

 * 사용 예시

ex1)

struct employ {

  char name[20];

  int year;

  int salary;

} kim, park, jung;

 

 

ex2)

struct employ {

  char name[20];

  int year;

  int salary;

};

struct employ  kim, park, jung;

 

 

- 배열

 * 타입이 같은 데이터를 하나로 묶는 방법

 * 여러 가지 종류의 데이터를 하나로 묶어서 관리

 

 

 

2. 클래스와 객체

 

- 클래스: 공통된 일을 수행하기 위해 모아 놓으면 좋을만한 변수와 함수들을 하나의 모듈로 캡슐화 시킨 사용자 정의 타입

- 객체: 클래스 타입에 의해 생성된 변수들

 

- 클래스와 구조체의 차이?!

=> 차이 없음.. C++에서는 더더욱 없음..!

=> 접근제어 지시자를 선언하지 않았을 경우 클래스는 private, 구조체는 public으로 선언한다.

=> 클래스는 멤버 함수가 들어간다.

 

public: 어디서든 접근 허용

Private: 클래스 내에서만 접근 허용

 

class 코드와 struct 코드를 대조하면서 보면 큰 차이가 없다는 것을 더 쉽게 이해 가능

 

 

 

3. 구조체 멤버 초기화

 

ex1)

struct Employee {

      char id[20];

      int age;

     double wage;

};

struct employ  kim = {“kim”, 2001, 300}, park = {“park”, 2012, 200}  

 

 

ex2)

struct Employee {

      char id[20];

      int age;

     double wage;

} kim = {“kim”, 2001, 300};

 

 

=>멤버의 초기값이 포함되지 않으면 해당 멤버는 기본값으로 초기화 된다.

 

 

 

 

 

4. 구조체 멤버 접근

 

개별 멤버에 접근하기 위해 점 연산자와 화살표 연산자 를 사용하면 된다.

 

kim.name = “kim”;  ptr->name = “kim”;  (*ptr).name = “kim;

kim.year = 2001;  ptr->year = 2001;  (*ptr).year = 2001;

kim.salary = 300;  ptr->salary = 300;  (*ptr).salary = 300;


도트 연산자: 개별 멤버에 접근하기 위해 멤버 선택 연산자(member selection operator: .)  => 이름 자체를 사용

ptr -> name;으로 사용하면, 해당 주소 안의 name 라는 변수에 접근하는 것과 같음 // (*ptr).name도 같은 의미!

 

 

 

 

 

 


위의 내용을 토대로 1차시 수업을 하고, 2차시에는 사전에 과제로 내주었던 코딩테스트 풀이하고, 

튜티들의 발표를 듣고 피드백을 해주었다.

 

질문은 없었지만 질문을 받는 시간을 가졌고, 다음 코딩테스트는 더 어려운걸로 준비해가기로 했다.

 

 

처음하다보니 준비시간은 엄청 길었지만 막상 수업을 해보니 금방 하고 넘어갈 수 있는 내용이었다.

다음에는 더 체계적으로 시뮬레이션까지 해봐야겠다.

 

 

 

728x90

'ⓢⓣⓤⓓⓨ > 자료구조' 카테고리의 다른 글

[자료구조] 큐  (0) 2021.07.05
[자료구조] 스택  (0) 2021.05.24
[자료구조] 연결리스트  (0) 2021.05.20

댓글