제네릭(Generics)는 자바 J2SE 5.0 이후에 도입된 개념이다.

제네릭은 모든 종류의 타입을 다룰 수 있도록 일반화된 타입 매개 변수(generic type)로 클래스나 메소드를 선언하는 기법으로 c++의 템플릿(template)과 동일하다.

 

 

Stack<E>에서 E에 구체적인 타입을 지정하면, 지정된 특정 타입만 다룰 숫 있는 구체화된 스택이 된다.

예를 들어, Stack<Integer>는 Integer 타입만 다루는 스택이 되고, Stack<Point>는 Point 타입의 객체만 푸시(push)하고 팝(pop)할 수 있는 스택이 된다.

 

다음과 같은 것이 제네릭이다.

제네릭이 도입되기 전인 J2SE 1.4 까지는 위의 코드를 다음과 같이 사용했다.

두 개 코드의 차이점은 ArrayList 라는 자료형 타입 바로 옆에 <String> 과 같은 문구가 있느냐 없느냐의 차이이다.

 

※ JSSE 5.0 이후 버전에서 두번째 방법으로 코드를 작성해도 오류는 나지 않는다. 다만 제네릭스 타입을 명확하게 지정하라는 Warning 메시지가 출력된다.

 

위에서 사용한 첫번/재 코드의 <String> 이라는 제네릭 표현식은 "ArrayList 안에 담을 수 있는 자료형은 String 타입 뿐이다" 라는 것을 의미한다. 즉 제네릭을 이용하면 좀 더 명확한 타입체크가 가능해 지는 것이다.

 

제네릭을 사용하지 않은 경우를 한번 보자!

제네릭을 사용하지 않을 경우에 ArrayList 안에 추가되는 객체는 Object 자료형으로 인식된다.

Object 자료형은 모든 객체가 상속하고 있는 가장 기본적인 자료형이다 따라서 ArrayList 객체인 aList에 값을 넣을 떄는 문제가 안되지만 값을 가져올 경우에는 항상 Object 자료형에서 String 자료형으로 다음과 같이 형변환(casting)을 해 주어야만 한다.

 

또 한가지 aList 안에는 String 객체 이외의 객체도 넣을 수 있기 때문에 형 변환 과정에서 잘못된 형변환으로 인한 오류가 발생할 소지가 있다. 바로 이러한 점이 제네릭스의 탄생 이유이기도 하다.

위 코드를 제네릭스를 이용하여 변경하면 다음과 같이 된다.

제네릭으로 자료형을 선언하기만 하면 그 이후로는 자료형에 대한 형변환 과정이 필요없다. 이미 컴파일러가 aList 에는 반드시 String 자료형만 추가 되어야 함을 알기 때문이다. 이렇게 제네릭을 이용하면 형변환에 의한 불필요한 코딩, 잘못된 형변환에 의한 런타임 오류등에서 벗어날 수 있게 된다.

'java 기초 탄탄~' 카테고리의 다른 글

리스트(List)  (0) 2019.12.01
StringBuffer 클래스  (0) 2019.11.30

리스트는 배열과 비슷한 자료형으로 배열보다 더 편리한 기능을 많이 가지고 있다.

배열은 크기가 정해져 있어 예를 들어 배열의 크기를 10개로 정하면 10개 이상의 값을 담을 수 없다.

프로그래밍 시 크기를 알 수 있는 상황도 있지만 명확한 크기를  알 수 없는 경우가 더 많다. 이렇게 동적으로 자료형의 갯수가 가변하는 상황이라면 List를 사용하는 것이 유리하다.

 

ArrayList(List 자료형 중 가장 간단한 형태의 자료형)

 

 

add

한 야구선수가 총 3번의 투구를 150,28,177(km) 의 속도를 던졌다면 다음과 같은 코드로 작성할 수 있다.

add 메소드를 이용하여 투구 스피드를 저장

 

 

만약 첫 번쨰 위치에 "133"이라는 투구 스피드를 삽입하고 싶다면 아래와 같이 코딩한다.

 

만약 두 번쨰 위치에 133을 삽입할 경우에는 다음과 같이 코딩한다.

 

※ 자바는 J2SE 5.0 버전 이후부터 ArrayList<String> pitches = new ArrayList<String>(); 이런식으로 객체를 포함하는 자료형도 어떤 객체를 포함하는지에 대해서 명확하게 표현하는것을 권고하고 있다. 이클립스에서 위와 같이 코딩하면 명확한 타입을 명시하라는 warning이 표시될 것이다.

 

get

한 야구선수의 2번쨰 투구 스피드를 알고 싶다면 다음과 같이 코딩한다.

ArrayListd의 get 메소드를 이용하면 특정 인덱스의 값을 추출할 수 있다.

 

size

size 메소드는 ArrayList의 갯수를 리턴한다.

현재 pitches에 담긴 갯수에 해당되는 값이 출력될 것이다.

 

contains

contains 메소드는 리스트 안에 항목값이 있는지를 판별하여 그 결과를 boolean으로 리턴한다.

remove

remove 메소드에는 2개의 방식이 있다. (이름은 같지만 입력 파라미터가 다르다)

  1. remove(객체)
  2. remove(인덱스)

remove(객체)의 경우는 리스트에서 객체에 해당되는 항목을 삭제하고 삭제한 결과를 리턴한다.

수행결과는 다음과 같다.

"177" 항목이 성공적으로 삭제되고 true를 리턴한다.

 

remove(인덱스)의 경우는 해당 인덱스의 항목을 삭제하고 삭제된 항목을 리턴한다.

 

결과는 다음과 같다.

pitches의 첫번쨰 항목 "150"이므로 "150"이 삭제된 후 "150"을 리턴했다.

 

'java 기초 탄탄~' 카테고리의 다른 글

제네릭(Generics)  (1) 2019.12.01
StringBuffer 클래스  (0) 2019.11.30

StringBuffer의 생성과 특징

StringBuffer 클래스는 스트링을 다루는 클래스로서 String 클래스와 매우 유사한 기능을 한다.

그러나 가장 큰 차이점은 String 객체가 한 번 만들어진 문자열을 수정할 수 없는 것과는 달리 StringBuffer 객체는 내부에 문자열을 저장하는 가변 크기의 버퍼를 가지고 있기 떄문에 생성 후 문자열 값을 바꿀 수 있다 

따라서 StringBuffer는 문자열을 추가하거나 변경 할 떄 주로 사용하는 자료형이다

 

잠깐!

간단한 문자열을 처리하는 것은 String클래스를 이용하고 문자열의 길이가 길거나 문자열 작업이 많은 경우 StringBuffer클래스를 이용하는 것이 적합하다.

 

 

StringBuffer 예제1

StringBuffer은 생성자를 제공하며  초기 버퍼의 크기가 16인 스트링 버퍼 객체를 생성해준다.

StringBuffer자료형은 append()메소드를 사용하여 문자열을 추가해 나갈 수 있다.

결과값

 

위 예제를 String자료형으로만 가지고 표현할 수 있다.

 

 

첫 번째 예제의 경우 StringBuffer 객체는 단 한번만 생성된다. 두번 째 예제는 String 자료형에 + 연산이 있을 때마다 새로운 String 객체가 생성된다(문자열 간 + 연산이 있는 경우 자바는 자동으로 새로운 String 객체를 만들어 낸다). 두번 째 예제에서는 총 5개의 String 자료형 객체가 만들어지게 된다.

※ String 자료형은 한번 값이 생성되면 그 값을 변경할 수가 없다. 이렇게 값을 변경할 수 없는 것을 immutable 하다고 한다. trim, toUpperCase 등의 메소드를 보면 문자열이 변경되는 것 처럼 생각 될 수도 있겠지만 해당 메소드 수행 시 또 다른 String 객체를 생성하여 리턴할 뿐이다. StringBuffer 는 이와 반대로 값을 변경할 수 있다(mutable 하다). 즉 한번 생성된 값을 언제든지 수정할 수 있다.

그렇다면 무조건 StringBuffer를 사용하는 것이 좋을까?

그건 상황에 따라 다르다. StringBuffer 자료형은 String 자료형보다 무거운 편에 속한다. new StringBuffer() 로 객체를 생성하는 것은 일반 String을 사용하는 것보다 메모리 사용량도 많고 속도도 느리다. 따라서 문자열 추가나 변경등의 작업이 많을 경우에는 StringBuffer를, 문자열 변경 작업이 거의 없는 경우에는 그냥 String을 사용하는 것이 유리하다.

 

StringBuffer 예제2

reverseString 함수를 정의하여 입력받은 문자열을 StringBuffer 클래스를 사용하여 거꾸로 반환하는 예제이다.

이 떄 .toString() 메소드를 사용하면 String자료형으로 변경할 수 있다.

결과값

 

StringBuffer 예제3

위 예는 0 번째 위치에 "hello " 라는 문자열을 삽입하는 방법을 보여준다.

결과값

 

StringBuffer 예제4

 

substring(시작위치, 끝위치)와 같이 사용하면 StringBuffer 객체의 시작위치에서 끝위치까지의 문자를 뽑아내게 된다.

 

결과값

 

 

오늘 공부 끝~!!

'java 기초 탄탄~' 카테고리의 다른 글

제네릭(Generics)  (1) 2019.12.01
리스트(List)  (0) 2019.12.01

+ Recent posts