회고록 블로그
[자료구조] 네이버 부스트코스 '자바로 구현하고 배우는 자료구조' 공부 필기 (5) 본문
시간날때마다 자료구조 강의를 청강하려고 노력중..2
출처 강의 : '자바로 구현하고 배우는 자료구조', Rob Edwards, https://www.boostcourse.org/cs204/joinLectures/145114
※ 강의 들으며, 개인적으로 필요한 내용만 필기함
※ 본 글은 강의 내용을 여러번 청강하고 혼자 깨달음을 얻으며 필기한 글임
※ 강의 자체는 너무 명강의이고 교수님도 명강사이지만,
필자의 이해력이 부족해서(ㅜㅜ) 맞지 않는 사실이 존재할 수 있음 + 교수님의 설명(혹은 의도)과 다른 내용이 있을 수 있음..
1. 제네릭 프로그래밍
[개요]
- 같은 함수를 서로 다른 자료형에 사용할 때?
- 데이터 형식에 의존하지 않는 제네릭 프로그래밍을 이해하기
[내용]
- Let's talk about 'Generic Programming'..ㅠ
> 제네릭 프로그래밍
- int형 배열의 자료를 정렬하는 메소드가 있다고 가정하자
public class A {
public int[] superSort(int[] arr) {
...
return arr;
}
- 너무 좋은 메소드여서 문자열(String) 정렬에도 이 메소드를 사용하고 싶다면? 실수형(double) 정렬에도 사용하고 싶다면?
메소드를 추가 작성해야하는걸까?
→ 당연히 '아니다'
→ 왜냐하면, 우리에겐 "제네릭 프로그래밍"이 있기 때문
- Person이라는 객체, Student라는 객체 등 수많은 객체가 있다고 가정하자.
- 이러한 객체를 모두 담는 배열을 만들고 싶다면 어떤 배열을 만들어야할까?
→ 객체 배열을 만들면 됨
→ 아래와 같이 Java 코드로 만들 수 있음
Object[] arr = new Object[5];
- 그리고 그 각각의 배열의 값에는 객체가 들어감 (아래의 코드처럼)
Person p = new Person();
Object obj = p;
arr[0] = obj;
- 여기에 문자열(String) 타입도 넣고 다른 정의한 클래스도 넣는다고 가정하자
Student s = new Student();
arr[1] = s;
String str = "Hi Everyone";
arr[2] = str;
- 이제 이 배열 arr에는 여러 타입/자료형의 객체가 들어있음
- 하지만 그닥 기분좋은(?) 코드는 아님
→ 여러 종류의 객체가 섞여있기 때문
- 그래서 우리는 한가지 방법을 사용할 것임
→ 그 방법은 "매개변수화 타입(Parameterized Types)"이라고 불림
→ 이 타입을 사용하면 특정 종류의 공간에 넣을 내용을 정의할 수 있게 됨
2. 매개변수화 타입(Parameterized Types)
[개요]
- 매개변수화 타입 사용 방법 알아보기
[내용]
- 1에서 우리는 배열을 만들었고 원하는 객체를 넣을 수 있었음
- 하지만 객체 타입을 분리하지 않고 중구난방으로 넣었음
- 간단한 프로그래밍은 이렇게 해도 괜찮지만 우리는 자료구조를 만드는 것이 목적.
→ 자료구조를 만들려면 "컨테이너를 분리"해야함
- 매개변수화 타입은 컨테이너를 정의할 수 있게 해줌
→ 어떤 타입의 내용이 컨테이너에 들어갈 것인지 정의할 수 있음
→ 꺾쇠괄호 <> 를 이용함
- 예시
→ 이 컨테이너에는 Person 객체만 담을 수 있음
MyContainer<Person> = new MyContainer<Person>();
- Person 객체 뿐만 아니라 String(문자열)이나 int(정수) 등 다른 자료형을 컨테이너에 담고 싶다면 위의 코드를 재사용하면 됨
→ 아래 코드는 문자열(String)만 담을 수 있는 코드임
MyContainer<String> = new MyContainer<String>();
- 이렇게 제네릭 프로그래밍과 매개변수화 타입 덕분에 우리는 자료형만 다른 여러개의 클래스/메소드를 만들 필요가 없음
# 참고사항.
이 수업에서 가장 중요하게 다룰 내용은 "컨테이너들 그리고 이를 어떻게 (코드로) 구현하게 될 것인지"임
→ 데이터에 대해서는 중요하게 다루지 않을 것
→ 물론 컨테이너를 설계하고 코드로 구현한 후 검증하는 단계에서
몇 개의 데이터를 입력할 수는 있지만 "데이터" 자체를 다루는게 목표는 아님
- 어쨌든 우리는 Java에게 제네릭 프로그래밍을 사용할 것이고 매개변수화 타입을 사용할 것이라고 알려야함
그리고 그걸 코드로 구현하려면 몇가지 규칙에 따라 코드를 작성해야함
- 첫번째. 클래스와 메소드는 아래와 같이 정의한다
→ 꺾쇠괄호를 이용해서 매개변수화 타입 사용
→ 여기에서 'E'는 "Elements(요소)"의 첫번째 문자로, String형이 될수도 int형이 될수도 어떤 객체(Person 등)가 될 수도 있음
public class LinkedList<E> {
...
public void addFirst(E obj) {
...
// 매개변수 : E
}
public E modifyFirst() {
...
// 반환형 : E
}
}
- 두번째. 'E'를 사용하지 않는 예외적인 경우가 있다
→ 그것은 바로 "생성자"
→ 생성자에서는 예외적으로 'E'를 사용하지 않음
- 그리고 배열은 아래와 같이 구현됨
→ Object 인스턴스를 배열로 만들고 E[]로 형변환해서 storage 참조변수에 저장
E[] storage = (E[]) new Object[size];
→ 참고로 아래와 같이 코드를 작성하면 컴파일이 되지 않는다고함
E[] storage = new Object[size]; // 컴파일 불가
- 위의 규칙들을 준수해서 임의의 자료형을 담을 수 있는 제너릭 노트(추후 배운다고 함)를 만들어보면 아래와 같이 작성할 수 있음
→ 아직 아래의 코드를 이해하지 못해도 괜찮다고함
class Node<E> {
E data;
Node<E> next;
// 생성자
public Node(E obj) {
data = obj;
next = nul;;
}
}
'3. Computer Science 공부 > 자료구조' 카테고리의 다른 글
리스트(list)에 대한 공부_기초 (0) | 2022.03.17 |
---|---|
[자료구조] 네이버 부스트코스 '자바로 구현하고 배우는 자료구조' 공부 필기 (6) (0) | 2021.12.01 |
[자료구조] 네이버 부스트코스 '자바로 구현하고 배우는 자료구조' 공부 필기 (4) (0) | 2021.11.23 |
[자료구조] 네이버 부스트코스 '자바로 구현하고 배우는 자료구조' 공부 필기 (3) (0) | 2021.11.22 |
[자료구조] 네이버 부스트코스 '자바로 구현하고 배우는 자료구조' 공부 필기 (2) (0) | 2021.11.11 |