자료구조를 공부하기에 앞서, 자료구조가 무엇이며 왜 공부해야되는지 알아보자
1. 자료구조란?
자료구조가 무엇인지 정의하기 위해서는 자료형부터 정리해야된다.
추상적 자료형이란, 어떤 자료와 그 자료에 대한 연산(동작)들의 개념적인 정의를 의미한다.
단어에서 알 수 있듯이, 추상적이므로 그 정의를 구현하는 방법은 명시되어 있지 않다.
자료형이란, 어떤 자료가 식별될 수 있는 방법과, 그 자료에 대한 여러 가지 연산(동작)을 제공한다.
ex)
자료형 없이 65라는 자료만으로 컴퓨터는 수 65를 나타내는지 알파벳 A를 나타내는지 해석할 수 없다.
자료형이 주어질 경우, 자료의 해석이 가능해지며 이 자료에 대한 접근과 연산이 가능해진다.
이처럼, 자료형은 추상적 자료형과는 달리
어떤 자료가 식별되는 방법을 정의하고 자료에 적용할 수 있는 연산을 결정한다.
수 많은 자료들이 존재하고, 그 많은 자료들에게 맞는 정의와 연산을 제공해야된다.
그러기 위해서는 추상적 자료형을 구체적으로 구현하여 자료를 저장하는 방법과 자료에 적용할 수 있는 연산을 구체적으로 제공해야되는데, 그것이 자료구조이다.
2. 자료구조 왜 배워
왜 배우냐.. 그거슨
이 세상엔 수 많은 자료가 있다.
각각 자료에 맞는 자료구조 형태에 따라서 장단점이 존재하며,
특정 알고리즘을 구현하기 위해 적절한 자료구조를 사용해야 더 효율적이고 좋은 성능의 프로그램을 만들 수 있기 때문이다.
3. 클래스
클래스는 자료구조 과목에 포함되지 않는다.
하지만, 여러 가지 자료구조를 구현하는데 있어서 클래스가 사용되므로 간단하게만 다루어보도록 하겠다.
클래스는 꼭 필요한가? ==> NO!
클래스가 굳이 없어도 프로그램을 충분히 만들 수 있다.하지만, 클래스를 사용함으로써 코드가 더 간결해지고 수정 & 상속이 용이하게 되기 때문에 클래스를 사용한다. 개발을 함에 있어서 계산기만 만들 것도 아니고.. 복잡한 프로그램들도 많이 만들어야되는데, 이 때 클래스의 사용이 엄청난 역할을 한다.
클래스- 빵을 찍어내는 틀
객체 - 클래스(틀)로 만든 빵
인스턴스- 객체와 인스턴스는 동일 but, 인스턴스는 어떤 클래스의 객체인지를 표현할 때 쓰인다.
==> 빵 자체는 객체 / 카스테라(객체)는 카스테라 틀(클래스)의 인스턴스
클래스의 사용법
class Cookie: #클래스 정의
pass
a=Cookie() #클래스로 만들어진 객체
b=Cookie()
이런 식으로 클래스를 함수처럼 정의해주고 객체를 만들어서 쓰면 된다.
조금 더 구체적으로 다루어보자.
예를 들어 계산기 클래스를 만들어 보겠다.
class FourCal:
def__init__(self, first, second):
self.first=first
self.second = second
'''
위에 생성자를 작성하였으므로 굳이 구현할 필요가 없다
def setdata(self, first, second):
self.first = first #함수의 매개변수를 값으로 넣음
self.second = second
'''
def add(self):
result = self.first + self.second
return result
def sub(self):
result = self.first - self.second
return result
def mul(self):
result = self.first * self.second
return result
def div(self):
result = self.first / self.second
return result
완성본이긴한데 아직 클래스가 편하지 않으니 코드를 하나하나 떼서 살펴보도록 하자.

첫 번째로 살펴볼 것은 생성자이다.
def__init__(self, first, second):
self.first=first
self.second = second
만약, 이 코드가 없었다면 어떤 일이 발생할까?
이 코드가 없는 상태의 계산기 클래스를 생각해보자
a = FourCal() #계산기 클래스로 찍어낸 객체 a
a.add()
위 코드를 실행시키면 오류가 발생하게 된다.
인스턴스 a에 setdata() 메서드를 수행하지 않고 add 메서드를 수행한다면 first와 second가 아예 없으니 당연히 오류가 발생한다.
__init__없이 쓰려면 add 메서드를 수행하기 전에 setdata 메서드를 통해서
first와 second의 초기값을 설정해주어야한다.
이렇게 초깃값을 설정해야 할 필요가 있을 때는 직접 일일이 setdata 메서드를 호출하기보다는
클래스에 생성자를 구현하는게 더 안전한 방법이다.
생성자란, 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.
a=Fourcal(2,4)를 하면, 자동으로 __init__생성자가 호출되어 first와 second를 각각 2와 4로 초기화해준다.
두 번째로 살펴볼 것은, 메서드들의 매개변수이다.
평소에 함수를 만들 때와 달리 메서드의 첫 번째 매개변수로 self가 온다는 점이 익숙하지 않을 것이다.
여기서 self는 무엇일까?
메서드에는 총 3개의 매개변수가 필요한데 막상 메서드를 호출할 때는 2개의 매개변수만 전달한다.
a.setdata(2,4)처럼..
여기서 self는, setdata를 호출한 객체 a가 자동으로 전달된다.
즉, self.first = first가 ==> a.first = first가 되는 것이다.
굳이 매개변수의 이름으로 self를 사용할 필요는 없지만 관례적으로 self를 사용한다.
클래스를 사용하면 얻는 장점 중 하나가 클래스의 상속을 활용하여 코드를 구현할 수 있다는 점이다.
여기서 상속이란, 말 그대로 물려받는다는 의미이다.
클래스를 생성할 때 다른 클래스의 기능을 물려받을 수 있다.
예를 들면, 앞서 구현한 계산기 클래스를 상속받는 또 다른 클래스를 구현해보자.
class MoreFourCal(FourCal):
pass
이처럼, class 클래스 이름(상속할 클래스 이름) 방식으로 클래스의 상속을 받아 클래스를 생성할 수 있다.
위에서 새롭게 작성한 MoreFourCal 클래스는 FourCal 클래스를 상속했으므로 FourCal의 모든 기능들을
사용할 수 있다.
그 기능들을 수정할수도 있는데, 이를 클래스 오버라이딩이라고 한다.
'자료구조' 카테고리의 다른 글
자료구조5 - 트리 (0) | 2022.07.14 |
---|---|
자료구조4- 스택&큐 (0) | 2022.07.13 |
자료구조 문제풀이 - 주문처리 (큐) (0) | 2022.07.13 |
자료구조3 - 연결 리스트 예제 (0) | 2022.07.11 |
자료구조2 - 배열과 연결리스트 (0) | 2022.07.11 |