2013-01-23 3 views
3

Possible Duplicate:
When we have wrappers classes, why primitives are supported?Java에 원시 데이터 유형이있는 이유는 무엇입니까?

Java 순수 객체 지향 언어를 만드는 래퍼 클래스가있는 경우 Java에 사용할 수있는 기본 데이터 형식이있는 이유는 무엇입니까 ???

+0

여기를 확인하십시오. http://stackoverflow.com/questions/6151497/why-java-is-not-pure-object-oriented-language – PermGenError

+0

@GanGnaMStYleOverFlowErroR : 왜 * 프리미엄 유형이 있는지 설명하지 않습니다. –

+2

[Java 10에서 기본 요소가 사라질 것이라는 루머가 있습니다.] (http://java.dzone.com/articles/oracle-discusses-features-java). – assylias

답변

9

효율성을 위해. 원시 타입의 변수는 값을 직접 포함합니다. 비 프리미티브 타입의 변수는 메모리 내의 다른 곳에 저장된 객체를 참조하는 참조입니다.

래퍼 유형의 값을 사용해야 할 때마다 JVM은 메모리에서 값을 가져 오기 위해 객체를 룩업해야합니다. 값이 포함 된 객체에 대한 참조가 아니라 값 자체가 변수에 들어 있기 때문에 기본 유형에는 필요하지 않습니다.

그러나 Java 프로그래밍 언어에서 기본 유형을 명시 적으로 표시해야하는 이유는 설명하지 않습니다. Java 언어와 JVM의 설계자는 모든 언어를 객체로 취급 할 수 있도록 언어 자체에서 기본 유형을 숨길 수 있습니다. 컴파일러는 그것을 커버 아래에서보다 효율적인 기본 유형으로 변환 할 수 있습니다.

JVM (Groovy, Scala 및 기타)에서 실행되는 일부 새로운 프로그래밍 언어를 사용하면 다음과 같은 작업을 수행 할 수 있습니다. 언어 자체에서 모든 것이 객체처럼 보이며 예를 들어 메소드를 호출 할 수 있습니다. 컴파일러는이를 원시 변수로 변환합니다.

자바 언어가 개발되었을 때 (1990 년대 전반기) 사람들은 그렇게 생각하지 않았으며 이제는 이것을 허용하는 언어가 급진적으로 변하기에는 너무 늦었다 고 생각합니다.

3

기본 데이터 형식은 개체 생성, 힙 할당에 비용이 많이 들고 성능상의 불이익을 초래하기 때문에 기본 데이터 형식이 그 주된 이유입니다. int, float 등의 원시 데이터 유형이 가장 많이 사용되므로 Object로 만드는 것은 엄청난 성능 저하가 될 것입니다. 따라서 자바 디자이너는 비 객체로 만드는 것이 더 좋을 것이라고 생각했습니다. 그리고 랩퍼는 성능면에서 타협 할 준비가되어 있지만 OOP 기능이 더 필요합니다. 따라서이 경우 래퍼를 사용할 수 있습니다. 희망이 정보는 당신을 도와줍니다.

+0

* 힙을 할당하는 것은 너무 비싸고 성능에 대한 불이익이있다. * => 너는 참고가 있니? 페널티가 있지만 그렇게 높지는 않습니다. – assylias

+0

예 : [Goetz states] (http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html) * HotSpot 1.4.2 이상에서 새로운 Object()에 대한 공통 코드 경로 약 10 개의 기계 명령어 *입니다. – assylias

+0

_ 기본 유형은 복합 값이 아닌 단일 값을 나타냅니다. Java가 인데 완전히 객체 지향적이지만 원시 유형은 그렇지 않습니다. 그것들은 과 비슷하지만 대부분의 객체 지향적이지 않은 언어에서 발견되는 단순한 유형입니다. 그 이유는 효율성이 입니다. 원시 타입을 객체로 만드는 것은 Java에서 완벽한 참조를 얻지 못하여 성능을 너무 떨어 뜨립니다. –

2

성능상의 이유로 SmallTalk과 같은 다른 언어에서는 int 또는 char과 같은 유형도 객체이며 메서드를 호출 할 수 있습니다. 이것은 이론적으로는 더 정확하지만 현재 구현은 느리게 실행됩니다. 원시 타입은 순도와 성능 사이에서 절충됩니다.

Java가 java.lang.Integer와 비슷한 래퍼 클래스를 제공하거나 더 많은 (null 값이 가능하거나 컬렉션 프레임 워크와 함께 사용되는 경우).