와일드카드<?>

규칙
1. 하나의 참조변수로 대입된 타입이 다른 객체를 참조가능.
  ㄴ와일드카드 사용시 타입변수가 일치 하지않아도, 다른객체를 참조가능 ( 와일드카드사용시 다른타입 사용ok)
2. 메서드의 매개변수에 와일드 카드를 사용


제네릭 메서드

규칙
제네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
클래스의 타입 매개변수<T>와 메서드의 타입 매개변수 <T>는 별개
제네릭메서드는 메서드를 호출할 때마다 타입을 대입할수 있게 한 것(대부분 생략 가능)
  ㄴ ( 와일드 카드는 하나의 참조변수로 서로 다른타입이 대입된 여러 제네릭 객체를 다루기 위한 것 )
  ㄴ 와일드 카드로 안될 때 제네릭 메서드를 사용하는 경우가 많음

메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름생략 불가


제네릭 타입의 형변환

규칙
1. 제네릭 타입과 원시타입간의 형변환은 바람직 하지 않다. (경고발생)
2. 와일드 카드가 사용된 제네릭 타입으로는 형변환 가능 


제네릭 타입의 제거

규칙
1. 컴파일러는 제네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.

컴파일하면 원래대로 돌아간다. (왜? 하위호환성을 위하여)


열거형(enum)

규칙
관련된 상수들을 같이 묶어 놓은 것.
java는 타입에 안전한 열거형을 제공


열거형의 정의와 사용


열거형의 조상 - java.lang.Enum 클래스

enum Direction { EAST, COUTH, WEST, NORTH };	//하나하나가 객체

public class ex6 {
	public static void main(String[] args) {
		
		//열거형 상수를 얻어오는 방법-------------------------------------
		Direction d1 = Direction.EAST;
		Direction d2 = Direction.valueOf("WEST");
		Direction d3 = Direction.valueOf(Direction.class, "EAST");
		System.out.println("d1 : " + d1);
		System.out.println("d2 : " + d2);
		System.out.println("d3 : " + d3);
		//---------------------------------------------------------
		
		System.out.println("d1 == d2 : " + (d1 == d2));
		System.out.println("d1 == d3 : " + (d1 == d3));
		System.out.println("d1 == d2 : " + (d1.equals(d2)));
		
		System.out.println("d1.compareTo(d3) : " + d1.compareTo(d3));
		System.out.println("d1.compareTo(d2) : " + d1.compareTo(d2)); //0-2=-2
		
		Direction[] dArr = Direction.values();
		
		for(Direction d : dArr) {
			System.out.println(d.name() + " , " + d.ordinal());
		}
	}
}


열거형에 멤버추가하기

규칙
불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적는다.
괄호를 사용하려면 인스턴스 변수와 생성자를 새로 추가해 줘야한다. 

enum Direction { 
	EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^"); //하나하나가 객체
	
	private static final Direction[] DIR_ARR = Direction.values();
	private final int value;		// enum 의 정수를 담을 변수
	private final String symbol;	// enum 의 문자열을 담을 변수
	
	private Direction(int value, String symbol) {
		this.value = value;
		this.symbol = symbol;
	}
	
	 public int getValue()		{	return value;	}
	 public String getSymbol()	{	return symbol;	}
	
	 public static Direction of(int dir) {
		 if(dir < 1 || 4 < dir)
			 throw new IllegalArgumentException("Invalid value + dir");
		 return DIR_ARR[dir-1]; // 인덱스맞추기위해 -1
	 }	
	 
	 public Direction rotate(int num) { // num의 값만큼 90도 시계방향회전
		 num = num % 4; 							// -2  
		 if(num < 0) num += 4;						// 2
		 return DIR_ARR[ (value - 1 + num) % 4 ];	// 1-1+2  2 % 4 = 2
	 }
	 
	 public String toString() {
		 return name()+getSymbol();
	 }
}

public class ex6 {
	public static void main(String[] args) {
		
		for(Direction d : Direction.values())
			System.out.println(d.name() +" : " +d.getValue());
		
		Direction d1 =  Direction.EAST;
		Direction d2 =  Direction.of(1);
		System.out.println("---------------------------------");
		System.out.println(d1.name() +" : " + d1.getValue());
		System.out.println(d2.name() +" : " + d2.getValue());
		System.out.println("---------------------------------");
		System.out.println(Direction.EAST.rotate(1));
		System.out.println(Direction.EAST.rotate(2));
		System.out.println(Direction.EAST.rotate(-1));
		System.out.println(Direction.EAST.rotate(-2));
	}
}

 


출처 : 남궁성의 정석코딩

https://www.youtube.com/@MasterNKS

+ Recent posts