Java의 열거와 범주를 자세히 설명합니다.

Java의 열거와 범주를 자세히 설명합니다.
하나: 우선 매거부터 말하자면
열거 유형은 JDK5.0의 새로운 피쳐입니다.Sun은 열거 클래스를 정의하기 위해 새로운 키워드 enum을 도입했다.다음은 일반적인 매거 유형의 정의입니다.

public enum Color{
RED,BLUE,BLACK,YELLOW,GREEN
}
분명히,enum은 특수한class와 비슷하지만, 실제로enum가 정의한 유형은 하나의 종류이다.이러한 클래스는 라이브러리의 Enum 클래스의 하위 클래스(Java.lang.Enum)입니다.그것들은 이 Enum의 많은 유용한 방법을 계승했다.우리는 코드를 컴파일한 후에 컴파일러가enum 형식을 바이트 파일로 단독으로 컴파일한 것을 발견했다: Color.class.
Color 바이트 코드

final enum hr.test.Color {
//  
public static final enum hr.test.Color RED;
public static final enum hr.test.Color BLUE;
public static final enum hr.test.Color BLACK;
public static final enum hr.test.Color YELLOW;
public static final enum hr.test.Color GREEN;
private static final synthetic hr.test.Color[] ENUM$VALUES;
}
다음은 엔움이 정의한 매거류의 특징과 용법을 상세하게 소개한다.(뒤에 Color 예제)
1. Color 매거류는class이고 계승될 수 없는final류입니다.열거 값(RED, BLUE...)모두 Color 유형의 클래스 정적 상수입니다. 우리는 다음과 같은 방식으로 Color 매거진 클래스의 실례를 얻을 수 있습니다.

Color c=Color.RED;
주의: 이 매거값들은 모두publicstaticfinal의, 즉 우리가 자주 정의하는 상량 방식이기 때문에 매거류의 매거값은 모두 대문자로 하는 것이 가장 좋다.
2. 즉, 매거류는class이고 당연히 매거 유형에 구조기, 방법과 데이터 영역이 있다.그러나 매거류의 구조기는 크게 다르다.
(1) 구조기는 매거값을 구성할 때만 호출된다.

enum Color{
RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);
// , RED(255,0,0)
private Color(int rv,int gv,int bv){
this.redValue=rv;
this.greenValue=gv;
this.blueValue=bv;
}
public String toString(){ // Enum toString()
return super.toString()+“(”+redValue+“,”+greenValue+“,”+blueValue+“)”;
}
private int redValue; // ,private 。
private int greenValue;
private int blueValue;
}
(2) 구조기는 개인적인private만 가능하며public 구조기는 절대 허용되지 않습니다.이렇게 하면 외부 코드가 매거류의 실례를 새로 구성할 수 없다는 것을 보장할 수 있다.이것도 완전히 이치에 부합된다. 왜냐하면 우리는 매거값이publicstaticfinal의 상량이라는 것을 알고 있기 때문이다.그러나 매거류의 방법과 데이터 영역은 외부 접근을 허용할 수 있다.

public static void main(String args[])
{
// Color colors=new Color(100,200,300); //wrong
Color color=Color.RED;
System.out.println(color); //  toString() 
}
3. 모든 열거류는 Enum의 방법을 계승하고 있습니다. 다음은 이 방법들을 상세하게 소개합니다.
(1)ordinal () 방법: 매거 값이 매거 종류에 있는 순서를 되돌려줍니다.이 순서는 매거값 성명의 순서에 따라 결정된다.

Color.RED.ordinal(); // :0
Color.BLUE.ordinal(); // :1
(2) compareTo() 메서드: Enum은 java를 구현합니다.lang. Comparable 인터페이스를 사용하여 지정된 객체의 순서와 비교할 수 있습니다.Enum의 compareTo는 두 개의 열거 값의 순서 차이를 반환합니다.물론 전제 조건은 두 개의 열거 값이 같은 열거 클래스에 속해야 한다는 것입니다. 그렇지 않으면 ClassCastException () 이상이 발생합니다.(구체적으로 보이는 소스 코드)

Color.RED.compareTo(Color.BLUE); //  -1
(3)values() 방법: 정적 방법으로 모든 열거 값을 포함하는 그룹을 되돌려줍니다.

Color[] colors=Color.values();
for(Color c:colors){
System.out.print(c+“,”);
}// :RED,BLUE,BLACK YELLOW,GREEN,
(4) toString() 메서드: 열거 상수의 이름을 반환합니다.

Color c=Color.RED;
System.out.println(c);// : RED
(5)valueOf() 방법: 이 방법은 toString 방법과 상응하며 지정한 이름을 가진 지정한 매거 유형의 매거 상수를 되돌려줍니다.

Color.valueOf(“BLUE”); // : Color.BLUE
(6)equals() 방법: 두 개의 열거류 대상의 인용을 비교한다.

//JDK :
public final boolean equals(Object other) {
return this==other;
}
4. 매거류는 switch 문장에서 사용할 수 있다.

Color color=Color.RED;
switch(color){
case RED: System.out.println(“it‘s red”);break;
case BLUE: System.out.println(“it's blue”);break;
case BLACK: System.out.println(“it‘s blue”);break;
}
2: 그리고 범용
범용 (Generic type 또는generics) 은 자바 언어의 형식 시스템에 대한 확장으로 형식에 따라 매개 변수화할 수 있는 클래스를 만들 수 있습니다.형식 매개 변수는 매개 변수화 형식을 사용할 때 지정한 형식의 자리 차지 문자로 볼 수 있습니다. 방법의 형식 매개 변수는 실행할 때 전달되는 값의 자리 차지 문자와 같습니다.
1. 일반적인 이점:
1) 유형은 안전합니다.범주형의 주요 목표는 자바 프로그램의 유형 안전을 향상시키는 것이다.범용으로 정의된 변수의 유형 제한을 사용함으로써 컴파일러는 훨씬 높은 수준에서 유형 가설을 검증할 수 있다.범용이 없다. 이런 가설은 프로그래머의 머릿속에만 존재한다. (또는 행운이라면 코드 주석에도 존재한다.)
2) 강제 유형 변환을 제거합니다.범용적인 장점 중 하나는 원본 코드의 많은 강제 형식 변환을 없애는 것이다.이것은 코드를 더욱 읽을 수 있게 하고 오류 기회를 감소시켰다.비록 강제 유형 변환을 줄이면 범용 클래스를 사용하는 코드의 수다 정도를 낮출 수 있지만, 범용 변수는 상응하는 수다를 가져올 수 있음을 성명한다
3)・잠재적인 성능 이익.범형은 비교적 큰 최적화에 가능성을 가져온다.범주형의 초기 구현에서, 컴파일러는 강제 형식 변환 (범주형이 없으면 프로그래머가 이러한 강제 형식 변환을 지정) 을 생성된 바이트 코드에 삽입합니다.그러나 컴파일러에 더 많은 유형의 정보가 사용될 수 있다는 사실은 향후 버전의 JVM 최적화에 도움이 될 것입니다.
2. 유형 매개변수:
범용 클래스를 정의하거나 범용 클래스의 변수를 선언할 때 괄호를 사용하여 형식 유형 매개 변수를 지정합니다.형식 유형 매개 변수와 실제 유형 매개 변수 간의 관계는 형식 방법 매개 변수와 실제 방법 매개 변수 간의 관계와 유사하지만 형식 매개 변수는 형식을 표시하는 것이지 값을 표시하는 것이 아니다.
범용 클래스의 유형 매개 변수는 거의 모든 클래스 이름을 사용할 수 있는 곳에 사용할 수 있다.예를 들어 아래는java입니다.util.Map 인터페이스의 정의에 대한 발췌문:

public interface Map<K, V> { 
public void put(K key, V value); 
public V get(K key); 
} 
3. 범형은 협동하는 것이 아니다
범형의 혼동에 관해서 흔히 볼 수 있는 출처는 그것이 수조처럼 협동한다고 가정하는 것이다.사실 그것들은 협동하는 것이 아니다.List는 List의 상위 유형이 아닙니다.
만약 A가 B를 확장한다면, A의 그룹도 B의 그룹이며, B[]가 필요한 곳에서 A[]를 사용할 수 있다.

Integer[] intArray = new Integer[10]; 
Number[] numberArray = intArray; 
위의 코드는 유효합니다. Integer는 하나의 Number이기 때문에 하나의 Integer 그룹은 하나의 Number 그룹입니다.하지만 범형에는 그렇지 않다.
다음 코드는 무효입니다.

List<Integer> intList = new ArrayList<Integer>(); 
List<Number> numberList = intList; // invalid 
4. 범용 유형 와일드카드
이 방법이 있다고 가정하십시오.

void printList(List l) { 
for (Object o : l) 
System.out.println(o); 
} 
위의 코드는 JDK 5.0에서 컴파일되었지만 List 로 호출하려고 하면 경고를 받습니다.경고가 나타나는 이유는 범용 (List ) 을 List (이른바 원시 형식) 로만 약속하는 방법에 전달하면 범용 형식의 안전을 파괴할 수 있기 때문입니다.
아래와 같은 방법을 쓰려고 한다면 어떻게 될까요?

void printList(List<Object> l) { 
for (Object o : l) 
System.out.println(o); 
} 
그것은 여전히 컴파일을 통과하지 못할 것이다. 왜냐하면 List 는 List 가 아니기 때문이다.이것이야말로 정말 짜증난다. 현재 당신의 범용 버전은 아직 일반적인 비범용 버전이 유용하지 않다.솔루션은 유형 와일드카드를 사용합니다.

void printList(List<?> l) { 
for (Object o : l) 
System.out.println(o); 
} 
위 코드의 물음표는 유형 어댑터입니다.그것은 물음표로 읽힌다.List모든 범용 List의 부모 유형이므로 List, List 또는 List>>>를 printList()에 전달할 수 있습니다.
5. 범용 방법
(유형 매개 변수 1절에서) 클래스의 정의에 형식 형식 매개 변수 목록을 추가하면 클래스를 범주화할 수 있음을 보았습니다.방법도 범형화될 수 있다. 그것들이 정의한 종류가 범형화되었든 아니든 상관없다.
범용 클래스는 여러 방법 서명 사이에서 유형 제약을 실시한다.List에서 형식 매개 변수 V는 get(),add(),contains() 등 방법의 서명에 나타납니다.맵 형식의 변수를 만들 때 방법 간에 형식 제약을 선언합니다.add () 에 전달된 값은 get () 가 되돌려주는 값의 형식과 같습니다.
이와 유사하게, 범용 방법을 설명하는 이유는 일반적으로 이 방법의 여러 매개 변수 사이에서 하나의 유형 제약을 선언하고자 하기 때문이다.예를 들어, 다음 코드의 ifThenElse () 메서드는 첫 번째 매개변수의 부울 값에 따라 두 번째 또는 세 번째 매개변수를 반환합니다.

public <T> T ifThenElse(boolean b, T first, T second) { 
return b ? first : second; 
} 
클래스 정의에 유형 T를 추가하는 대신 범용 방법을 선택하는 이유는 무엇입니까?(적어도) 이렇게 해야 하는 두 가지 상황이 있다.
* 범용 방법이 정적인 경우에는 클래스 유형 매개변수를 사용할 수 없습니다.
* T의 유형 제약조건이 실제 방법에 국부적인 경우 이는 동일한 유형의 다른 방법 서명에 동일한 유형의 T를 사용하지 않았다는 것을 의미합니다.범용 방법의 유형 매개 변수를 방법에 국부적으로 함으로써 폐쇄 유형의 서명을 간소화할 수 있다.
제한 유형 있음
이전 화면 범용 방법의 예에서 유형 매개 변수 V는 무제약 또는 무제한 유형이다.유형 매개 변수를 완전히 지정하지 않았을 때 유형 매개 변수에 대한 추가 제약을 지정해야 할 때가 있습니다.
예를 들어, Number 클래스로 제한되는 유형 매개변수 V를 사용하는 Matrix 클래스를 고려합니다.

public class Matrix<V extends Number> { ... } 


컴파일러는 Matrix 또는 Matrix 형식의 변수를 만들 수 있지만, Matrix 형식의 변수를 정의하려고 하면 오류가 발생합니다.유형 매개변수 V는 Number 제한으로 판단됩니다.유형 제한이 없는 경우 유형 매개변수를 Object에서 제한한다고 가정합니다.이것이 바로 이전 화면의 일반적인 방법의 예입니다. 목록을 허용하는 이유입니다.get() List컴파일러가 유형 매개 변수 V의 유형을 몰라도 상향 조정할 때 Object로 돌아갑니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기