알고리즘

[알고리즘👽] 12. 자료구조

머털박사 2022. 9. 15. 10:05

해당 포스팅은 알고리즘 자료구조에 대해 다룹니다. Udemy JavsScript 알고리즘 & 자료구조 마스터 클래스를 공부하며 정리한 내용입니다.

최고의 자료 구조는 무엇일까요?

어떤 공통적인 것들이 자료 구조임을 나타낼 수 있을까요?

배열, 객체등 모두가 공통적으로 가지고 있는 특징은 값(value)들의 모음이라는 것이다.

왜 이렇게 많을까요?

특정 유형의 문제는 특정한 자료 구조가 효율적이기 때문이다. 일부 자료 구조는 매우 특화되어 있다. 배열과 객체와 같이 자주 사용되고 있는 일부 자료 구조들은 매우 일반적이며, 이것이 바로 이들이 무료로 제공되는 이유이기도 하다.

그러나 RB(Red and Black) 트리, 비방향 그래프, 혹은 그와 유사한 자료 구조로 작업해야 할 경우에 이들 자료 구조가 보통 무료로 제공되지 않는다. 때문에 프로그래밍 언어로 직접 구현해야한다.

왜 알아야 할까요?

개발자로서 많은 시간을 보낼 수록 여러분이 이러한 고급 자료 구조 사용을 필요할 가능 성이 더 높아진다. 보통 모든 개발자에게 있어 모든 가능한 문제에 배열을 사용하는 시기가 있다. 하지만 한계에 부딪히게 되고 좀 더 효율적이고 다른 관계를 표현할 무언가를 필요로 하게 된다.

또 대부분 무의식 중에 자료구조를 다루고 있다. 예를 들어 자바스크립트에서 DOM을 사용해 본 경험이 있다면 이미 트리를 조작하거나 상호 작용한 경험이 있다는 뜻이다.

그리고 다른 것보다 중요한 건 면접문제에 나온다😄

ES2015 클래스 구문 개요

Class란?

사전에 정의된 속성 및 메소드를을 이용해 객체를 생성하기 위한 청사진과 같다. 이제 단반향 연결 리스트 혹은 양방향 연결 리스트를 어떻게 생성하는지 알아보도록 하죠.

먼저 양방향 연결 리스트를 위한 패턴을 정의하게 되면 우리가 정의한 클래스 혹으 청사진을 이용해 실제로 많은 개별 연결 리스트 객체들을 인스턴스화 시킬 수 있습니다.이는 자바 스크립트에서의 array와 유사하지만 정확하게 동일하지는 않습니다.

array를 위한 패턴이 존재하며 array는 많은 메소드 및 그것들이 할 수 있는 기능들과 함께 제공됩니다. 그런데 새로운 array가 먼저 인스턴스화되어야 하고 그 후에야 이 모든 것들에 접근할 수 있습니다. 따라서 기술적으로 클래스라고 할 수는 없지만, 어레이가 있고 그 어레이를 일종의 청사진이라고 생각하면 이 청사진에 기반한 객체들을 인스턴스화 할 수 있습니다.

이미 암시되었듯이 자바스크립트는 실제로는 클래스를 지원하지 않습니다. mdn 문서에도 나와있는데요. 주로 자바스크립트에 이미 존재하는 프로토타입 기반 상속자들을 구문적으로 눈속임한 것이라고 표기되어 있는 것을 볼 수 있습니다.

클래스 구문은 새로운 객체 지향 인스턴스 모델 관련해서 자바스크립트에서 소개하고 있지 않습니다. 따라서 기본적으로 자바 스크립트는 진정한 객체 지향인적이 없으며, 단지 프로토타입 기반 상속자 혹은 프로토타이핑으로 불리는 무엇인가를 이용하는 것입니다.

그 모든 것들은 클래스 구문이 처음 소개된 ES2015와 함께 발생하게 됩니다. 하지만 이것이 이면에서 어떻게 이 클래스들이 동작하는지를 변경시키지는 않습니다. 차라리 클래스를 자료 구조로 정의하는 것이 작업하기 쉬운 방법일 수 있습니다.

따라서 만일 객체 지향 프로그래밍 혹은 프로토타입 기반 상속 방식 모두 익숙하지 않다는 것은 어쩌면 말이 안 되는 것일 수 있습니다. 그러나 이 이 모든 것들이 의미하는 바는 자바스크립트는 기술적으로 진정한 객체 지향 프로그래밍을 지원하지 않지만 그 자체가 우리를 방해하지 않는다는 것입니다. 우리는 그냥 알고 있고, 다시 잊어버리면 됩니다

왜 이걸 배워야 할까요?

이미 언급하였듯이, 앞으로 수 많은 자료 구조들이 클래스로 구현하려고 합니다. 따라서 빌드할 때마다 트리나 그래프나 혹은 단방향 연결 리스트등을 빌드해야 합니다. 클래스 정의하고, 개별 리스트을 인스턴스화 시킬 수 있는 자바 스크립트에서 패턴을 정의할 것입니다.

자료 구조: 클래스 키워드

class Student {
    constructor(firstName, lastName) {
        this.firstName = firestName;
        this.lastName = lastName;
    }
}

let student1 = new Student("Colt", "Steele")
let student2 = new Student("Blue", "Steele")

이후에 나오는 모든 코드는 굳이 클래스로 작성할 필요 없다. 단지 코드를 정리하기 위한 좋은 방법일 뿐이다.

그냥 키값들의 쌍들로 구성된 평범한 이전 객체를 사용할 수도 있습니다. 대신 이와 같은 청사진을 생성할 것이며, 따라서 작성되는 코드는 작업하거나 이해하기 쉽고 보기 좋으며 장 정리될 수 있습니다.

인스턴스 생성을 위해서는 “new”라는 키워드를 사용해야 합니다. 이것이 클래스로부터 새로운 객체를 인스턴스화 하는 방식입니다.

자료 구조: instance 메소드 추가하기

인스턴스 메소드, 스태틱 메소드 및 클래스 메소드 등에 대해서 살펴보도록 하겠습니다.

class Student {
    constructor(firstName, lastName, year) {
        this.firstName = firestName;
        this.lastName = lastName;
        this.grade = year;
        this.tardies = 0;
        this.scores = [];
    }
    fullName() {
        return `Your full name is ${this.firstName} ${this.lastName}`;
    }
    markLate() {
        this.tardies += 1
        if(this.tardies >= 3) {
            return "YOU ARE EXPLLED!!!"
        }
        return `${this.firstName} ${this.lastName} has been late ${this.tardies} times`
    }
    addScore(score){
        this.scores.push(score);
        return this.scores;
    }
}

let student1 = new Student("Colt", "Steele", 1);

firstStudent.fullName(); // "Your full name is Colt Steele"
firstStudent.markLate(); // "Colt Steele has been late 3 times"
firstStudent.addScore(92); // [92] 
firstStudent.addScore(87); // [92, 87]

인스턴스 메소드는 특정 인스턴스에 내장되어 있다기 보단 특정한 단일 인스턴스. 이 경우 “Student”에 적용되는 기능을 제공한다고 할 수 있다. 단방향 연결 리스트를 살펴 볼 때는 특정 인스턴스에 다수의 인스턴스 메소드를 정의해 보도록 하겠습니다.

자료 구조: class 메소드 추가하기

클래스 메소드, 즉 클래스 생성, 패턴 정의, 컨스트럭터 메소드 작성에 대해 다룹니다.

class Student {
    constructor(firstName, lastName) {
        this.firstName = firestName;
        this.lastName = lastName;
    }
    fullName() {
        return `Your full name is ${this.firstName} ${this.lastName}`
    }

    static enrollStudents(...students){
        // maybe send an emai here        
    }
}

let student1 = new Student("Colt", "Steele")
let student2 = new Student("Blue", "Steele")

Student.enrollStudents([student1, student2])

이 메소드는 메소드 정의 앞부분에 static 키워드를 사용하게 됩니다. 이 static 키워드는 클래스에 종속되는 반면 클래스의 개별 인스턴스 메소드에는 반드시 종속적일 필요가 없는 메소드 혹은 기능들을 생성하도록 해줍니다.

사실 이 메소드는 많이 사용되지 않습니다. 이 강의 전반에 걸쳐 가장 많이 사용하는 것은 자료구조와 관련된 인스턴스 메소드이다.

스태틱 키워드는 클래스의 스태틱 메소드를 정의합니다. 스태틱 메소드는 클래스의 인스턴스화 없이도 호출될 수 있으며 클래스 인스터스를 통해서는 호출될 수 없습니다. 이들은 어플리케이션을 위한 유틸리티 기능을 생성하기 위해 자주 사용됩니다.
-mdn-

this 키워드

조금 특이하게 동작하는 키워드. 정상적이지 않고 그때그때 동작 방식이 다르다. class 안의 this는 개별 클래스로부터 생성된 객체, 즉 실제 인스턴스를 참조한다.