ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 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

    댓글