본문 바로가기

IT/공부

[프로그래밍] Enhanced for Loop, Generic, Wrapper class, AutoBoxing and AutoUnBoxing, Collection

★★주의★★) [private 필드, 공유, this] 상위 클래스의 private 필드는 하위 클래스에서 오버라이딩 하지 않았더라도 this.변수명 으로 접근할 수 없다. 하위 생성자에서 상위 생성자로 입력값을 넘기지 않고 초기화하고 싶을 땐 this.setName(name); this.setAge(age); 처럼 setter 메서드에는 접근 가능하다.

overriding은 메서드 재정의 뿐 아니라 상위 메서드에 추가하는 것도 가능하다.
하위 클래스에서 overriding한 메서드 실행의 첫 줄에서 super.메서드명();으로 상위 메서드를 호출할 수 있다. 이는 상위 메서드를 호출하고 자신도 실행하므로 추가하는 overriding이다. 

primitive data type은 call by value로 주소값이 아닌 값을 가지고 있기 때문에 == 를 이용해 바로 비교할 수 있다.

string class에 equals오버라이딩 되어 있음.

레퍼런스 비교는 적절히 overriding 되어 있으니 equals로 하자.

String class는 immutable한 데이터를 만든다. 해당 주소값에 있는 내용을 수정하는 것이 아니라 데이터가 바뀔 때마다 메모리에 새로 만든다는 뜻이다. 
StringBuffer class는 mutable한 데이터를 만든다. StringBuffer 인스턴스를 만들면 빈 16칸을 만들고 거기에 하나씩 채워나간다.

API java.sun.com -> Essential Links -> java APIs

<<<psudo code>>>
말로 하는 코딩(코드를 보고 말로 진행함)

<<<소프트웨어적 객체>>>
array = 소프트웨어적 객체
stack

vector



<<<Enhanced for Loop>>>
개선된 Loop라고도 한다. 인덱스로 자료형을 관리하는 경우 해당 컬렉션에 담긴 데이터를 꺼내려면 for문을 돌려야 했다. 동일하게 초기값은 0, 조건식은 컬렉션에 담겨있는 값의 개수까지, 하나씩 증가하는 식으로 출력해야 했다. 이를 사용하기 편하게 줄인 것이 Enhanced for Loop(=for each) 문이다. Vector<String> vector = new Vector<String>(10,10);이 있다고 하면, vector의 데이터를 출력할 때에 Enhanced for loop(for each)를 for(String s : vector){System.out.println(s);}와 같이 활용한다. for 옆의 소괄호는 vector의 0번 데이터에서 하나 추출해 s에 담아준다 이를 vector.size()만큼 반복한다 는 의미이다.
(이는 Iterator 라는 표준산출방식을 wrapping 한 방법이다. 임베디드와 같은 한정된 상황에선 권장되지 않는다.)

<<<Generic>>>
특정 컬렉션에 하나의 자료형만 담도록 명시하는 방법으로, <>를 이용해 컬렉션(레퍼런서 데이터타입, 클래스)뒤에 표기한다.
컬렉션에 하나의 자료형만 담지 않는다면 모든 입력값의 자료형은 Object로 묵시적 형변환이 일어나고, 출력할 때에도 각 입력값의 자료형을 판단해 casting연산자로 명시적 형변환이 필요하기 때문에 효율적이지 못하다.
Generic을 명시해 자료형을 통일한다면 형변환이 필요하지 않으므로 메모리를 많이 사용하지 않을 수 있다.

<<<Wrapper class, AutoBoxing and AutoUnBoxing>>>
Wrapper Class는 primitive data type을 reference data type으로 혹은 그 역으로 변환해주기 위해 있는 class를 모아 일컫는 말이다.
java.lang 패키지 밑에는 primitive data type과 일대일 대응되는 클래스들이 있다. Boolean, Byte, Character, Short, Integer, Long, Float, Double 클래스들이다. 이 클래스들의 각 인스턴스 생성 시, 대응되는 primitive type data를 넣으면 그 값을 갖는 클래스 데이터타입 인스턴스가 생성된다. 이 과정을 boxing이라 하나보다.
wrapper class로 감싼 인스턴스에서 그 값을 다시 primitive data type으로 꺼내려면 primitive data type 변수에 메서드를 사용해 값을 추출해 대입해야 했다. 이 과정을 unboxing이라 하나보다. 
JDK 1.5(2003년쯤)에 Generic, Enhanced For Loop과 함께 AutoBoxing, AutoUnBoxing 기능이 추가되었다.

JDK 1.4 이전 JDK 1.5 이후
int i = 10; 
Ingeter i01 = new Integer(i);
int j = i01.intValue();
int i = 10;
Integer i01 = i;
int j = i01;

이는 JDK 1.5 이후에는 .java에 오른쪽 같이 작성하면 compile시 왼쪽같이 자동으로 변환을 해 .class를 만들어주기 때문이다. 이를 AutoBoxing AutoUnboxing이라 한다.
이와 generic이 만나면 더 편리하게 작업할 수 있다. 

JDK 1.4 이전 JDK 1.5 이후
public void addArrayList14(int intValue){
         ArrayList arryList = new ArrayList();
         arryList.add(new Integer(intValue));
         Integer i = (Integer)arryList.get(0);
         System.out.println(i.intValue());
}
public void addArrayList15(int intValue){
         ArrayList<Integer> arrayList = new ArrayList<Integer>();
         arrayList.add(intValue);      //==>autoboxing
         int i = arrayList.get(0);  //==>autounboxing
         System.out.println(i);
}


============================================================

<<<compile option 컴파일 옵션>>>
컴파일 옵션은 javac 와 .java파일 이름 사이에 들어가는 -로 시작하는 조건을 말한다.
사용해 본 옵션에는 컴파일 시 패키지에 맞게 폴더를 만들어주는 -d 옵션(javac -d . $FileName$), 컴파일 할 때 어디에서 generic을 사용하지 않았는지(?) 알려주는 =xlint옵션 (javac -Xlint:unchecked $FileName%) 이 있다.

<<<raw type은 Object data type을 의미한다.>>>

<<<Collection 컬렉션>>>
자바 이전의 언어, C(다른 Low Level Language도)에서는 자료구조를 직접 구상해야 했다. 자료를 어떤 방식으로 관리할 것인지에 따라 자료구조를 달리 한 것이다. 이 때에는 입출력 자료 처리 순서에 따라 Queue와 Stack으로 나눴다. Queue구조는 First In First Out, Stack 구조는 First In Last Out 으로 데이터를 처리한다.
자바에서는 개발자가 자료 구조를 관리하지 않아도 되는데 API로 제공해주기 때문이다.
자바에서는 자료 구조라는 용어보다 Collection 컬렉션을 사용하는데 자바에서 자료를 관리하는 형태로 제시된 인터페이스 클래스들(Set, List, Queue, Map)이 모두 Collection class를 공유하기 때문이다.
자바는 자료구조를 직접 만들지 않고, 인터페이스 클래스를 polymorphism 개념으로 지원해준다. 사용하고자 하는 자료구조를 모델링하면 그 기능을 지원하는 인터페이스 클래스를 implements 한 클래스를 이용하면 된다. 이 때 각 클래스의 구체적인 메서드를 이용하려면 그 클래스 데이터형의 인스턴스를 사용해야한다. 그렇지 않고 인터페이스 클래스에서 구현을 강제한 메서드(하나의 사용법)만 이용한다면 인터페이스 클래스 데이터형의 구현된 클래스 인스턴스를 사용해도 된다.

Set 인터페이스 클래스는 중복된 자료를 저장하지 않는 구조로, 자료의 정렬은 지원하지 않는다.
List 인터페이스 클래스는 index 번호로 자료를 관리하는 구조이다. 자료구조에서 본 FILO방식의 Stack 클래스가 List 인터페이스를 구현했고 그 외에는 Vector와 ArrayList 등이 있다.
Queue 인터페이스 클래스는 FIFO 방식으로 자료를 관리하는 구조이다.
Map 인터페이스 클래스는 key와 value를 연결해 관리하는 구조이다. 키 값으로 value를 관리한다. 따라서 key값을 알고 있어야 value를 출력할 수 있다.  
Queue와 Stack을 Queue 인터페이스와 Stack 클래스로 제공한다.