IT story/Java

D+13 Final(상수), Enum, Generic(제네릭), Collection Framework(ArrayList)

jason719 2016. 8. 22. 16:12

2016.08.22. Mon. 열세 번째 수업


 やっと資格の試験が終わりました!今まで頑張ったので順調に受かりましたw

でもまだ二次の試験が残ってるので、また頑張らないと!!


오늘의 수업내용

  • final(상수)의 대한 이해 (그리고 enum)
  • Generic(제네릭)의 대한 이해
  • Collection Framework(ArrayList)


1. final(상수)의 대한 이해 (그리고 enum)


상수 클래스는 Static에 저장하며 대문자를 이용한다. 

상수란 상태를 표현하는 변하지 않는 수이다. (변하지 않는 = FINAL)

static을 사용하는 이유 ☞ 어떤 클래스든 상태를 쉽게 사용 가능하기 위해!! 상태를 나타내기에 빠르게 쉽게 불러와야한다. 

상수에서 int를 사용하는 이유 ☞ switch 제어문을 사용하기 위해!!



※ 심각한 오류(컴파일시 발견되지 않는 오류) -> 시스템에 큰 데미지를 준다.


상수는 int값이기 때문에 switch문의 key값으로 다른 클래스의 상수가 사용될 수 있다.

key값으로 FRUIT 클래스만 사용해야 하는데, COMPANY 클래스를 사용하고 있다.

아래의 예제를 살펴보고 L02FinalEx에서 해결해보자.



※ FinalEx 


상수값을 int가 아닌 클래스 자신을 선언한다.

switch 제어문은 사용할 수 없게되고, 컴파일시 발견되지 않던 오류는 컴파일시 발견되는 오류(22번)로 수정된다.

아래의 예제를 살펴보자.



※ Enum 이용하기


 final을 조금 더 간단하게 표현할 수 있는 것이 Enum이다.

아래의 예제로 확인해보자!


 2. Generic(제네릭)의 대한 이해
 제네릭은 전역변수(필드)의 데이터 타입을 유동적으로 해준다.

아래와 같이 데이터 타입의 입력 발생시 해결법을 알아보자!


문제발생

String으로 지정하고, Integer를 입력하자 14번 열에 오류가 발생한다.



1. 필드추가 + 생성자 오버로드

 ☞ 필드와 생성자가 계속 추가되면 코드가 길어지고 유지보수가 힘들다. 


2. Datatype 변경( 모든 클래스의 조상 Object)

 ☞ 코드가 짧아지고, 코드의 유연성이 생긴다.



**제네릭은 개발자들이 2번 방식을 고수하다가 심각한 오류가 발생해서 추가된 기능이다. 

아래 GenericCause와  GenericEx 예제로 제네릭에 대해 알아보자!


제네릭을 이용하는 이유에 대해서 알아보자

emp.info의 데이터타입 == Integer -> Employee 형 변환 될 수 없기 때문.

>>(Employee)emp.info 형변환 불가능이기 때문에 오류


20번행에 integer값 100을 넣었기 때문에 오류가 발생했다. 

하지만 컴파일시 발견되지 않는 오류이고, 이것은 프로그래머의 실수이다.



GenericEx를 통해 해결방법을 알아보자.


위의 예제에서 다른 데이터타입을 썼을 때 오류가 나타나지 않았지만, 

제네릭을 이용해 작성하면 아래 예제와 같이 25번 행에 오류가 나타난다.


  • extends, implements 상관없이 부모 또는 조상클래스로 Personable을 가지고 있는 클래스만 사용가능
  • T는 지정하지 않으면 Object타입이 된다.
  • T는 <?>안에 지정한 데이터타입이 된다.
  • 제네릭으로 사용할 수 있는 데이터타입은 class 뿐이다.
  • 기본 데이터타입 사용불가



3. Collection Framework(ArrayList)

ArrayList의 데이터타입에는 여러가지 형태가 들어올 수 있다.

아래의 예제로 이해하자


배열과 ArrayList의 차이점을 알아두자!

배열(Array) 

ArrayList 

 데이터타입이 한정적이다

generic으로 유동적이다 

초기 index가 고정이다 

.add()로 계속 추가 가능 

index를 가진다

size를 가진다 

프로그래머가 출력 

syso()으로 출력 가능