회고록 블로그

[자료구조] 네이버 부스트코스 '자바로 구현하고 배우는 자료구조' 공부 필기 (5) 본문

3. Computer Science 공부/자료구조

[자료구조] 네이버 부스트코스 '자바로 구현하고 배우는 자료구조' 공부 필기 (5)

김간장 2021. 11. 30. 22:43

시간날때마다 자료구조 강의를 청강하려고 노력중..2

 

 

출처 강의 : '자바로 구현하고 배우는 자료구조', Rob Edwards, https://www.boostcourse.org/cs204/joinLectures/145114

 

자바로 구현하고 배우는 자료구조

부스트코스 무료 강의

www.boostcourse.org

 

※ 강의 들으며, 개인적으로 필요한 내용만 필기함

 

 

※ 본 글은 강의 내용을 여러번 청강하고 혼자 깨달음을 얻으며 필기한 글임

※ 강의 자체는 너무 명강의이고 교수님도 명강사이지만,

      필자의 이해력이 부족해서(ㅜㅜ) 맞지 않는 사실이 존재할 수 있음 + 교수님의 설명(혹은 의도)과 다른 내용이 있을 수 있음..


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;;
    }
}

 

Comments