-
자바 100제 Part.4 / 8 ~ 13개발자 수업/인터넷 강의 2021. 9. 27. 17:16
1. 제네릭(Generic)의 개념과 필요성에 대해 코드로 설명
class Sample{ //Field private Object obj; //Constructor Sample(Object x){ this.obj = x; } //Method public Object getObj(){ return obj; } void printInfo(){ System.out.println(obj.getClass().getName()); // 객체가 속하는 클래스의 정보를 출력하는 메서드 } } public class Java100_collection_Generic1{ public static void main(String[] args){ // 객체 생성 -> 문자열 Sample s1 = new Sample("안녕하세요"); System.out.println(s1.getObj()); s1.printInfo(); // 객체 생성 -> 숫자 Sample s2 = new Sample(100); System.out.println(s2.getObj()); s2.printInfo(); // 객체 생성 -> Object Sample s3 = new Sample(new Object()); System.out.println(s3.getObj()); s3.printInfo(); // 위와 같이 사용 시 단점 // s1 문자열 String str = (String)s1.getObj(); // 형 변환 System.out.println(str.length()); // 6 // s2 숫자 // Object num = s2.getObj(); // 형 변환 // System.out.println((int)num + 100); // 200 int num = (int)s2.getObj(); System.out.println(num+100); // 200 } }
2. 컴파일 단계에서는 에러가 안 나고, 실행 단계에서 ClassCast 오류가 발생하는 상황 만들기
class Person{ //Field public Object obj; //Constructor Person(Object obj){ this.obj = obj; } } class Student{ //Field public int grade; //Constructor Student(int grade){ this.grade = grade; } } class Teacher{} public class Java100_collectiong_Generic2{ public static void main(String[] args){ // 객체 생성 Preson p1 = new Person(new Student(1)); // 형 변환 -> Cast Teacher t1 = (Teacher)p1.obj; // 컴파일 단계에서는 에러가 안나고 실행하는 단계에서 ClassCast 오류가 남 } }
3. 제네릭 개념과 사용법을 예제 코드로 구현
class Sample<T>{ //Field private T obj; //Constructor Sample(T x){ this.obj=x; } //Method T getObj(){ return obj; } void printInfo(){ System.out.println(obj.getClass().getName()); } } public class Java100_collection_Generic3{ public static void main(String[] args){ // 객체 생성 -> String Sample<String> s1 = new Sample<String>("안녕하세요"); System.out.println(s1.getObj()); s1.printInfo(); // 객체 생성 -> Integer Sample<Integer> s2 = new Sample<Integer>(100); System.out.println(s2.getObj()); s2.printInfo(); // 형 변환 없이 사용하기 //string str = s1.getObj(); //System.out.println(str.length()); // 6 System.out.println(s1.getObj().length()); // 6 System.out.println(s2.getObj()+100); // 200 } }
4. 컬렉션(Collection) 프레임워크란 무엇인지 개념 설명
[0] 컬렉션 사전 학습
선수학습 -> OOP, 추상 클래스, 상속, 인터페이스, 제네릭 등에 대한 학습이 안되어 있으면 컬렉션 공부가 어려움
공부할 양이 제법 많음 그래서 두꺼운 기본서 정도 되어야 개념과 여러 클래스를 다룸
본 과정에서도 컬렉션에 대한 개념과 ArrayList 클래스 위주로 진행
[1] 컬렉션 프레임워크란
'수집품'이라는 사전적 의미에서 유추할 수 있듯이 '데이터 값들을 담는 여러 그릇' 정도로 이해하면 됨
집 부엌 찬장을 열어보면 종류별로 용도별로 그릇이 많이 있듯이 어떤 자료구조 데이터를 저장하고 관리할 것인지에 따라 맞는 그릇을 써야 함
내가 만들 프로그램의 데이터 처리를 어떻게 할지 그 특징을 잘 파악하여 컬렉션 내 맞는 그릇(클래스)을 골라 사용
이러한 것은 파이썬에서도 마찬가지
컬렉션 프레임워크는 크게 봤을 때 -> Collection과 Map으로 나뉘고 이 둘은 모두 인터페이스(Interface)로 되어 있음
Collection은 List와 Set으로 나뉘고 이들도 인터페이스 -> 이들을 상속받아 다양한 형태의 배열(클래스)로 사용됨
[2] 컬렉션
Collection(인터페이스) -> 상속 -> List와 Set으로 구분(인터페이스) -> 상속 -> List 계열 구현 클래스 vs Set 계열 구현 클래스
List 계열 구현 클래스 -> ArraysList, LinkedList, Vector, Stack
Set 계열 구현 클래스 -> HashSet, SortedSet, TreeSet
[3] List vs Set
컬렉션 프레임워크의 핵심 인터페이스들
List 인터페이스를 상속하는 클래스들의 특징 -> 인덱스가 있고, 그래서 저장 순서가 유지되고, 데이터 중복이 허용
Set 인터페이스를 상속하는 클래스들의 특징 -> 데이터 중복 허용 안됨
5. 컬렉션 프레임워크의 ArrayList를 사용하는 예제 코드 구현
[1] ArrayList
자바의 배열은 크기를 미리 지정하고 사용했음 -> 그러다보니 넉넉하게 크기를 지정하고 사용함
반면 ArrayList는 필요시 언제든지 추가, 삭제가 가능
List 인터페이스를 상속하므로 인덱스가 있고 저장 순서가 유지되고 데이터 중복이 가능함
또한, 제네릭 문법을 사용할 수 있음 -> 만약 제네릭을 사용하지 않는다면 내부적으로 Object 타입으로 처리됨
사용을 위해서는 상단에 import java.util.ArrayList; 또는 import java.util.*;
import java.util.ArrayList; class Person{} public class Java100_collection_FramewokrArrayList1{ public static void main(String[] args){ // ArrayList를 제네릭이 아닌 Object 타입으로 사용하는 경우 ArrayList list1 = new ArrayList(); // 데이터 추가하기 -> add() list1.add("홍길동"); list1.add(20); list1.add("이순신"); list1.add(20); list1.add(new Person()); // 데이터 가져오기 -> get() -> 이 때, 해당 데이터 자료형으로 형 변환하여 사용 String str = (String)list1.get(0); System.out.println(str.length()); // 3 int num = (int)list1.get(1); System.out.println(num+100); // 120 // 결론 // 이상으로 봤을 때, 제네릭 문법을 사용하지 않으면 ArrayList는 내부적으로 Object 타입으로 처리됨 // get() 메서드를 사용할 때는 형 변환을 주의해야 함 // 제네릭을 사용하면 됨 // 출력 -> 반복문 -> 배열의 크기(size) -> 객체명.size() System.out.pritnln(list1.size()); // 5 for(int i=0; i<list1.size(); i++){ System.out.print(list1.get(i)+" "); } } }
6. ArrayList를 이용한 자료의 추가, 수정, 삭제, 출력
import java.util.ArrayList; public class Java100_collection_FrameworkArrayList2{ public static void main(String[] args){ // ArrayList 객체 생성 -> 제네릭 사용 ArrayList<String> ar = new ArrayList<String>(); // 추가 -> add() ar.add("홍길동"); ar.add("이순신"); ar.add("강감찬"); ar.add("을지문덕"); ar.add("김유신"); System.out.println(ar.get(3)); // 을지문덕 String str = ar.get(0); // 형 변환 없이 바로 사용 -> 타입 안정성 ↑ //int num = (int)ar.get(0); // 컴파일 단계에서 오류 발견 // 수정 -> set(인덱스, 수정값) ar.set(3,"징키스칸"); System.out.println(ar.get(3)); // 징키스칸 } }
'개발자 수업 > 인터넷 강의' 카테고리의 다른 글
자바 100제 Part.4 / 14 ~ 19 (0) 2021.09.27 자바 100제 Part.4 / 1 ~ 7 (0) 2021.09.23 자바 100제 Part.3 / 24 ~ 28 (0) 2021.09.22 자바 100제 Part.3 / 14 ~ 23 (0) 2021.09.18 자바 100제 Part.3 / 5 ~ 13 (0) 2021.09.17