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

은혜님의 프로필 이미지

작성한 질문수

그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)

연결리스트 - 구현

insertAt() for문 질문있습니다.

작성

·

450

1

안녕하세요. 질문 두 가지가 있습니다. 프로그래밍 입문자이며 언어를 배운 적이 없는 상태입니다.

 

연결리스트 - 구현 강의 중 insertAt()의 for문 입력 후 왜 currentNode = currentNode.next를 입력해주는 건가요? currentNode 가 currentNode.next를 가리켜 둘은 연결되어 있다는 것을 가리키기 위함인가요? 이 코드 한 줄을 입력 안 할 경우 어떤 문제가 생기나요?

그리고 10분 26초 쯤에

currentNode(7)가 새로운 노드를 가리키면 된다고 설명하는데 왜 코드는

 

currentNode = newNode 가 아니라

currentNode.next = newNode

 

인 건가요?

후자가 될 경우 currentNode.next인 (9)가 newNode를 가리키게 되는 거 아닌가요?

 

감사합니다.

답변 3

1

은혜님의 프로필 이미지
은혜
질문자

currentNode = currentNode.next로 어떤 식으로 반복되어야 할지 반복의 형태를 정의해주는 거군요! 이해가 되었습니다. 두번째도 이해가 되었습니다. 더 궁금한 건 말씀대로 실행해보면서 해결해보고 그래도 궁금증 해소가 안 되면 더 질문해보겠습니다. 감사합니다 영상 잘 보겠습니다 ㅎㅎ

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

막히는게 있으시면 언제든지 질문주세요~ ㅎㅎ

응원하겠습니다 파이팅!!👍

1

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

안녕하세요 은혜님!

언어를 배우지 않으셔서 익숙하지 않으신가보군요.

질문에 답변드리겠습니다.

 

먼저 for문 안에서 current Node = current Node.next를 해주는 이유부터 설명드리겠습니다.

만약 1,2,3,4,5로 순서대로 연결되어있다면 1의 next는 2를 가르키고 있을겁니다.

여기서 currentNode가 1을 가리키고 있다면 currentNode.next는 어디를 가리킬까요?

2를 가리키고 있습니다.

마찬가지로 currentNode가 2를 가리키고 있다면 currentNode.next는 3을 가리킵니다.

질문하신 for문은 원하는 인덱스만큼 currentNode를 오른쪽으로 이동하는 역할을합니다.

currentNode = currentNode.next로 현재노드 = 현재노드의 다음노드로 설정해 오른쪽으로 한 칸 이동하는 것입니다. 만약 for문을 2번 실행했다면 currentNode가 오른쪽으로 두 번 이동하겠죠?

만약 이 코드를 적어주지 않는다면 새로 삽입하는 코드는 항상 1번째 인덱스에 삽입되고 말겁니다.

 

 

두 번째 질문으로 currentNode가 새로운 노드를 가리키는 질문을 해주셨습니다.

여기서 currentNode가 새로운 노드를 가리킨다는 것은 currentNode의 다음을 newNode로 가리킨다는 뜻입니다. 즉 currentNode.next를 newNode로 가리킨다는 것이죠.

만약 currentNode = newNode로 코드를 바꾼다면 7과 newNode는 연결이 되지 않게됩니다.

그래서 1-4-7과 data-9로 두 영역이 나눠지게 됩니다.

코딩을 하다가 궁금증이 생길 때 해당 코드를 바꿔가면서 실행해보는 건 아주 도움이 됩니다.

궁금증이 해결되셨나요?😊

0

은혜님의 프로필 이미지
은혜
질문자

안녕하세요. 제가 제대로 이해했는지 궁금해서 다시 찾아왔습니다!

 

class Node를 선언해주는 것은 결국 class LinkedList에 필요할 new Node들을 위한 node 정의, 즉 초기 설정을 위한 것이 맞나요?

왜냐하면 class Node에서 노드들이 이미 연결이 되어 있는데 왜 또 LinkedList의 insertAt() 함수를 이용해서 또 하나하나씩 삽입하나 의문이 들었거든요. 그래서 이것저것 없애보면서 낸 결론이 위 문단인데 맞을까요?

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

안녕하세요 은혜님!
class에 대해서 궁금증이 있으셨나보군요?

Node 클래스와 LinkedList 클래스를 나눈 이유는 간단합니다.
Node 클래스는 노드 자체를 나타내기 위한 클래스입니다.
연결 리스트에는 수많은 노드가 들어가기 때문이죠.
마찬가지로 LinkedList 클래스는 많은 Node 클래스를 다루기 위한 클래스입니다.
Node 클래스를 선언해준 이유는 말씀하신 것처럼 초기 설정을 위한 이유도 있지만 가장 큰 이유는 LinkedList 클래스와 독립적으로 존재하기 위한 것입니다.

Node 클래스로 생성된 인스턴스(클래스로 생성된 오브젝트)들은 그 자체로 기능은 없습니다.
Node 클래스는 데이터 성격에 가깝습니다.
따라서 Node 인스턴스들은 자기들끼리 연결할 수 있는 기능이 없습니다.

반면 LinkedList 클래스는 여러 Node 인스턴스를 연결하고 연결을 끊는 기능을 담당하는 클래스입니다.
왜냐하면 class Node에서 노드들이 이미 연결이 되어 있는데 왜 또 LinkedList의 insertAt() 함수를 이용해서 또 하나하나씩 삽입하나 의문이 들었거든요.

위에서 언급하신 class Node에서 노드들이 이미 연결이 되어 있다고 하신 것은 클래스와 인스턴스에 대해서 조금 잘못 알고 계신 것으로 보입니다.

let node1 = new Node(1);
let node2 = new Node(2);
let node3 = new Node(3);

만약 위 코드처럼 노드 인스턴스가 3개 생성되었다면 이들은 서로 연결되어있지 않습니다.
각각 다른 데이터로 존재하고 있습니다.
각각 존재하는 데이터들을 LinkedList가 insertAt함수로 서로 연결해줍니다.

이렇게 클래스를 이용해 다른 객체를 구분하여 프로그래밍하는 방법을 객체지향프로그래밍이라고 합니다.
아직 클래스에 익숙하지 않으셔서 혼란이 있으신 것 같습니다.
궁금증이 해결되셨나요? 😊

은혜님의 프로필 이미지

작성한 질문수

질문하기