[java] Java와 C #에서 int와 Integer의 차이점은 무엇입니까?

내가 읽고 있던 소프트웨어에 대한 자세한 조엘를 내가 가로 질러 왔을 때 Spolsky 조엘 사이의 차이를 아는 프로그래머의 특정 유형에 대해 뭔가 말을 int하고 Integer자바 / C #에서을 (객체 지향 프로그래밍 언어).

그렇다면 차이점은 무엇입니까?



답변

Java 에서 ‘int’유형은 기본이고 ‘Integer’유형은 객체입니다.

C # 에서 ‘int’형식은 값 형식System.Int32 과 동일 하며 값 형식입니다 (예 : java ‘int’와 유사). 정수 (다른 값 유형과 마찬가지로 )를 개체에 상자묶을 수 있습니다 ( “랩핑”).


객체와 프리미티브의 차이점은이 질문의 범위를 벗어나지 만 요약하면 다음과 같습니다.

객체 는 다형성을위한 기능을 제공하고 참조로 전달되거나보다 정확하게 참조로 전달되며 에서 할당됩니다 . 반대로 프리미티브 는 값에 의해 전달되고 종종 스택 에서 할당되는 불변 유형입니다 .


답변

Java에서 int는 기본이고 Integer는 Object입니다. 의미, 당신이 새로운 정수를 만든 경우 :

Integer i = new Integer(6);

i에서 몇 가지 메소드를 호출 할 수 있습니다.

String s = i.toString();//sets s the string representation of i

int가있는 반면 :

int i = 6;

단순히 원시적이므로 메소드를 호출 할 수 없습니다. 그래서:

String s = i.toString();//will not work!!!

int는 객체가 아니기 때문에 오류가 발생합니다.

int는 Java에서 몇 가지 기본 요소 중 하나입니다 (char 및 기타 요소와 함께). 100 % 확신 할 수는 없지만 Integer 객체에는 int 속성과 그 속성과 상호 작용할 수있는 많은 메소드 (예 : toString () 메서드)가 있다고 생각합니다. 따라서 Integer는 int로 작업하는 멋진 방법입니다. String이 문자 그룹을 사용하는 멋진 방법 인 것처럼 말입니다.

Java는 C가 아니라는 것을 알고 있지만 C로 프로그래밍 한 적이 없으므로 이것이 가장 가까운 대답입니다. 도움이 되었기를 바랍니다!

정수 객체 javadoc

정수 Ojbect 대 int 기본 비교


답변

위에서 언급 한 훌륭한 답변에 덧붙여 권투와 언 박싱에 대해 이야기하고 이것이 C에 어떻게 적용되는지에 대해 이야기 할 것입니다 (C #에도 마찬가지 임). 좀 더이기 때문에 난 그냥 자바 용어를 사용합니다 노소 기정 그와 함께.

언급 한 답변 int은 숫자 ( unboxed type 이라고 함 )이지만 Integer객체 (숫자, 따라서 boxed type)를 포함합니다. 자바 측면에서, 그 수단 (떨어져 메소드를 호출 할 수 없다는에서이 int), 당신은 저장할 수 없습니다 int또는 기타 객체 유형 컬렉션 (에서 List, Map등). 저장하려면 먼저 해당 상자 유형으로 상자를 채워야합니다.

Java 5 이후에는 박싱 / 언 박싱을 배후에서 수행 할 수있는 자동 박싱자동 언 박싱 이라는 기능 이 있습니다. 비교 및 대조 : Java 5 버전 :

Deque<Integer> queue;

void add(int n) {
    queue.add(n);
}

int remove() {
    return queue.remove();
}

Java 1.4 이하 (제네릭도 없음) :

Deque queue;

void add(int n) {
    queue.add(Integer.valueOf(n));
}

int remove() {
    return ((Integer) queue.remove()).intValue();
}

Java 5 버전의 간결함에도 불구하고 두 버전 모두 동일한 바이트 코드를 생성합니다. 따라서 자동 복싱과 자동 Unboxing은 코드를 적게 작성하기 때문에 매우 편리하지만 이러한 작업 동일한 런타임 비용으로 뒤에서 발생하므로 여전히 존재해야합니다.

도움이 되었기를 바랍니다!


답변

다른 게시물 중 일부는 C #과 관련하여 약간 부정확하므로 여기에 게시하겠습니다.

올바른 : int 의 별칭입니다 System.Int32.
잘못됨 : float 에 대한 별칭이 아니지만에 대한 별칭입니다 System.Float.System.Single

기본적으로 int는 C # 프로그래밍 언어로 예약 된 키워드이며 System.Int32값 유형 의 별칭입니다 .

float” 의 올바른 시스템 유형 은 System.Single 이므로 float 및 Float는 동일하지 않습니다 . 유형 이름과 직접 일치하지 않는 키워드를 예약 한 유형이 있습니다.

C #에서는 열거 형을 정의 할 때를 제외하고 ” int”및 ” System.Int32”또는 다른 쌍 또는 키워드 / 시스템 유형 간에 차이가 없습니다 . 열거 형을 사용하면 사용할 스토리지 크기를 지정할 수 있으며이 경우 시스템 런타임 유형 이름이 아닌 reserved 키워드 만 사용할 수 있습니다.

int의 값이 스택, 메모리 또는 참조 힙 객체로 저장되는지 여부는 컨텍스트와 사용 방법에 따라 다릅니다.

메소드의 선언 :

int i;

최적화에 따라 레지스터 또는 스택에있는 itype 의 변수 를 정의합니다 System.Int32. 유형 (struct 또는 클래스)에서 동일한 선언은 멤버 필드를 정의합니다. 메소드 인수 목록의 동일한 선언은 로컬 변수와 동일한 스토리지 옵션을 사용하여 매개 변수를 정의합니다. (이 단락은 반복기 메소드를 믹스로 가져 오기 시작하면 유효하지 않습니다. 이것은 모두 다른 짐승입니다)

힙 객체를 얻으려면 권투를 사용할 수 있습니다.

object o = i;

이것은 i힙에 내용의 박스 복사본을 만듭니다 . IL에서는 힙 객체의 메서드에 직접 액세스 할 수 있지만 C #에서는이를 int로 다시 캐스팅해야합니다. 그러면 다른 복사본이 만들어집니다. 따라서 힙에있는 객체는 새로운 int 값의 새 박스 복사본을 만들지 않고 C #에서 쉽게 변경할 수 없습니다. (이 단락은 모든 것을 쉽게 읽을 수는 없습니다.)


답변

Java 1.5 및 오토 박싱 과 관련 하여 Integer 객체를 비교할 때 중요한 “질의”가 있습니다.

Java에서 -128에서 127 사이의 값을 가진 Integer 객체는 변경할 수 없습니다 (즉, 하나의 특정 정수 값, 예를 들어 23 일 경우 23을 사용하여 프로그램을 통해 인스턴스화 된 모든 Integer 객체는 정확히 동일한 객체를 가리킴).

예를 들어 true를 반환합니다.

Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2); //  true

이것이 거짓을 반환하는 동안 :

Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); //  false

==는 참조로 비교합니다 (변수가 동일한 객체를 가리킴).

이 결과는 사용중인 JVM에 따라 다를 수 있습니다. Java 1.5 용 사양 자동 상자를 사용하려면 정수 (-128 ~ 127)가 항상 동일한 래퍼 객체에 상자로 묶어야합니다.

해결책? =) Integer 객체를 비교할 때는 항상 Integer.equals () 메소드를 사용해야합니다.

System.out.println(i1.equals(i2)); //  true

java.net에 대한 추가 정보 bexhuff.com의


답변

Java에는 JVM 에 두 가지 기본 유형이 있습니다 . 1) 기본 유형 및 2) 참조 유형. int는 기본 유형이고 Integer는 클래스 유형 (일종의 참조 유형)입니다.

기본 값은 다른 기본 값과 상태를 공유하지 않습니다. 유형이 기본 유형 인 변수는 항상 해당 유형의 기본 값을 보유합니다.

int aNumber = 4;
int anotherNum = aNumber;
aNumber += 6;
System.out.println(anotherNum); // Prints 4

객체는 동적으로 생성 된 클래스 인스턴스 또는 배열입니다. 참조 값 (종종 참조)은 이러한 객체에 대한 포인터이며 객체가없는 특수 null 참조입니다. 동일한 객체에 대한 많은 참조가있을 수 있습니다.

Integer aNumber = Integer.valueOf(4);
Integer anotherNumber = aNumber; // anotherNumber references the 
                                 // same object as aNumber

또한 Java에서는 모든 것이 가치에 의해 전달됩니다. 객체의 경우 전달 된 값이 객체에 대한 참조입니다. 따라서 자바에서 int와 Integer의 또 다른 차이점은 메소드 호출에서 어떻게 전달되는지입니다. 예를 들어

public int add(int a, int b) {
    return a + b;
}
final int two = 2;
int sum = add(1, two);

변수 2 는 기본 정수 유형 2 로 전달됩니다.

public int add(Integer a, Integer b) {
    return a.intValue() + b.intValue();
}
final Integer two = Integer.valueOf(2);
int sum = add(Integer.valueOf(1), two);

변수 2 는 정수 값 2를 보유한 객체에 대한 참조로 전달됩니다.


@ WolffDragon : 참조로 전달하면 다음과 같이 작동합니다.

public void increment(int x) {
  x = x + 1;
}
int a = 1;
increment(a);
// a is now 2

증가가 호출되면 변수 a에 참조 (포인터)를 전달 합니다 . 그리고 증가 함수는 변수 a를 직접 수정합니다 .

그리고 객체 유형의 경우 다음과 같이 작동합니다.

public void increment(Integer x) {
  x = Integer.valueOf(x.intValue() + 1);
}
Integer a = Integer.valueOf(1);
increment(a);
// a is now 2

지금 차이가 보입니까?


답변

C #에서, INT는 단지입니다 별칭System.Int32대한 문자열 System.String에 대한 이중, System.Double등 …

개인적으로 나는 using System;진술이 필요하지 않기 때문에 int, string, double 등을 선호합니다 . 🙂 어리석은 이유, 나는 알고 있습니다 …