안드로이드 개발 질문/답변
(글 수 45,052)
제가 자바를 아주 기초만 배워서 모르는 부분이 많네요 ㅠ
예제 소스를 보다보면 객체명 옆에 <>를 쓰는 경우가 꽤 많던데요..
private List<String> searchItems(String query){
~~~~
}
이런식으로 메서드 선언할때 <String> 부분은 무슨 역할을 하나요?
저런 형태에 대해 공부해보려면 어떤 키워드로 검색하면 좋을지도 알려주시면 감사하겠습니다.
답변에 대해 미리 감사드립니다.
예제 소스를 보다보면 객체명 옆에 <>를 쓰는 경우가 꽤 많던데요..
private List<String> searchItems(String query){
~~~~
}
이런식으로 메서드 선언할때 <String> 부분은 무슨 역할을 하나요?
저런 형태에 대해 공부해보려면 어떤 키워드로 검색하면 좋을지도 알려주시면 감사하겠습니다.
답변에 대해 미리 감사드립니다.
2010.06.25 18:06:44
제너릭(GENERIC)에 대해 찾아보시면 될 듯합니다.
간단히 타입 제한이라고 생각하시면 될듯합니다. <>안에 사용된 선언된 타입으로만 가능하다는 의미로 받아들이시면 될 듯합니다.
지금 급히 나가야 해서 답변이 부족한듯 싶네염^^:;
2010.06.25 18:09:12
Generic 이란 것입니다.
List의 경우 기본적으로 object 값이 들어가는데
예제로 쓰신거와 같이 List<String> 하시면 이 List엔 String값만 들어가며
꺼내올때도 따로 형변환 할필요없이 String으로 받아서 쓸수 있습니다.
형변환이 없기에 속도가 더 빨라지는 장점도 있고..
이 이하는 내공이 부족하기에 검색해보심이..;
2010.06.25 18:09:13
테이터 형식을 지정하는거 아니던가요...
List<String> 면 String 형식의 데이터를 가진 List를 선언하라는거지요...
<> 사이에 들어가는건 기본적인 int,float,double 등등 말고도 class 등도 들어갈수있습니다
예를 들다면
class MyList {
String name;
int phone;
MyList(String name, int phone){
this.name = name;
this.phone = phone;
}
}
하고 List<MyList> 하면 String name, int phone 를 가진 MyList 라는 class 형식의 데이터를 가진 List 가 되지요....
설명이 맞나모르겠군요..:ㅇ
List<String> 면 String 형식의 데이터를 가진 List를 선언하라는거지요...
<> 사이에 들어가는건 기본적인 int,float,double 등등 말고도 class 등도 들어갈수있습니다
예를 들다면
class MyList {
String name;
int phone;
MyList(String name, int phone){
this.name = name;
this.phone = phone;
}
}
하고 List<MyList> 하면 String name, int phone 를 가진 MyList 라는 class 형식의 데이터를 가진 List 가 되지요....
설명이 맞나모르겠군요..:ㅇ
2010.06.25 19:11:17
<>는 Generic 메카니즘을 구현하다 보니 정의된 방법입니다. 번역해서 일반화 프로그래밍 뭐 이렇게 얘기하는데요.
제네릭 프로그래밍의 핵심 개념은 '다루어지는 대상(흔히 데이터)'와 '대상을 다루는 작업(알고리즘 등)'을 독립시켜서 서로 영향을 주지 말자는 것입니다.
List의 예를 들면 같은 타입의 데이터를 순차적으로 다루는 작업을 모아놓은 것이 List interface입니다.
데이터가 무슨 타입인지 몰라도 순서대로 추가하고 삭제하고 하는 '작업'은 미리 모두 아는 바이죠.
List 선언을 보면 interface List<E>라고 되어 있는데 List.add(), List.addAll() 등의 메소드는 '작업'에 해당하고 E가 '데이터'입니다.
List interface는 자바가 제네릭 프로그래밍 메카니즘을 구현한 결과 중에 하나입니다.
(E는 잘은 모르겠지만 element의 약자가 아닐까 합니다.)
그리고 class ArrayList<E>가 실제로 가져다가 사용할 수 있는 클래스로서, List를 가지고 개발자가 일일이 하지 말라고 미리 구현한 것이지요.
(객체 선언은 List로 하고 생성(new)은 ArrayList 같이 구현체로 하는 이유는 자바는 다형성이란 특성이 가지며 이를 개발과 유지보수에 편리하게 이용하기 때문인데 그 얘기는 깁니다. 자바의 정석 등 책 참조하세요.)
선언이 아니라 실제 프로그램을 만들 타이밍(코딩할 때)에는 정확히 데이터가 어떻게 생겼는지 컴퓨터가 알아야 하기 때문에 new ArrayList<E>처럼 할 수 없습니다.
때문에 String 등 이미 만들어진 Object의 서브클래스 타입이 그 자리에 들어갑니다.
(제가 알기로 int, float 같은 기초 타입도 Integer, Float와 같이 Object의 서브클래스들로 감싸서(wrapping) 사용하는 방법으로 사용해야 합니다. 그냥 new ArrayList<int>로 하면 에러나 경고가 뜰 것입니다. 안드로이드에 포함된 자바에서는 그렇군요.)
아무튼 E가 뭐가 되든 상관 없습니다. 하지만 객체지향 언어인 자바에서 모든 타입은 Object라는 객체를 상속받아 만들어지므로 '뭐가 되든'이 Object, 즉 모든 클래스를 의미한다고 보시면 됩니다. "<? extends E>"는 역시 다형성이 적용된 예로 ArrayList를 List로 선언해서 사용하는 것처럼 List<String>이라고 선언하고 생성은 new ArrayList<MyStringType>과 같이 할 수 있다는 얘기입니다. 물론 MyStringType extends String이어야 합니다.
자바는 GP(제네릭 프로그래밍)와 OOP(객체지향 프로그래밍) 등 여러 좋은 개념들을 섞어서 만들어졌는데 그게 무슨 개념인지는 중요한 게 아니고, API 클래스들을 왜 그렇게 만들었는지 어떤 상황에서 어떻게 사용해야 하는지를 실제 코딩을 하시면서 연구하시면 한 두가지 개념을 이해함으로서 미리 만들어진 수 십 가지 클래스를 사용할 수 있므로 참고하시길 바랍니다.
아, 특수 분야에 대한 프로그래밍을 하지 않는 이상 똑같이 동작하므로 별 상관은 없지만요, 안드로이드에 포함된 자바가 순수 자바와는 차이가 있습니다. 또 묻지 못할 것은 없겠지만 본문처럼 안드로이드와 상관 없이 온전히 자바에 대한 질문은 각종 자바 커뮤니티에 더 자료도 많고 하므로 그런 쪽을 이용하심이 유리할 듯 합니다.
제네릭 프로그래밍의 핵심 개념은 '다루어지는 대상(흔히 데이터)'와 '대상을 다루는 작업(알고리즘 등)'을 독립시켜서 서로 영향을 주지 말자는 것입니다.
List의 예를 들면 같은 타입의 데이터를 순차적으로 다루는 작업을 모아놓은 것이 List interface입니다.
데이터가 무슨 타입인지 몰라도 순서대로 추가하고 삭제하고 하는 '작업'은 미리 모두 아는 바이죠.
List 선언을 보면 interface List<E>라고 되어 있는데 List.add(), List.addAll() 등의 메소드는 '작업'에 해당하고 E가 '데이터'입니다.
List interface는 자바가 제네릭 프로그래밍 메카니즘을 구현한 결과 중에 하나입니다.
(E는 잘은 모르겠지만 element의 약자가 아닐까 합니다.)
그리고 class ArrayList<E>가 실제로 가져다가 사용할 수 있는 클래스로서, List를 가지고 개발자가 일일이 하지 말라고 미리 구현한 것이지요.
(객체 선언은 List로 하고 생성(new)은 ArrayList 같이 구현체로 하는 이유는 자바는 다형성이란 특성이 가지며 이를 개발과 유지보수에 편리하게 이용하기 때문인데 그 얘기는 깁니다. 자바의 정석 등 책 참조하세요.)
선언이 아니라 실제 프로그램을 만들 타이밍(코딩할 때)에는 정확히 데이터가 어떻게 생겼는지 컴퓨터가 알아야 하기 때문에 new ArrayList<E>처럼 할 수 없습니다.
때문에 String 등 이미 만들어진 Object의 서브클래스 타입이 그 자리에 들어갑니다.
(제가 알기로 int, float 같은 기초 타입도 Integer, Float와 같이 Object의 서브클래스들로 감싸서(wrapping) 사용하는 방법으로 사용해야 합니다. 그냥 new ArrayList<int>로 하면 에러나 경고가 뜰 것입니다. 안드로이드에 포함된 자바에서는 그렇군요.)
아무튼 E가 뭐가 되든 상관 없습니다. 하지만 객체지향 언어인 자바에서 모든 타입은 Object라는 객체를 상속받아 만들어지므로 '뭐가 되든'이 Object, 즉 모든 클래스를 의미한다고 보시면 됩니다. "<? extends E>"는 역시 다형성이 적용된 예로 ArrayList를 List로 선언해서 사용하는 것처럼 List<String>이라고 선언하고 생성은 new ArrayList<MyStringType>과 같이 할 수 있다는 얘기입니다. 물론 MyStringType extends String이어야 합니다.
자바는 GP(제네릭 프로그래밍)와 OOP(객체지향 프로그래밍) 등 여러 좋은 개념들을 섞어서 만들어졌는데 그게 무슨 개념인지는 중요한 게 아니고, API 클래스들을 왜 그렇게 만들었는지 어떤 상황에서 어떻게 사용해야 하는지를 실제 코딩을 하시면서 연구하시면 한 두가지 개념을 이해함으로서 미리 만들어진 수 십 가지 클래스를 사용할 수 있므로 참고하시길 바랍니다.
아, 특수 분야에 대한 프로그래밍을 하지 않는 이상 똑같이 동작하므로 별 상관은 없지만요, 안드로이드에 포함된 자바가 순수 자바와는 차이가 있습니다. 또 묻지 못할 것은 없겠지만 본문처럼 안드로이드와 상관 없이 온전히 자바에 대한 질문은 각종 자바 커뮤니티에 더 자료도 많고 하므로 그런 쪽을 이용하심이 유리할 듯 합니다.