문제

나는 읽고 있었다 소프트웨어에 대한 Joel의 추가 정보 내가 만났을 때 조엘 스폴스키 특정 유형의 프로그래머에 대해 말하면서 int 그리고 Integer Java/C#(객체 지향 프로그래밍 언어)에서.

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

도움이 되었습니까?

해결책

자바에서는 'int' 유형은 기본 유형인 반면 'Integer' 유형은 객체입니다.

C#에서는 'int' 유형은 다음과 같습니다. System.Int32 그리고는 값 유형 (즉, java 'int'와 더 유사합니다).정수(다른 값 유형과 마찬가지로)는 다음과 같습니다. 박스형 ("래핑")을 개체로 만듭니다.


객체와 기본 요소의 차이점은 이 질문의 범위를 다소 벗어나지만 요약하면 다음과 같습니다.

사물 다형성을 위한 기능을 제공하고 참조로 전달되며(더 정확하게는 값으로 참조가 전달됨) 다음에서 할당됩니다. 더미.거꾸로, 기초 요소 값으로 전달되고 종종 할당되는 불변 유형입니다. 스택.

다른 팁

글쎄, Java에서 int는 기본 요소이고 Integer는 객체입니다.즉, 새로운 Integer를 만든 경우:

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

정수 객체 대int 기본 비교

위에 제공된 훌륭한 답변에 추가하고 boxing 및 unboxing에 대해 이야기하고 이것이 Java에 어떻게 적용되는지(C#에도 있지만) 설명하겠습니다.저는 Java 용어만 사용하겠습니다. 오 페이트 그것으로.

언급된 답변에 따르면, int 단지 숫자일 뿐입니다( 포장되지 않은 유형) 반면 Integer 객체입니다(숫자를 포함하므로 박스형 유형).Java 용어로 이는 (메소드를 호출할 수 없다는 것을 제외하고는) int), 저장할 수 없습니다 int 또는 컬렉션의 기타 비객체 유형(List, Map, 등.).보관하려면 먼저 해당 박스 유형으로 포장해야 합니다.

Java 5 이후에는 다음과 같은 것이 있습니다. 자동 복싱 그리고 자동 언박싱 이를 통해 권투/언박싱이 무대 뒤에서 수행될 수 있습니다.비교와 대조:자바 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 버전의 간결성에도 불구하고 두 버전 모두 동일한 바이트코드를 생성한다는 점에 유의해야 합니다.따라서 자동 박싱 및 자동 언박싱은 코드 작성이 적기 때문에 매우 편리하지만 이러한 작업은 하다 동일한 런타임 비용으로 배후에서 발생하므로 여전히 그 존재를 알고 있어야 합니다.

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

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

옳은: int 의 별칭입니다 System.Int32.
잘못된: float 의 별칭이 아닙니다. System.Float, 이 아니라면 System.Single

기본적으로 int는 C# 프로그래밍 언어의 예약어이며 System.Int32 값 유형.

그러나 float와 Float는 ''에 대한 올바른 시스템 유형과 동일하지 않습니다.float''는 System.Single입니다.유형 이름과 직접적으로 일치하지 않는 것처럼 보이는 예약 키워드가 있는 이와 같은 일부 유형이 있습니다.

C#에서는 '' 사이에 차이가 없습니다.int'' 그리고 ''System.Int32열거형을 정의하는 경우를 제외하고 '' 또는 다른 쌍이나 키워드/시스템 유형 중 하나입니다.열거형을 사용하면 사용할 저장소 크기를 지정할 수 있으며 이 경우 시스템 런타임 유형 이름이 아닌 예약된 키워드만 사용할 수 있습니다.

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

메소드의 선언은 다음과 같습니다.

int i;

변수를 정의합니다 i 유형의 System.Int32, 최적화에 따라 레지스터 또는 스택에 존재합니다.유형(구조체 또는 클래스)의 동일한 선언은 멤버 필드를 정의합니다.메소드 인수 목록의 동일한 선언은 지역 변수와 동일한 저장 옵션을 사용하여 매개변수를 정의합니다.(이 단락은 반복자 메서드를 혼합으로 가져오기 시작하면 유효하지 않습니다. 이들은 완전히 다른 짐승입니다.)

힙 개체를 얻으려면 boxing을 사용할 수 있습니다.

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

이는 false를 반환하지만:

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에서는 모든 것이 값으로 전달됩니다.객체의 경우 전달되는 값은 객체에 대한 참조입니다.따라서 Java에서 int와 Integer의 또 다른 차이점은 메소드 호출에서 전달되는 방식입니다.예를 들어

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

변수 기본 정수 유형 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를 보유하는 객체에 대한 참조로 전달됩니다.


@울프만드래곤:참조로 전달하면 다음과 같이 작동합니다.

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

증분을 호출하면 변수에 대한 참조(포인터)가 전달됩니다. .그리고 증가 함수는 변수를 직접 수정합니다. .

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

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 등...

개인적으로 나는 int, string, double 등을 선호합니다.그들은 필요하지 않기 때문에 using System; 성명 :) 어리석은 이유는 나도 알아요 ...

래퍼 클래스를 사용하는 데는 여러 가지 이유가 있습니다.

  1. 추가 동작을 얻습니다(예를 들어 메소드를 사용할 수 있음)
  2. null 값을 저장할 수 있지만 프리미티브에서는 null 값을 저장할 수 없습니다.
  3. 컬렉션은 기본 요소가 아닌 객체 저장을 지원합니다.

이것은 Java에 대해 이미 답변되었습니다. C# 답변은 다음과 같습니다.

"Integer"는 C#에서 유효한 형식 이름이 아니며 "int"는 System.Int32의 별칭일 뿐입니다.또한 Java(또는 C++)와 달리 C#에는 특별한 기본 유형이 없으며 C#에서 유형의 모든 인스턴스(int 포함)는 개체입니다.다음은 몇 가지 예시 코드입니다.

void DoStuff()
{
    System.Console.WriteLine( SomeMethod((int)5) );
    System.Console.WriteLine( GetTypeName<int>() );
}

string SomeMethod(object someParameter)
{
    return string.Format("Some text {0}", someParameter.ToString());
}

string GetTypeName<T>()
{
    return (typeof (T)).FullName;
}

int는 기본 변수를 선언하는 데 사용됩니다.

e.g. int i=10;

Integer는 Integer 클래스의 참조 변수를 생성하는 데 사용됩니다.

Integer a = new Integer();

Java와 같은 플랫폼에서는 ints는 프리미티브인 반면 Integer 정수 필드를 보유하는 객체입니다.중요한 차이점은 기본 요소는 항상 값으로 전달되고 정의에 따라 변경할 수 없다는 것입니다.

기본 변수와 관련된 모든 작업은 항상 새 값을 반환합니다.반면에 객체는 참조로 전달됩니다.객체에 대한 지점(참조라고도 함)도 값으로 전달된다고 주장할 수 있지만 내용은 그렇지 않습니다.

이전 답변에서 볼 수 없는 또 하나의 사항은 다음과 같습니다.Java에서는 Integer, Double, Float, Boolean과 같은 기본 래퍼 클래스...및 String은 불변이라고 가정하므로 해당 클래스의 인스턴스를 전달할 때 호출된 메서드는 공개 메서드에 의해 내부 데이터가 변경될 수 있는 대부분의 다른 클래스와 반대로 어떤 방식으로든 데이터를 변경할 수 없습니다.따라서 이 클래스에는 생성자 외에 'setter'가 아닌 'getter' 메소드만 있습니다.

Java 프로그램에서 문자열 리터럴은 힙 메모리의 별도 부분(리터럴에 대한 인스턴스만)에 저장되어 해당 인스턴스를 재사용하여 메모리를 절약합니다.

이전에 프로그래밍해 본 적이 있습니까(int)는 변수에 대해 설정할 수 있는 기본 유형 중 하나입니다(char, float 등과 같은).

그러나 Integer는 int 변수에 대해 일부 기능을 수행하는 데 사용할 수 있는 래퍼 클래스입니다(예: 문자열로 변환 또는 그 반대로 변환...). 그러나 래퍼 클래스의 메서드는 정적이므로 사용할 수 있습니다. Integer 클래스의 인스턴스를 생성하지 않고 언제든지.요약하자면 :

int x;
Integer y; 

x와 y는 모두 int 유형의 변수이지만 y는 Integer 클래스로 래핑되고 사용하는 여러 메서드가 있지만 Integer 래퍼 클래스의 일부 함수를 호출해야 하는 경우 간단하게 수행할 수 있습니다.

Integer.toString(x);

그러나 x와 y는 모두 정확하지만 이를 기본 유형으로 사용하려면 간단한 형식(x 정의에 사용됨)을 사용하십시오.

자바:

int, double, long, byte, float, double, short, boolean, char - 기초 요소.언어가 지원하는 기본 데이터 유형을 유지하는 데 사용됩니다.원시 유형은 객체 계층의 일부가 아니며 객체를 상속하지 않습니다.메소드를 참조하여 전달할 수 없습니다.

Double, Float, Long, Integer, Short, Byte, Character, 그리고 Boolean, 는 포장지 유형입니다. java.lang.모든 숫자 유형 래퍼는 지정된 값 또는 해당 값의 문자열 표현에서 객체를 생성할 수 있는 생성자를 정의합니다.객체를 사용하면 가장 간단한 계산에도 오버헤드가 추가될 수 있습니다.

JDK 5부터 Java에는 두 가지 매우 유용한 기능이 포함되었습니다.오토박싱과 오토언박싱.Autoboxing/unboxing은 기본 유형을 객체로 변환하거나 그 반대로 변환해야 하는 코드를 크게 단순화하고 능률화합니다.

생성자의 예:

Integer(int num)
Integer(String str) throws NumberFormatException
Double(double num)
Double(String str) throws NumberFormatException

박싱/언박싱의 예:

class ManualBoxing {
        public static void main(String args[]) {
        Integer objInt = new Integer(20);  // Manually box the value 20.
        int i = objInt.intValue();  // Manually unbox the value 20
        System.out.println(i + " " + iOb); // displays 20 20
    }
}

오토박싱/오토언박싱의 예:

class AutoBoxing {
    public static void main(String args[]) {
        Integer objInt = 40; // autobox an int
        int i = objInt ; // auto-unbox
        System.out.println(i + " " + iOb); // displays 40 40
    }
}

추신Herbert Schildt의 책이 참고 자료로 사용되었습니다.

정수 기본 데이터 유형입니다.정수 래퍼 클래스입니다.int 데이터를 객체로 저장할 수 있습니다.

int 변수는 32비트 부호 있는 정수 값을 보유합니다.Integer(대문자 I 사용)는 (클래스) 유형 Integer의 객체 또는 null에 대한 참조를 보유합니다.

Java는 둘 사이를 자동으로 캐스트합니다.Integer 개체가 int 연산자에 대한 인수로 발생하거나 int 변수에 할당되거나 int 값이 Integer 변수에 할당될 때마다 Integer에서 int로 변경됩니다.이 캐스팅을 boxing/unboxing이라고 합니다.

null을 참조하는 정수 변수가 명시적으로 또는 암시적으로 unboxing되면 NullPointerException이 발생합니다.

Java와 C#의 int와 Integer는 서로 다른 것을 나타내는 데 사용되는 서로 다른 두 가지 용어입니다.정확하게 저장할 수 있는 변수에 할당할 수 있는 원시적인 데이터형 중 하나이다.한 번에 선언된 유형의 값 하나.

예를 들어:

int number = 7;

어디 int 값 7을 보유하는 변수 번호에 할당된 데이터 유형입니다.그래서 int 객체가 아닌 원시적일 뿐입니다.

동안 Integer 정적 메소드가 있는 기본 데이터 유형에 대한 래퍼 클래스입니다.이는 객체가 필요한 메서드에 대한 인수로 사용될 수 있습니다. 여기서 int는 산술 표현식에 사용할 수 있는 정수 값이 필요한 메서드에 대한 인수로 사용될 수 있습니다.

예를 들어:

Integer number = new Integer(5);

두 언어(Java 및 C#) 모두에서 int 4바이트 부호 있는 정수입니다.

Java와 달리 C#은 부호 있는 정수 값과 부호 없는 정수 값을 모두 제공합니다.Java 및 C#은 객체 객체 지향적이므로 이러한 언어의 일부 작업은 런타임에서 제공되는 명령에 직접 매핑되지 않으므로 일부 유형의 객체의 일부로 정의되어야 합니다.

C#은 System.Int32 이는 힙의 참조 유형에 속하는 메모리의 일부를 사용하는 값 ​​유형입니다.

자바는 제공합니다 java.lang.Integer 이는 다음에서 작동하는 참조 유형입니다. int.의 방법 Integer 런타임 명령어로 직접 컴파일될 수 없습니다. 따라서 int 값을 상자에 넣어 Integer 인스턴스로 변환하고 일부 유형의 인스턴스를 예상하는 메서드를 사용합니다(예: toString(), parseInt(), valueOf() 등).

C# 변수 int에서는 다음을 참조합니다. System.Int32.Any 메모리의 4바이트 값은 System.Int32의 인스턴스로 조작할 수 있는 기본 int로 해석될 수 있습니다. 따라서 int는 System.Int32의 별칭입니다. System.Int32.When 다음과 같은 정수 관련 방법을 사용하여 int.Parse(), int.ToString() 등.정수는 FCL로 컴파일됩니다. System.Int32 다음과 같은 각각의 메서드를 호출하는 구조체 Int32.Parse(), Int32.ToString().

자바에서는 int type은 기본 데이터 유형입니다. Integer 유형은 객체입니다.

C#에서는 int 유형은 다음과 같은 데이터 유형이기도 합니다. System.Int32.안 integer (다른 값 유형과 마찬가지로) 객체에 박싱("래핑")할 수 있습니다.

Java에서 int는 기본 데이터 유형이고 Integer는 Helper 클래스이며 한 데이터 유형을 다른 데이터 유형으로 변환하는 데 사용됩니다.

예를 들어:

double doubleValue = 156.5d;
Double doubleObject  = new Double(doubleValue);
Byte myByteValue = doubleObject.byteValue ();
String myStringValue = doubleObject.toString();

기본 데이터 유형은 도우미 클래스가 복잡하고 힙 메모리에 저장되는 경우 사용 가능한 가장 빠른 메모리를 저장합니다.

"David Gassner" Java 필수 교육 참조.

"int"는 기본 데이터 유형이며 Java의 Wrapper Class에서는 "Integer"입니다."Integer"는 객체가 필요한 메서드에 대한 인수로 사용될 수 있으며, "int"는 산술 표현식에 사용할 수 있는 정수 값이 필요한 메서드에 대한 인수로 사용될 수 있습니다.

01.정수는 null일 수 있습니다.그러나 int는 null일 수 없습니다.

Integer value1 = null; //OK

int value2 = null      //Error

02.래퍼 클래스 유형 값만 컬렉션 클래스에 전달할 수 있습니다.

(래퍼 클래스 - 부울, 문자, 바이트, Short, Integer, Long, Float, Double)

List<Integer> element = new ArrayList<>();
int valueInt = 10;
Integer  valueInteger = new Integer(value);
element.add(valueInteger);

하지만 일반적으로 컬렉션 클래스에 기본 값을 추가합니까?포인트 02가 맞나요?

List<Integer> element = new ArrayList<>();
element.add(5);

네 02가 맞습니다. 왜냐하면 autoboxing.

Autoboxing은 Java 컴파일러가 원시 유형과 해당 래퍼 클래스 사이에서 자동 변환됩니다.

그런 다음 5 오토박싱을 통해 정수 값으로 변환합니다.

int 라이브러리 함수 C#에 미리 정의되어 있지만 Java에서는 다음 객체를 생성할 수 있습니다. Integer

(Java 버전) 간단한 단어로 int int는 원시적이고 Integer는 int를위한 래퍼 객체입니다.

Integer와 int를 사용하는 한 가지 예입니다. 비교하고 int 변수를 다시 null로 설정하면 오류가 발생합니다.

int a;
//assuming a value you are getting from data base which is null
if(a ==null) // this is wrong - cannot compare primitive to null
{
do something...}

Instead you will use,
Integer a;
//assuming a value you are getting from data base which is null
if(a ==null) // this is correct/legal
{ do something...}

내 지식에 따라 Java에서 학습자라면 int a;그런 다음 Java 일반에서는 다음과 같은 코드를 컴파일합니다. Integer a = new Integer().따라서 제네릭에 따라 Integer 사용되지는 않지만 int 사용.그래서 거기에는 그런 차이가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top