CS지식/자료구조

TIL 정리_57

ran4 2022. 4. 13. 23:50

generic programming

  • 제네릭 프로그래밍은 다양한 자료형의 객체에 대해 작성한 코드를 재사용한다는 객체 지향 기법이다
  • 제네릭 프로그래밍이 없었다면 int를 String, Person 등 문자열, 원하는 객체로 바꿔야 했을 것이다
  • 제네릭 프로그래밍의 목표는 1가지의 코드만 작성해서 이를 다른 자료형에 대해 재사용할 수 있게 만드는 것이다 


정렬 알고리즘을 ss라고 가정했을 때

public class ss {
public int[] superSort(int[] args) {
...sort...
return array;
}
}

정수가 아닌 문자열에도 이 정렬을 적용하려면 어떻게 해야 할까? 
-> 제네릭 클래스를 이용하여 형변환한다

Person 객체도 똑같은 방식으로 추가해준다

public class ss {
public Person [] superSort(Person [] args) {
...sort...
return array;
}
}

 

타입을 추가할 때마다 코드를 고치는건 비효율적이다
하나의 코드로 계속 사용하기 위해서는 어떻게 하면 좋을까? 
잘 디버깅 된 정렬 알고리즘 하나를 가지고 모든 것을 정렬하는게 좋다

 


제네릭 클래스가 하는 것 : 모든 것을 정렬할 수 있게 만든다


모든 객체는 객체 클래스에 속한다
Person, Student 등등
이들을 배열로 만들어서 다 담으려 한다면 어떤 종류의 배열이 필요할까
-> 객체배열이 필요하다 


객체배열 //제네릭 객체 
Object arr = new Object[10]; //10개의 요소가 들어갈 수 있는 객체 배열
Student s = new Student();
학생에 대한 객체를 만드는데 얼마의 메모리가 필요한지 확인 후 힙에 메모리를 할당한다
필요한 여러 변수를 만들어서 초기화

Student를 객체로 바꾸는 법 
Student -> Object 형변환
Object obj = s;
arr[0]  = obj;

 


상속 
자손 클래스는 부모 클래스의 메서드를 오버라이드 할 수 있다
최고 조상 : Object 
객체 클래스에서 중요한 몇 가지 메서드 (Object)

 

  1. equals 두 객체가 서로 같은지 비교한다
    객체는 주소만 제공하기 때문에 힙에서 메모리 위치를 비교하여 객체를 비교할 수 있다
  2. toString -> 객체의 메모리 위치를 출력 

toString 객체를 출력할 때 우리는 System.out.println(s) 이런 코드를 사용한다 여기서도 객체는 객체 클래스에 대한 정보가 아닌 주소만 존재한다

  3. hashCode 

 


위의 코드에서 Student 객체를 배열에 할당
Student s = (Student) arr[0];
Monkey m = new Monkey();
arr[1] = m;
String s = "chalk & cheese";
arr[2] = s;
위의 코드는 잘 컴파일 된다 모든 것들을 객체 배열로 만들었기 때문이다(형변환 포함)
하지만 잘 짜여진 코드는 아니다
-> 서로 다른 종류의 것들을 모두 섞었기 때문이다 

->매개변수화 타입을 이용해야 한다 

'CS지식 > 자료구조' 카테고리의 다른 글

TIL 정리_59  (0) 2022.04.15
TIL 정리_58  (0) 2022.04.14
TIL 정리_56  (0) 2022.04.12
TIL 정리_51(Queue)  (0) 2022.04.07
TIL 정리_50(Stack)  (0) 2022.04.06