public static void printAll2(ArrayList<? extends Product> list){
for(Product p : list){
System.out.println(p);
}
}
public class GenericsVSNonGenericsEx1{
public static void main(String[] args){
//Generics를 지정하지 않을 경우 모든 객체를 저장
List list1 = new ArrayList();
list1.add(10);
list1.add("10");
//컬렉션의 get() 메서드들은 리턴타입이 Object라서 캐스팅이 필요하다
Integer i = (Integer)list1.get(0);
System.out.println(i);
//Generics를 사용했을 경우
List<Integer> list2 = new ArrayList<Integer>();
list2.add(10);
//list2.add("10"); //compile-time error
Integer gi = list2.get(0); //형변환 필요 없음
System.out.println(gi);
}
}
class GenericsClassEx2<T>{
T element;
void setElement(T element){
this.element = element;
}
T getElement(){
return element;
}
}
...
GenericsClassEx2<String> gc = new GenericsClassEx2<String>();
GenericsClassEx2<String> gc = new GenericsClassEx2<>(); //java 7부터 가능
class LandAnimal{
public void crying(){
System.out.println("육지동물");
}
}
class Cat extends LandAnimal{
public void crying(){
System.out.println("냐옹냐옹");
}
}
class Dog extends LandAnimal{
public void crying(){
System.out.println("멍멍");
}
}
class Sparrow{
public void crying(){
System.out.println("짹짹");
}
}
class AnimalList<T>{
ArrayList<T> al = new ArrayList<T>();
void add(T animal) {
al.add(animal);
}
T get(int index) {
return al.get(index);
}
boolean remove(T animal) {
return al.remove(animal);
}
int size() {
return al.size();
}
}
public class GenericsPolymorphicEx1 {
public static void main(String[] args) {
AnimalList<LandAnimal> landAnimal = new AnimalList<>();
landAnimal.add(new LandAnimal());
landAnimal.add(new Cat());
landAnimal.add(new Dog());
// landAnimal.add(new Sparrow()); // 오류가 발생함.
for (int i = 0; i < landAnimal.size() ; i++) {
landAnimal.get(i).crying();
}
}
}
[결과]
육지동물
냐옹냐옹
멍멍
class GenericsMethodClass {
// generics method 생성
public <T> void genericsMethod(T data) {
System.out.println("Generics Method Data Passed: " + data);
System.out.println("매개변수 타입 : " + data.getClass().getName()+"\n");
}
}
public class GenericsMethodEx1 {
public static void main(String[] args) {
GenericsMethodClass demo = new GenericsMethodClass();
// generics method의 매개변수가 String 타입으로 동작됨
demo.<String>genericsMethod("제너릭스 메서드");
// generics method의 매개변수가 Integer 타입으로 동작됨
demo.<Integer>genericsMethod(25);
// 이 경우 컴파일러는 메서드에 전달된 값을 기반으로 형식 매개 변수를 일치시킬 수 있습니다.
demo.genericsMethod(50);
}
}
[결과]
Generics Method Data Passed: 제너릭스 메서드
매개변수 타입 : java.lang.String
Generics Method Data Passed: 25
매개변수 타입 : java.lang.Integer
Generics Method Data Passed: 50
매개변수 타입 : java.lang.Integer
void add(List<? extends Person> list)
List<Man> mlist = new ArrayList<Man>();
…
add(mlist);
interface WarmBlood{...}
...
// implements 키워드를 사용해서는 안됨
class AnimalList<T extends WarmBlood> { ... }
// 클래스와 인터페이스를 동시에 상속받고 구현해야 한다면 & 사용
class AnimalList<T extends LandAnimal & WarmBlood> { ... }
public static void printAll2(ArrayList<? extends Product> list, ArrayList<? extends Product> list2){
for(Product p : list){
System.out.println(p);
}
}
↓
public static <T extends Product> void printAll2(ArrayList<T> list, ArrayList<T> list2){
for(Product p : list){
System.out.println(p);
}
}
enum Colors{RED, ORANGE, YELLOW, GREEN, BLUE}
class EnumTest{
Colors col; //열거형 인스턴스 변수
void test(){
col = Colors.BLUE;
}
}
if(col == Colors.BLUE)
예제
enum Colors{RED,ORANGE,YELLOW,GREEN,BLUE}
public class EnumEx01{
public static void main(String[] args){
Colors[] arr = Colors.values();
for(Colors rb : arr){
System.out.println(rb);
}
System.out.println("--------------");
Colors.cols = Colors.valueOf("GREEN");
System.out.println(cols);
}
}
[결과]
RED
ORANGE
YELLOW
GREEN
BLUE
--------------
GREEN
public enum Rainbow{
RED(3), ORANGE(10), YELLOW(21), GREEN(5), BLUE(1), INDIGO(-1), VIOLET(-11);
//인스턴스 변수 선언
private final int value;
//생성자 선어
Rainbow(int value) {this.value = value;}
public int getValue(){return value;}
}
enum Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }
public class EnumTestEx1 {
public static void main(String[] args) {
Color[] arr = Color.values();
for (Color c : arr) {
System.out.println(c);
}
Color cs = Color.valueOf("GREEN");
System.out.println(cs);
int idx = Color.YELLOW.ordinal();
System.out.println(idx);
}
}
[결과]
RED
ORANGE
YELLOW
GREEN
BLUE
INDIGO
VIOLET
GREEN
2
@Test //해당 메소드가 단위 테스트임을 명시하는 어노테이션이다
private void runTest(){...}
어노테이션 | 설명 |
---|---|
@Override | 컴파일러에게 오버라이딩하는 메서드라는 것을 알린다. |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다. |
@SuppressWarnings | 컴파일러의 특정 경고메시지가 나타나지 않게 해준다. |
@SafeVarargs | 제너릭스 타입의 가변인자에 사용한다. (jdk 1.7) |
@FunctionalInterface | 함수형 인터페이스라는 것을 알린다. (jdk 1.8) |
@Native | native 메서드에서 참조되는 상수 앞에 붙인다. (jdk 1.8) |
@Target* | 어노테이션이 적용가능한 대상을 지정하는데 사용한다. |
@Documented* | 어노테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다. |
@Inherited* | 어노테이션이 자손 클래스에 상속되도록 한다. |
@Retention* | 어노테이션이 유지되는 범위를 지정하는데 사용한다. |
@Repeatable* | 어노테이션을 반복해서 적용할 수 있게 한다. (jdk 1.8) |
@interface MyAnnotation()
@interface MyAnnotation(){
int value() default 0;
}
//사용 예 @MyAnnotation(value=20)
@interface MyAnnotation{
int value1() default 1;
String value2() default "";
String value3() default "i";
}
//사용 예 @MyAnnotation(value1=10,value2="gil Dong",value3="xxx")
주의사항
- 메서드에서 throws 절이 없어야 한다.
- 메서드에 매개변수가 없어야 한다.
- 주석을 정의하려면 interface 키워드 바로 옆에 @을 붙여야 한다.
- 메서드에 기본값을 할당할 수 없다.