목록2024/03 (32)
Minwoo Dev.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/0yhJL/btsGdZGJsBN/EmZpJLELF2JW0TSe42Vpf0/img.png)
이전 코드를 바탕으로 노드를 삭제하는 함수를 작성하겠다. 고려해야 할 사항은 아래와 같다. 원래 노드가 빈 노드인 경우 삭제해야할 값이 첫번째 노드인 경우 삭제해야할 값이 중간에 있는 노드인 경우 삭제해야할 값이 마지막 노드인 경우 void deleteNode(Node **head, int data) { if (*head == NULL) // 원래 노드가 빈 노드인 경우(삭제할 값이 없음) { printf("빈 연결리스트입니다. \n"); return; } Node *cur = *head; if (cur->data == data) // 첫 노드가 삭제할 노드인 경우 { *head = cur->link; // head 노드를 한칸 옮김(노드 삭제) free(cur); // 할당 해제 return; } No..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cebLPy/btsGdQ4beLs/nwo8mJ5FYLDOZwKk6Xi0D0/img.png)
단일 연결리스트를 사용하기 위해 우선 구조체를 정의해준다. typedef struct _node { int data; struct _node *link; } Node; 그리고 값을 입력하면 그 값을 연결리스트에 넣어주는 함수를 작성하겠다. 함수는 아래의 경우로 나눠질 것이다. 연결리스트에 아무 값도 들어있지 않은 상태(NULL 상태) 연결리스트에 값이 들어있는 상태 위 조건을 참고하여 AddNode함수를 작성해보겠다. void AddNode(Node **head, int val) // main에서 head를 가져오므로 더블포인터(**) 사용! { Node *newnode = (Node *)malloc(sizeof(Node)); // 새로운 노드 생성! newnode->data = val; // 값 넣기 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ctJRpb/btsGcMHYkFP/DJinl4brzDL2v2fkokLT80/img.webp)
연결 리스트(Linked List) 연결 리스트는 data와 link로 이루어진 여러 개의 묶음이 이어져있는 형태이다. 연결리스트를 사용하기 위해, C언어 기준으로 우리는 구조체를 사용한다. typedef struct _node { int data; // 데이터를 저장하는 변수 struct _node *link; // 다음 노드를 가리킬 링크 } Node; 기본적으로 위의 형태와 같이 작성한다. data는 사용자의 필요에 따라 int형 값이 아닌 다른 변수형으로 선언해도 무방하다. 그리고 다음 노드와의 연결을 위한 link 가 필요한데, 이 link는 우리가 선언한 구조체를 그대로 자료형으로 사용하여 포인터 형식으로 선언한다. 말 그대로 다음 노드를 "가리키는" 것이 목적이기 때문에 포인터 변수로 선언한..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bqubxE/btsF6JQccye/lgdgFO3Kw66pXfoExqKQs1/img.png)
문제 더미 노드의 유무에 따른 코드의 변화를 직접 경험하는 것은 코드의 이해력을 높이는 데 도움이 된다. 그래서 LinkedRead.c에서 생성하는 연결 리스트에 더미 노드를 추가하고, 그에 따른 코드의 변화를 직접 확인하기로 하겠다. 이 예제는 리스트의 끝에다가 노드를 추가하는 방식이므로 head 와 tail 이 모두 필요하다. 조건에 맞게 코드를 수정하라. LinkedRead.c #include #include typedef struct _node { int data; struct _node *next; } Node; int main(void) { Node *head = NULL; Node *tail = NULL; Node *cur = NULL; Node *newNode = NULL; int read..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dxHiwD/btsF3oTv5Wl/BBlTwpIucOfTf14AiryHa1/img.png)
문제 예제 LinkedRead.c 에 익숙해지는 가장 빠르고도 흥미로운 길은 예제를 조금 수정해 보는 것이다. 따라서 예제를 조금 수정해 볼 기회를 제공하고자 한다. 예제 수정을 위한 주제는 다음과 같다. 새 노드를 연결 리스트의 꼬리가 아닌 머리에 추가한다. LinkedRead.c #include #include typedef struct _node { int data; struct _node *next; } Node; int main(void) { Node *head = NULL; Node *tail = NULL; Node *cur = NULL; Node *newNode = NULL; int readData; while (1) { printf("자연수 입력 : "); scanf("%d", &readD..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/1VrIK/btsF2OkEHbG/wgnFB5tdpOggb1fCBsFqq1/img.png)
this C++에서 this는 해당 객체 자체를 참조하는 포인터이다. 객체 내에서 본인이 가지고 있는 멤버변수나 멤버 함수에 접근하기 위하여 this를 많이 사용한다. #include using namespace std; class Score { private: int schoolNum; int score; public: Score(int schoolNum, int score) { this->schoolNum = schoolNum; // this 사용!! this->score = score; // this 사용!! } void showInfo() { cout score = score; } void showInfo() { cout
객체 포인터 배열 클래스를 이용하여 객체를 생성할 때, 배열의 형태로도 생성할 수 있다. MyClass myclass[4]; // MyClass라는 클래스로 생성한 객체 배열 myclass 위처럼 MyClass 클래스를 이용하여 myclass라는 객체를 배열의 형태로 생성할 수 있다. 예제 코드를 보자. #include #include using namespace std; class MyFamily { private: char *name; int age; public: MyFamily(char *_name, int _age) // 생성자 { name = _name; age = _age; } MyFamily() // 생성자 { name = NULL; age = 0; } void ShowInfo() { cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/clLX9M/btsF3CYceuc/UrVUslnLktfICFQT7fa7Sk/img.png)
소멸자(Destructor) 생성자가 객체의 생성과 함께 호출되는 것이었다면 소멸자는 객체의 소멸과 함께 호출되는 함수이다. 생성자의 이름이 클래스의 이름과 같아야 했던 것과 똑같이, 소멸자의 이름도 클래스의 이름과 동일해야 한다. 다른 점이라면 앞에"~" 가 붙는다는 것이다. ~클래스이름(){ 객체가 소멸될 때 실행할 코드 } ~생성자 이름() 과 같은 형식으로 소멸자를 선언한다. #include using namespace std; class Myclass { private: char *name; int score = 0; public: Myclass(char *username, int _score) { int len = strlen(username) + 1; name = new char[len]; ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/boc6B2/btsF3oFGHcg/V1akMC6kkKasBiuxEHaWU0/img.png)
this 객체지향 프로그래밍을 할 때, 클래스 내부의 메서드에서 내부변수에 접근할 때 사용한다. package test; public class classEx { int num; void addNum(int num) { num += num; } void showNum(){ System.out.println("num = "+num); } } 위와 같이 클래스 내부에 num이라는 내부변수가 존재하는데, addNum이라는 메서드에서 매개변수로 받아온 num을 내부변수의 num에 저장하고 싶다. 두 변수의 이름이 같다. 따라서 그냥 위처럼 작성하고 실행한다면 package test; public class classMain { public static void main(String[] args) { classE..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bb38rg/btsF2SfWhxA/tFC4Fxm64K7HtJKUQyNB2k/img.png)
Java 는 기본적으로 객체지향 프로그래밍 언어이다. 객체지향 프로그래밍(OOP, Object-Oriented Programming) 클래스라는 묶음 안에 해당 프로그램의 속성(변수)와 기능(함수)를 넣어두고 사용하는 프로그래밍 방식이다. 강아지라는 동물에 대해서 특징을 생각해 보자. 속성, 즉 수치로 나타낼 수 있는 값은 키, 배고픈 정도, 이름 등등이 있을 것이고, 할 수 있는 행동(기능)은 짖기, 소개하기, 밥달라하기가 있을 것이다. 아래 코드를 보자, 우리가 기본적으로 사용하는 방식인 절차지향 프로그래밍이다. package test; public class DogWithoutOop { public static void main(String[] args) { int height = 50; Strin..