Java에서 부울 대 부울


197

Java Integer와 관련 int하여 토론이 있습니다 . 전자의 기본값 null은 후자에 있습니다 0. 어떻 Booleanboolean?

내 응용 프로그램의 변수는 0/ 1값을 가질 수 있습니다 . 나는 boolean/ 를 사용 Boolean하고 싶습니다 int. 대신 Boolean/ boolean를 사용할 수 있습니까 ?


2
시스템 설계상의 이유로 "사용자가 아직 결정하지 않았습니다"옵션이 "참"또는 "거짓"이 아니므로 부울을 선택합니다. 100 % 확실한 true / false 옵션이 충분한 경우에만 부울 프리미티브를 사용합니다. 데이터베이스에서 NULL 옵션은 문제없이 일반적으로 볼 수 있습니다 (또는 나중에 필요에 NOT NULL 제한을 제거하여)
CsBalazsHungary

2
Java의 부울과 부울의 차이점무엇입니까? (GWT는 차이가 없기 때문에).
Dan Dascalescu

답변:


272

, 사용할 수 있습니다Boolean / boolean대신 .

첫 번째는 Object이고 두 번째는 기본 유형입니다.

  • 처음에는 더 많은 메소드를 얻을 수 있습니다.

  • 두 번째는 메모리 비용을 고려하여 저렴합니다 . 두 번째는 더 많은 메모리를 절약하므로 계속하십시오.

이제 길을 선택하십시오.


70
당신은 이것을 "두 번째는 더 많은 메모리를 절약 할 것입니다. 부울의 유용한 메소드는 대부분 인스턴스가 없어도 호출 할 수 있습니다.
DJClayworth

3
새로운 Boolean (value) 대신 Boolean.valueOf (value)를 사용하는 한 메모리는 문제가되지 않습니다.
Greg Case

2
에 대해서는 대신 대신 AsyncTask사용할 수 있습니다 . Booleanboolean
랩터

99
그것은 주목해야 부울 실제로 3 개 상태를 갖는다 ... true, falsenull부울 논리 상태가 2 ( truefalse)
respectTheCode

14
부울은 trillean입니다 :)
Topera

50

Boolean 부울 프리미티브 유형을 래핑 합니다. JDK 5 이상에서 Oracle (또는 Oracle이 구입하기 전에 Sun)은 자동 박스 / 언 박스를 도입 했습니다.

boolean result = Boolean.TRUE;

또는

Boolean result = true; 

본질적으로 컴파일러는

Boolean result = Boolean.valueOf(true);

따라서 대답은 그렇습니다.


4
참고 : 당신은 항상 안전하게를 할당 할 수 없습니다 BooleanA를 boolean. 귀하의 경우 BooleanIS null와 당신이에 할당하려고 boolean, 그것은 발생합니다 NullPointerException런타임에.
Duncan Luk

그렇다면 Boolean클래스가 동일한 부울 변수를 참조하는 다른 클래스의 값을 변경 했는데도 왜 값이 항상 거짓입니까? Boolean우리가 다른 인스턴스 클래스에서 참조 할 수 없다면 / 인수로 전달할 수 없다면 이것의 요점은 무엇 입니까?
user924

답을 찾았습니다. 우리는 AtomicBoolean차이점 클래스에서 그것을 사용 하고 참조 할 수 있습니다
user924

35

지금까지 그들이 "자신"에 / 특정 언어 프로그래밍 대신의 장면 뒤에 더 큰 그림을 돌보는에 초점 인공 용어에 집중할 때부터 (제공 답변을 연장하는 비트입니다 프로그래밍 언어를 만드는 , 즉 일을 일반적으로, 형식 안전성과 메모리 고려 사항이 차이를 만듭니다) :

int는 부울이 아닙니다

치다

    boolean bar = true;      
    System.out.printf("Bar is %b\n", bar);
    System.out.printf("Bar is %d\n", (bar)?1:0);
    int baz = 1;       
    System.out.printf("Baz is %d\n", baz);
    System.out.printf("Baz is %b\n", baz);

출력

    Bar is true
    Bar is 1
    Baz is 1
    Baz is true

3 번째 줄의 Java 코드 (bar)?1:0bar ( boolean )를 암시 적으로 int 로 변환 (캐스팅) 할 수 없음을 보여 줍니다 . JVM 뒤에 구현의 세부 사항을 설명하지 않고 메모리 크기와 같은 낮은 수준의 고려 사항에서 유형 안전보다 값을 선호해야한다고 지적했습니다. 특히 형식 안전성이 검사 형식이 다음과 같은 부울 형식과 같이 진정으로 / 완전히 사용되지 않는 경우

\ in {0,1} 값이면 부울 유형으로 캐스트되고, 그렇지 않으면 예외가 발생합니다.

모두 {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}입니다. 과잉 인 것 같아요? 형식 안전성은 기본 형식의 암시 적 캐스팅이 아니라 사용자 정의 형식에서 매우 중요합니다 (마지막은 첫 번째 형식에도 포함됨).

바이트는 유형 또는 비트가 아닙니다

메모리에서 {0,1} 범위의 변수는 특별히 처리하지 않는 한 (예 : 메모리에 멋지게 포장 됨-8 "부울") 최소 바이트 또는 단어 (레지스터 크기에 따라 xbits)를 차지합니다. 비트를 1 바이트로-앞뒤로).

추가 값 패킹 (예 : 비트 시프트 또는 산술 사용)보다 유형 안전 (특정 유형의 상자에 값을 넣거나 감는 것과 같이)을 선호함으로써 더 많은 메모리를 확보하는 것보다 적은 코드를 작성하는 것을 효과적으로 선택합니다. 반면에 항상 부울보다 가치가없는 모든 변환을 용이하게하는 사용자 정의 사용자 유형을 정의 할 수 있습니다.

키워드와 유형

마지막으로 귀하의 질문은 키워드유형을 비교하는 것 입니다. 유형 (다른 키워드 클래스를 사용하는 일반 복합 사용자 정의 가능 클래스 ) 또는 다른 말로 키워드 ( " 기본 "으로 표시)를 사용하거나 선호함으로써 성능을 얻는 이유 또는 방법을 설명하는 것이 중요하다고 생각합니다.

boolean foo = true;

vs.

Boolean foo = true;

첫 번째 "thing"(유형)은 이유없이 확장 (하위 분류) 할 수 없습니다. 프리미티브랩핑 클래스 의 Java 용어를 효과적으로 인라인 값 (LITERAL 또는 상수 대체로 유추 할 수있는 경우 또는 컴파일러가 값을 래핑하는 경우 대체 할 수있는 경우 컴파일러가 직접 대체하는 상수) 으로 간단히 변환 할 수 있습니다 .

사소한 이유로 인해 최적화가 이루어집니다.

"런타임 캐스팅 작업이 줄어들면 속도가 더 빨라집니다."

그렇기 때문에 실제 타입 추론이 수행 될 때 필요한 경우 모든 타입 정보로 클래스를 래핑 (wrapping) 할 수도 있습니다 (또는 여전히 변환 / 캐스팅).

그래서, 차이 부울부울 에 정확하게 컴파일런타임 (조금 멀리 가고 있지만 거의 instanceof를getClass () ).

마지막으로 오토 박싱은 프리미티브보다 느립니다.

자바가 오토 박싱을 할 수 있다는 사실 은 단지 "구문 설탕"일뿐입니다. 속도를 높이 지 않고 코드를 적게 작성할 수 있습니다. 그게 다야. 유형 정보 컨테이너로 캐스트 및 랩핑은 여전히 ​​수행됩니다. 성능상의 이유로, 유형 안전을 구현하기 위해 유형 정보로 클래스 인스턴스를 작성하는 추가 하우스 키핑을 항상 생략하는 산술을 선택하십시오. 유형 안전 부족은 성능을 얻기 위해 지불하는 가격입니다. 부울 값식이있는 코드의 경우 유형 안전성 (더 적고 따라서 암시 적 코드를 작성하는 경우)은 if-then-else 흐름 제어에 중요합니다.


16

당신이 사용할 수있는 부울 상수를 - Boolean.TRUE그리고 Boolean.FALSE대신 0하고 1. boolean프리미티브가 당신이 따르는 것이라면 변수 유형을 만들 수 있습니다 . 이런 식으로 새 Boolean객체 를 만들 필요가 없습니다 .


4

한 가지 관찰 : (이것은 부작용을 생각할 수 있지만)

부울 이 기본 요소 인 경우 예 또는 아니오라고 말할 수 있습니다.

부울 은 객체입니다 (예 또는 아니오 또는 '모름'을 의미 할 수 있습니다 (예 : null)).


3

기본적으로 부울은 기본 데이터 유형을 나타내고, 부울은 참조 데이터 유형을 나타냅니다. 이 이야기는 Java가 순수한 객체 지향이되고 싶을 때 시작됩니다. 래퍼 클래스 개념이 기본 데이터 유형을 사용하게되었습니다.

boolean b1;
Boolean b2;

b1그리고 b2동일하지 않습니다.


1

부울 / 부울을 사용할 수 있습니다. 단순함은 갈 길입니다. 특정 API (컬렉션, 스트림 등)가 필요하지 않고 필요한 것으로 예상하지 않는 경우 기본 버전 (부울)을 사용하십시오.

  1. 프리미티브를 사용하면 널값을 전달하지 않습니다.
    이런 함정에 빠지지 않을 것입니다. 아래 코드는 NullPointerException (from : 부울, 조건부 연산자 및 자동 상자)을 발생시킵니다 .

    public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }

  2. 객체가 필요할 때 부울을 사용하십시오. 예 :

    • 부울 스트림,
    • 선택 과목
    • 부울 모음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.