기본 데이터 형식이란 무엇입니까?


42

원시 데이터 유형에 대한 나의 이해는

언어에 의해 암시 적으로 제공되는 데이터 유형입니다 (다른 사용자 정의 클래스).

따라서 언어마다 다른 특정 데이터 유형 세트가 있으며 해당 언어의 기본 유형으로 간주됩니다. 맞습니까?

"기본 데이터 유형"과 "내장 데이터 유형"의 차이점은 무엇입니까? Wikipedia에 따르면 기본 데이터 유형은 두 가지 중 하나입니다.

PS-왜 "문자열"유형이 Java가 아닌 SNOBOL4에서 기본 유형으로 간주됩니까?

답변:


34

언어에 따라 다릅니다.

- 예를 들어, C 및 C와 같은 언어 ++, 당신은 내장 스칼라 유형의 숫자가 int, float, double, char그들이 간단한 구성 요소로 분해 될 수없는 이러한 의미에서 "원시"있다, 등. 이러한 기본 유형에서 포인터 유형, 배열 유형, 구조체 유형, 공용체 유형 등 새로운 유형을 정의 할 수 있습니다.

그런 다음 구식 Lisp와 같은 언어가 있습니다. 여기서 모든 것이 원자 또는 목록 입니다. 다시, 상기 정의에 의해, 원자는 더 단순한 것으로 분해 될 수 없다는 의미에서 "원시적"이다.

편집하다

내가 아는 한, "원시", "기본"및 "내장"이라는 용어는 거의 호환됩니다. 그래도 정말 독창적이기를 원한다면 "내장"(언어 정의에 의해 명시 적으로 제공되는) 유형과 여전히 "기본"또는 "기본"인 내장 유형에서 파생 된 유형을 구별 할 수 있습니다. 그것들은 더 간단한 요소들로 분해 될 수 없다는 점에서. Ctypedef기능을 사용하면 기존 유형의 새 유형 이름을 작성할 수 있습니다. Ada를 사용하면 제약 조건이있는 새 스칼라 유형을 만들 수 있습니다. 예를 들어 [-90.0, 90.0] 범위 밖의 값을 사용할 수 없다는 제약 조건이있는 내장 부동 유형에서 Latitude 유형을 파생시킬 수 있습니다. 더 간단한 컴포넌트로 나눌 수 없다는 점에서 여전히 기본 또는 기본 유형이지만 사용자 정의 형식이므로 "내장"유형으로 간주되지 않습니다.

다시, 이러한 개념은 약간 모호하며 실제로 상황에 따라 다릅니다. 예를 들어, "내장"유형의 개념은 BLISS와 같은 유형이없는 언어에는 의미가 없습니다.


기본 데이터 형식과 기본 데이터 형식의 차이점은 무엇입니까?
jsp99

1
"문자열"은 Java의 기본 데이터 유형입니까? (저는 Jesper의 답변에 대한 delnan의 의견을 보았습니다). 나는 당신의 의견 중 하나에서 "원시 유형이 당신이 누구에게 물어 보느냐에 따라"라고 말했기 때문에 당신의 의견을 알고 싶습니다.
jsp99

@Appy-편집 참조
John Bode

3
Java의 @Appy String은 복합 유형이므로 기본이 아닙니다. String 클래스 소스 코드 (JDK 폴더의 src.zip)를 보면 내부적으로 문자열이 문자 배열로 표시됩니다. 따라서 문자열을 개별 문자로 분해 할 수 있습니다. char기본 유형과 String복합 유형 을 만드는 더 작은 값으로 문자를 분해 할 수 없습니다 .
Jacek Prucia

2
@Appy 요점을 놓치고 있습니다. SNOBOL4 문자열은 분해 할 수 없습니다. 자바 문자열 수 있습니다. 그 차이입니다. 둘 다 내장되어 있지만 SNOBOL4 문자열 만 기본입니다.
Rig

19

로부터 자바 관점 :

Java에서는 기본 유형과 비 기본 유형이 매우 명확합니다.

기본 유형의 변수는 해당 유형의 값을 직접 포함합니다 (즉, 값 유형 ).

기본이 아닌 유형의 변수는 값을 직접 포함하지 않습니다. 대신, 객체에 대한 참조 (포인터와 유사)입니다. Java에서는 사용자 정의 값 유형을 작성할 수 없습니다.

자바는 여덟 기본 유형이있다 : byte, short, int, long, char, boolean, floatdouble. 다른 것은 기본이 아닌 유형입니다.


따라서 String 데이터 유형은 Java에서 기본이 아닙니다. 모든 Java main () 프로그램에서 "public static void main (String args [])"를 작성합니다. 왜? 왜 우리는 항상 main에서 String 인수를 전달해야합니까? 또한 C / C ++에 포함하는 방식으로 Java에서 문자열 유형을 가져올 필요가 없습니다 (예 : #include <string> 또는 std :: string 사용). 설명 해주십시오.
Maxood

7
@Maxood String 언어에서 특별한 지위를 가지고 있습니다 (리터럴을 얻습니다.의 서명으로 main, JLS에서 명시 적으로 허용하는 것으로 생각되는 인턴이 있고 자동으로 사용할 수 있습니다).하지만 기본 데이터 유형 은 아닙니다 . 내장 이라고 부를 수 있습니다 .

@Jesper 왜 프리미티브 유형이 더 빨리 작동합니까? 단순히 포장이 아닌 여분의 포장재가 없다는 사실 때문에? 프리미티브가 CPU에 내장되어있는 것과 같이 프리미티브와 비 프리미티브의 차이점을 알아 내려고합니다.
Abdul

Wikipedia에서 : "언어와 언어의 구현에 따라 기본 데이터 유형은 컴퓨터 메모리의 객체와 일대일로 대응되거나 일치하지 않을 수 있습니다. 그러나 일반적으로 기본 기본 데이터 유형에 대한 조작이 가장 빠른 언어가 될 것으로 예상합니다 "구체적인 것이 있습니다." --- 따라서이 일대일 대응은 빠른 속도의 근본 원인 인 반면 객체의 경우 일대일이 아닙니다. 제가 맞습니까?
Abdul

1
@ Abdul 너무 복잡하게하지 마십시오. CPU에는 여러 종류의 프리미티브 값 (예 : 32 비트 또는 64 비트 정수 또는 단정도 또는 배정도 부동 소수점 수)을 포함 할 수있는 다수의 레지스터가 있으며 CPU는 하드웨어에서 작업을 수행하기위한 명령을 구현합니다. 레지스터의 값 마지막 말은 본질적으로 정확합니다.
Jesper

9

프리미티브는 다른 데이터 유형으로 구축되지 않은 기본 데이터 유형입니다. 하나의 단일 값만 나타낼 수 있습니다. 모든 프리미티브는 필요에 따라 내장 데이터 유형이지만 (컴파일러는 알아야 함) 모든 내장 데이터 유형이 프리미티브 인 것은 아닙니다.

일부 언어에서는 컴파일러가 특별한 방식으로 처리 할 수 ​​있어야하므로 다른 유형으로 작성된 특정 유형에 대한 기본 지식을 가지고 있습니다. Delphi와 Visual Basic의 변형 (및 Boo와 "Duck")과 대부분의 OO 언어의 기본 객체 클래스를 예로들 수 있습니다.


감사합니다 :) 귀하의 답변은 매우 유익하지만 명확하게 이해할 수 없습니다. CAn (예를 들어 C / C ++ / Java로) 예제를 제공합니다.
jsp99

@Mason Wheeler 여기서는 느슨한 타이핑과 강한 타이핑이라는 용어를 사용합니다. 사람들이 VB는 느슨한 유형의 언어이고 Java는 강력한 유형의 언어라고 말합니다. 확인 해주세요.
Maxood

3
@Appy C ++는 문자열, 벡터 및 맵에 대한 클래스와 함께 제공됩니다. 이것들은 언어와 함께 제공되고 언어 정의 등에 있습니다. 그러나 C ++로 작성되어 표준 라이브러리에서 제공됩니다. 당신은 똑같이 행동하는 자신의 것을 쓸 수 있습니다. 이것을 int 또는 char과 비교하십시오. C ++에서는 고유 한 문자를 정의 할 수 없습니다. 클래스의 모든 연산자를 오버로드하고 비슷하지만 동일하게 작동하지 않는 것을 얻을 수 있습니다. 이것은 기본입니다. 기본적으로 해당 언어로는 구현할 수없는 언어로 정의 된 것입니다.
stonemetal

5

왜 "문자열"유형이 Java가 아닌 SNOBOL4에서 기본 유형으로 간주됩니까?

Java 언어 사양은 Java 컨텍스트에서 "primitive"라는 단어의 의미를 매우 명확하게 지정하고 Java String는이 사양을 준수하지 않지만 SNOBOL4 언어 사양은 SNOBOL4 및 SNOBOL4의 문자열 컨텍스트에서 "primitive"의 의미를 정의합니다. 해당 사양을 준수합니다.

더 이상 아무것도 없습니다. 각 언어의 사양은 특정 단어의 의미와 그 설명에 맞지 않는 단어를 정의합니다. 예를 들어, C 언어 사양은 매우 명확하게 무언가로 단어 "기능"의 의미를 정의 하지를 어떤 단어 "기능"보통 의미하지만 단어가 C 지역 사회 내에서 사용되는 방법입니다.


@Mittag 귀하의 답변에 따라, 나는 몇 가지 문구를 봤으며이 특정 주제에 대한 모든 의심을 거의 지우는 매우 멋진 링크 를 발견했습니다 . :).
jsp99

0

'primitive'데이터 유형은 메모리에 저장된 값이 있음을 의미합니다.이 값에는 메소드 나 내부 구조가 없습니다. 프리미티브는 외부 작업으로 만 작동 할 수 있습니다.

Java에서 기본 요소는 숫자 (int, long 등) 및 char입니다. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

당신의 가치가 구조를 가지고 있다면 (나는 여기서 스트럿을 생각하고 있습니다), 그것은 원시적이 아닙니다. 메소드 (객체 또는 클래스)가있는 경우 기본이 아닙니다.


2
C #의 원시 int데이터 형식 에는 메서드 있습니다.
Heinzi

예를 들어 주시겠습니까?
JoshRagem

var myString = 3.ToString();( Int32.ToString () 참조 ). 참고 것을 intC #이 인에 동의어 에 대한 Int32, 즉 Int32 이다 원시적 형 (자바, 달리 Integer다릅니다 int). 따라서 3.ToString()C #에서는 권투 가 필요 하지 않습니다 !
Heinzi

매우 흥미 롭습니다. 제공 한 링크는 'int'가 실제로 'Int32'클래스 (또는 프리미티브와 래퍼 클래스의 조합)의 객체임을 나타내므로 정의에 따라 'int'는 프리미티브가 아닙니다. :)
JoshRagem

1
@barlop : Java는 C ++의 자손 이 아닙니다 . Herbert Schildt가 그러한 단순한 사실을 똑바로 얻을 수 없다면, 나는 그 책의 나머지 부분도 신뢰할 것이라고 확신하지 못합니다. Java의 원래 디자이너 인 Patrick Naughton은 커다란 Objective-C 팬이었습니다. 실제로 그는 Scott McNealy가 Sun에 머물면서 새로운 언어를 디자인하도록 설득했을 때 NeXT의 Objective-C 작업에 대한 통지를 이미 받았습니다. 다른 독창적 인 디자이너 James Gosling은 Smalltalk (Objective-C의 직계 조상)와 Lisp (Smalltalk에 대한 영감)에 매우 익숙했습니다. 나중에 Objective-C 디자인 팀의 여러 구성원이 Sun으로 이전했습니다.
Jörg W Mittag

0

나는 몇 가지 정보를 발견했고 그것이 다른 대답에 도움이 될 것이라고 생각했다. 공유하고 싶습니다-

위키 백과는 말합니다-

컴퓨터 과학에서 기본 데이터 유형은 다음 중 하나입니다.

기본 유형 은 프로그래밍 언어에서 기본 빌딩 블록으로 제공하는 데이터 유형입니다. 대부분의 언어는 기본 유형에서 시작하여 더 복잡한 복합 유형을 재귀 적으로 구성 할 수 있습니다.
내장 유형 은 프로그래밍 언어가 내장 지원을 제공하는 데이터 유형입니다.

대부분의 프로그래밍 언어에는 모든 기본 데이터 유형이 내장되어 있습니다. 또한 많은 언어가 복합 데이터 유형 세트 (Java의 "문자열"유형)도 제공합니다.

이런 식으로 말하고 싶습니다-
기본 데이터 유형은 더 이상 분류 할 수없는 데이터 유형입니다 ( "문자열"유형은 "char"에서 만들 수 있지만 char은 어떤 데이터 유형으로도 "분할"될 수 없습니다 (대부분의 프로그래밍에서) 언어)이므로 기본 데이터 유형입니다.

SNOBOL4의 문자열 유형은 기본으로 간주됩니다. 정확한 이유를 모르겠습니다. SNOBOL4의 기본 기능뿐만 아니라 기본 기능입니다.

Java 스펙에서는 기본 유형으로 간주되는 데이터 유형 목록을 명확하게 언급합니다. 문자열 유형은 사양 이 아니기 때문에 기본 제공 유형 임에도 불구하고 Java의 기본 데이터 유형이 아닙니다.


-2

프리미티브는 언어 자체에서 제공하는 기본 데이터 유형입니다. C 언어의 예는 int, float, char 데이터 형식입니다. 언어의 기본 부분으로 제공됩니다.

프리미티브는 사용자 정의 변수 또는 객체입니다. 예를 들어 데이터를 저장하는 객체를 정의하거나 C의 구조체를 사용하여 변수를 정의 할 수 있습니다. 그것들을 사용하기 위해 먼저 정의해야했기 때문에 기본이 아닙니다.

예 : 직원, 학생, a_very_large_number_that_you_defined_yourself

설명을 추가하고 설명을 주석 으로 작성 기본 요소는 원래 언어와 함께 제공되는 변수로 생각되며 C ++의 String과 같은 변수는 New 키워드를 사용하여 선언해야합니다. 그것은 그것을 객체로 만들어 문자열이 원시가되지 않도록합니다.

답변 : 당신은 아마도 변수의 구현과 관련이 있습니다. 언어 핵심의 일부라면 원시적입니다. 그렇지 않으면 그렇지 않습니다. 예는 C ++의 문자열입니다. 이것은 핵심 변수가 아니며 New 키워드를 사용하여 선언됩니다. 따라서 원시적이지 않습니다.


답변 해주셔서 감사합니다 . 데이터 타입을 "primitive"로 분류하는 것은 구현에 달려 있습니까? C / C ++ 에서처럼 문자열을 char 배열로 저장하지만 명시 적으로 정의해야합니다. 따라서 다른 언어가 문자열을 저장하는 동일한 구현을 가지고 있지만 암시 적으로 제공하는 경우 데이터 유형 "string"은 해당 언어의 기본 요소가됩니까?
jsp99

@Appy-가능합니다. C는 string데이터 유형을 제공하지 않습니다 . 문자열은 기본 유형의 집계로 표시됩니다 char. C ++은 적절한 string데이터 유형을 도입 했지만 "기본"유형인지 여부는 사용자의 요청에 따라 다릅니다. 개인적으로 나는 그것을 분류하지 않을 것입니다. 그러나 나는 구식 BASIC 문자열 유형을 기본 유형으로 분류 할 것입니다. 아마도 완전히 임의적 인 이유가 있습니다.
John Bode

질문 자체에 대한 귀하의 의견을 해결했습니다. Plz는 편집을 참조하십시오.
Noname

2
C ++의 문자열은 new
jk

@jk 나는 C ++과 연락이 없었다. 네 말이 맞아 ans를 해결합니다.
Noname

-2

기본 유형과 사용자 정의 데이터 유형의 개념을 더 잘 이해하려면 다른 답변에없는 모든 개념이의 개념입니다 compiler.

lexemestokens로 선택 되는 개념을 이해하면 프리미티브가 컴파일러 자체적으로 알고있는 유일한 데이터 유형이라는 것을 알게 될 것입니다.

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