웹사이트 검색

Java의 데이터 유형 이해


저자는 Write for DOnations 프로그램을 선택했습니다.

소개

PHP. 동적으로 유형이 지정되는 언어를 사용하면 변수의 데이터 유형을 지정할 필요가 없으며 이는 안도감처럼 보일 수 있습니다.

그러나 각 데이터 유형에는 특정 리소스 요구 사항이 있기 때문에 데이터 유형을 알고 적절하게 사용하면 개발자가 코드를 최적화할 수 있습니다. 또한 실수 등으로 하나의 데이터 유형을 지정하고 다른 유형을 저장하려고 하면 코드를 컴파일할 수 없습니다. 따라서 정적으로 유형이 지정된 언어를 사용하면 테스트 전에 오류를 감지할 수 있습니다.

Java에는 Java 프로그램에서 정보를 저장하고 사용하여 Java에서 일반적으로 사용되는 일부 데이터 유형에 대해 배우기 위한 두 개의 변수가 있습니다. 이것은 모든 데이터 유형에 대한 완전한 개요는 아니지만 이 가이드는 Java에서 사용할 수 있는 옵션에 익숙해지는 데 도움이 됩니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • 예제와 함께 Java 프로그램을 실행할 수 있는 환경입니다. 로컬 컴퓨터에서 이를 설정하려면 다음이 필요합니다.\n
    • JDK(Java Development Kit)에서 제공하는 컴파일러와 함께 컴퓨터에 Java(버전 11 이상)가 설치되어 있습니다. Ubuntu 및 Debian의 경우 Java 설치를 위한 다운로드 옵션 단계를 따르십시오.
    • 코드 예제를 컴파일하고 실행하기 위해 이 자습서에서는 Introduction to JShell 가이드를 사용합니다.

    Java 및 객체 지향 프로그래밍에 익숙해야 합니다. Java로 첫 번째 프로그램을 작성하는 방법 튜토리얼에서 찾을 수 있습니다.

    기본 유형

    Java 기본 유형은 Java에서 가장 단순하고 기본적인 데이터 유형입니다. 숫자 및 문자와 같은 원시 값을 나타냅니다. 가장 자주 사용되는 기본 데이터 유형은 int(정수), boolean(부울 값) 및 char(문자)입니다. 나머지는 공식 Java 데이터 유형 문서에서 찾을 수 있습니다.

    정수

    정수는 음수 및 양수 정수입니다. Java에서는 int를 사용하여 저장합니다. int-2,147,483,648에서 2,147,483,647까지 대부분의 목적에 충분히 큰 숫자를 수용할 수 있습니다.

    예제에서 int가 어떻게 사용되는지 살펴보겠습니다.

    int theAnswer = 42;
    

    기본 유형은 항상 소문자(int)로 시작합니다. Java 구문 규칙에서는 먼저 데이터 유형(int)을 지정한 다음 해당 이름(theAnswer)을 지정해야 합니다. 그런 다음 등호(=)와 함께 값 42를 변수에 할당합니다.

    데이터 유형에 관계없이 특수 문자를 앞에 추가하지 않고 이름을 직접 지정하여 변수를 사용합니다. Java가 변수로 인식할 수 있기 때문입니다.

    참고: 변수 theAnswer의 이름과 이 자습서의 다른 모든 변수는 카멜 케이스로 작성됩니다. 사용에 대한 엄격한 요구 사항은 없지만 Java에서 허용되는 명명 규칙입니다.

    변수를 선언하고 나면 다음과 같은 메소드에서 참조하여 사용할 수 있습니다.

    int theAnswer = 42;
    System.out.println("The answer to all questions is " + theAnswer);
    

    두 번째 줄에서는 System.out 패키지의 내장 메서드 println을 사용하여 콘솔에 theAnswer를 인쇄합니다. 이는 변수가 예상대로 선언되었는지 확인하기 위해 변수를 테스트하는 가장 간단한 방법입니다.

    작동 중인 이 코드를 보려면 Java Shell 도구를 사용하십시오. Java를 설치한 후 로컬 컴퓨터에서 터미널 또는 명령 프롬프트를 열고 jshell을 입력합니다.

    1. jshell

    출력은 다음과 유사합니다.

    Output
    | Welcome to JShell -- Version 11.0.16 | For an introduction type: /help intro jshell>

    이 자습서의 코드 예제를 콘솔에 붙여넣을 수 있습니다. 완료되면 /exit를 입력하여 jshell을 종료할 수 있습니다.

    int를 선언하고 사용하려면 jshell 콘솔에 다음 줄을 붙여넣습니다.

    1. int theAnswer = 42;
    2. System.out.println("The answer to all questions is " + theAnswer);

    다음 출력이 표시됩니다.

    Output
    theAnswer ==> 42 The answer to all questions is 42

    이 출력은 int 변수 theAnswer를 42(theAnswer ==> 42)로 올바르게 설정했음을 확인합니다. 또한 메서드에 theAnswer를 전달하여 성공적으로 사용했고 메서드는 예상 변수 값을 생성했습니다.

    부울

    부울 값은 true 또는 false입니다. Java에서는 boolean을 사용하여 저장합니다. 예를 들어 Java가 재미있는지 여부를 정의하는 boolean 변수를 생성해 보겠습니다.

    boolean isJavaFun = true;
    

    변수 isJavaFuntrue로 정의합니다. 대체 부울 값은 false입니다.

    위의 변수를 사용하여 다음과 같이 Java is fun: true 문장을 인쇄할 수 있습니다.

    1. boolean isJavaFun = true;
    2. System.out.println("Java is fun: " + isJavaFun);

    jshell에서 이 줄을 실행하면 다음과 같은 결과가 생성됩니다.

    Output
    isJavaFun ==> true Java is fun: true

    int 예제와 마찬가지로 println 메서드는 괄호 안에 제공된 인수를 인쇄합니다. 더하기 기호(+)는 \Java is fun:\ 문자열을 isJavaFun 변수와 연결하거나 결합하므로 실제로는 문자열 <Java는 재미있습니다: 참.

    캐릭터

    단일 영숫자 문자를 저장하려면 char를 사용합니다. 예를 들어:

    char firstLetter = 'a';
    

    문자 a는 작은따옴표로 둘러싸여 있습니다. 작은따옴표는 char 값에만 사용할 수 있습니다. 나중에 배우게 되겠지만 큰따옴표는 문자열에 사용됩니다.

    char는 단일 문자에 할당된 변수가 필요하지 않기 때문에 특별히 유용한 유형처럼 보이지 않습니다. 그러나 char는 기본적으로 char 값의 모음인 String과 같은 문자열 클래스의 빌딩 블록으로 사용됩니다.

    이 섹션에서 본 것처럼 기본 유형 변수의 선언 및 사용은 정수와 같은 단순한 값을 나타내므로 간단합니다. 이러한 값은 바로 사용할 수 있으며 개체 만들기, 메서드 호출 등과 같은 추가 작업이 필요하지 않습니다.

    참조 유형

    이 시리즈의 첫 번째 자습서인 Java로 첫 번째 프로그램을 작성하는 방법에서는 Java 코드가 클래스로 구성되고 이러한 클래스가 객체를 생성하는 템플릿으로 사용된다는 것을 배웠습니다. 이러한 개체가 변수에 할당되면 이러한 개체를 가리키거나 참조하는 것입니다. 이러한 경우 변수는 참조 유형으로 분류됩니다. 기본 유형 변수는 개체를 가리킬 수 없기 때문에 이러한 변수는 비기본이라고도 합니다.

    개체는 고급 속성이 있고 해당 메서드를 트리거할 때 작동할 수 있기 때문에 강력합니다. 그러나 이를 가리키는 변수가 없으면 이러한 개체에 액세스할 수 없으며 실제로 사용할 수 없습니다. 이것이 참조 유형 변수가 Java 및 객체 지향 프로그래밍 전체에 필수적인 이유입니다.

    참고: 참조 유형은 클래스에서 생성된 개체를 가리킵니다. 혼동을 피하기 위해 참조 유형과 생성된 개체는 다음 예제에서 동일한 클래스가 됩니다.

    그러나 복잡한 프로그램에서는 이런 경우가 거의 없습니다. Java에서 인터페이스는 특정 동작에 대한 요구 사항 그룹이며 이러한 요구 사항은 하나 이상의 클래스로 충족될 수 있습니다. 인터페이스의 요구 사항을 충족하는 클래스를 이 인터페이스를 구현한다고 합니다. 따라서 복잡한 프로그램에서는 인터페이스의 참조 유형으로 변수를 선언하는 것이 일반적입니다. 이러한 방식으로 이 동작의 구체적인 구현에 변수를 연결하지 않고 변수가 표시해야 하는 동작을 지정합니다. 이렇게 하면 변수가 사용되는 방식을 변경하지 않고도 변수가 가리키는 구현을 쉽게 변경할 수 있습니다. 이 복잡한 개념은 상속다형성에 대한 고급 주제의 일부이며 Java 시리즈에서 별도의 자습서가 될 것입니다.

    소수의 기본 유형만 있지만 클래스(및 인터페이스)의 수에 제한이 없고 각 클래스가 참조 유형을 나타내므로 참조 유형은 실질적으로 무제한입니다. Java에는 필수 기능을 제공하는 많은 내장 클래스가 있습니다. 가장 자주 사용되는 것은 핵심 java.lang 패키지에서 찾을 수 있습니다. 이 섹션에서 그 중 일부를 검토할 것입니다.

    문자열 클래스

    String 클래스는 문자열을 구성하는 문자 조합을 나타냅니다. String 또는 기타 참조 유형 변수를 선언하려면 먼저 해당 유형을 지정하고 이름을 지정합니다. 그런 다음 등호를 사용하여 값을 할당합니다. 지금까지는 기본 유형으로 작업하는 것과 유사합니다. 그러나 참조 유형은 개체를 가리키므로 개체가 아직 생성되지 않은 경우 개체를 만들어야 합니다. 다음은 예입니다.

    String hello = new String("Hello");
    

    hello는 참조 유형이 String인 변수의 이름입니다. 새 String 개체에 할당합니다. 새 String 객체는 클래스 이름(이 경우 String)과 함께 new 키워드로 생성됩니다. 클래스 String은 대문자로 시작합니다. 규칙에 따라 모든 클래스와 참조 유형은 대문자로 시작합니다.

    각 클래스에는 새 개체를 만드는 데 사용되는 생성자라는 특수 메서드가 있습니다. 클래스 이름 끝에 괄호(())를 추가하여 이 생성자를 호출할 수 있습니다. 생성자는 \Hello\ 매개변수가 String의 생성자에 적용되는 위의 예에서와 같이 매개변수를 허용할 수 있습니다.

    hello 변수가 예상대로 작동하는지 확인하려면 다음과 같이 println 메서드에 다시 전달합니다.

    1. String hello = new String("Hello");
    2. System.out.println(hello);

    jshell에서 이 줄을 실행하면 다음과 같은 결과가 생성됩니다.

    Output
    hello ==> "Hello" Hello

    이번에는 출력에서 변수 helloHello로 설정되었음을 확인합니다. 그런 다음 동일한 Hello가 새 줄에 인쇄되어 println() 메서드가 처리했음을 확인합니다.

    래퍼 클래스

    이전 섹션에서는 자주 사용되는 String 참조 유형으로 작업했습니다. 널리 사용되는 다른 참조 유형은 소위 기본 유형의 래퍼입니다. 래퍼 클래스는 기본 데이터를 래핑하거나 포함하므로 이름이 지정됩니다. 모든 기본 유형에는 래퍼 대응 항목이 있으며 다음은 몇 가지 예입니다.

    • Integer: int 값을 래핑합니다.
    • 문자: 문자 값을 래핑합니다.
    • 부울: 부울 값을 래핑합니다.

    이러한 래퍼는 간단한 기본 값을 강력한 개체로 업그레이드할 수 있도록 존재합니다. 각 래퍼에는 저장하도록 설계된 값과 관련된 즉시 사용 가능한 메서드가 있습니다.

    예를 들어 Integer를 살펴보겠습니다. 이전 섹션에서는 new 키워드를 사용하여 String 개체를 만들었습니다. 그러나 일부 클래스는 개체를 획득하기 위한 특수 메서드를 제공하고 권장하기도 하며 Integer도 그 중 하나입니다. Integer의 경우 특별한 방법을 사용하는 것은 대부분 리소스 최적화에 관한 것이지만 다른 경우에는 복잡한 객체의 구성을 단순화하는 것일 수 있습니다.

    다음 예에서는 valueOf 메서드를 사용하여 값이 42theAnswer라는 Integer 변수를 만듭니다.

    1. Integer theAnswer = Integer.valueOf(42);
    2. System.out.println(theAnswer);

    jshell에서 다음과 같은 결과를 얻을 수 있습니다.

    Output
    theAnswer ==> 42 42

    Integer 메서드 valueOf(42)를 호출하면 이 값을 가진 개체를 제공하도록 Java에 지시할 수 있습니다. 배후에서 Java는 캐시에 그러한 값을 가진 개체가 이미 있는지 여부를 확인합니다. 있는 경우 객체는 theAnswer 변수에 연결됩니다. 없는 경우 theAnswer 변수에 대해 새 개체가 생성됩니다.

    많은 기본 제공 클래스는 성능상의 이유로 이러한 메서드를 제공하며 필수는 아니지만 사용을 권장합니다. Integer의 경우 여전히 new 키워드로 개체를 생성할 수 있지만 사용 중단 경고가 표시됩니다.

    String 및 래퍼 외에도 java.lang 패키지 요약에서 찾을 수 있는 다른 유용한 내장 참조 유형이 있습니다. 이러한 고급 참조 유형 중 일부를 완전히 이해하려면 추가 설명이나 사전 지식이 필요합니다. 그렇기 때문에 Java 시리즈의 다음 자습서에서 그 중 일부를 다룰 것입니다.

    리터럴

    리터럴은 코드에서 직접 사용할 수 있는 고정 값을 나타내므로 기본 유형과 참조 유형 모두에 할당할 수 있습니다. 리터럴에는 몇 가지 유형이 있으며 다음과 같이 분류할 수 있습니다.

    원시 유형 리터럴

    기본 유형 섹션에서 이미 몇 가지 리터럴을 사용했습니다. 각 프리미티브 유형에는 42, atrue 예제와 같은 리터럴이 있습니다. 42와 같은 정수는 정수 리터럴입니다. 마찬가지로 a와 같은 문자는 문자 리터럴이고 truefalse는 부울 리터럴입니다.

    기본 유형 리터럴을 사용하여 참조 유형에 대한 값을 만들 수도 있습니다. int 리터럴은 Integer.valueOf(42) 코드로 Integer 객체를 만드는 데 사용되었습니다. 이에 대한 약어도 있으며 다음과 같이 값을 직접 할당할 수 있습니다.

    Integer theAnswer = 42;
    

    42는 모든 정수와 마찬가지로 정수 리터럴이며 추가 문 없이 theAnswer 변수에 직접 할당할 수 있습니다. 편리하기 때문에 이렇게 선언된 Integer를 흔히 볼 수 있습니다.

    이 속기 접근 방식은 다른 기본 유형 리터럴 및 Boolean과 같은 해당 참조 유형에도 적용됩니다. 예를 들면 다음과 같습니다.

    Boolean isFun = true;
    

    trueBoolean 유형의 isFun 변수에 직접 할당되는 리터럴입니다. 동일한 방식으로 할당할 수 있는 false 리터럴도 있습니다.

    문자열 리터럴

    String 참조 유형에 대한 특수 리터럴도 있으며 해당 값을 둘러싼 큰따옴표로 인식됩니다. 이 예에서는 Hello, World!입니다.

    String helloWorld = "Hello, World!";
    

    리터럴을 사용하는 것이 더 간단하고 짧으며 많은 프로그래머가 선호합니다. 그러나 참조 유형 섹션에서 이미 수행한 것처럼 여전히 새 String 객체로 String 변수를 선언할 수 있습니다.

    널 리터럴

    중요한 리터럴이 하나 더 있습니다. 값이 없거나 개체가 존재하지 않음을 나타내는 null입니다. Null을 사용하면 참조 유형을 만들고 개체를 가리키는 대신 null을 가리킬 수 있습니다. null은 모든 참조 유형에 사용할 수 있지만 기본 유형에는 사용할 수 없습니다.

    null 리터럴에는 한 가지 주의 사항이 있습니다. 이 리터럴을 사용하여 변수를 선언할 수 있지만 null이 아닌 적절한 값을 다시 할당할 때까지 이러한 변수를 사용할 수 없습니다. null 값이 있는 참조 유형 변수를 사용하려고 하면 오류가 발생합니다. 다음은 예입니다.

    1. String initiallyNullString = null;
    2. System.out.println("The class name is: " + initiallyNullString.getClass());

    jshell에서 이 코드를 실행하려고 하면 다음과 유사한 오류가 표시됩니다.

    Output
    initiallyNullString ==> null | Exception java.lang.NullPointerException | at (#4:1)

    운영 체제 및 Java 버전에 따라 출력이 다를 수 있습니다.

    오류 java.lang.NullPointerExceptionString 메서드 getClass()(클래스의 이름을 반환함)를 호출하려고 하기 때문에 발생합니다. ) 변수 initiallyNullString(null 객체를 가리킴)에 대해.

    참고: 간단히 하기 위해 기술적으로는 예외이지만 java.lang.NullPointerException을 오류라고 합니다. 예외 및 오류에 대한 자세한 내용은 자습서 Java의 예외 처리를 확인하십시오.

    오류를 해결하려면 다음과 같이 initiallyNullString 값을 다시 할당해야 합니다.

    1. String initiallyNullString = null;
    2. initiallyNullString = "not null any longer";
    3. System.out.println("The class name is: " + initiallyNullString.getClass());

    새로운 고정 코드는 다음 출력을 인쇄합니다.

    Output
    initiallyNullString ==> null initiallyNullString ==> "not null any longer" The class name is: class java.lang.String

    위의 출력은 어떻게 initiallyNullString이 처음 null인지를 보여줍니다. 그런 다음 \not null no longer\를 포함하는 새로운 String 개체가 됩니다. 코드>. 다음으로 getClass() 메서드가 인스턴스화된 개체에서 호출되면 java.lang.String을 얻게 됩니다. 여기서 String은 클래스입니다. name 및 java.lang은 해당 패키지입니다. 마지막으로 의미 있는 전체 메시지가 인쇄됩니다. The class name is: class java.lang.String.

    이러한 null 값 선언은 레거시 코드에서 더 일반적입니다. 변수를 먼저 생성한 다음 나중에 실제 값을 할당하는 데 사용되었으며 일반적으로 후자를 결정하는 일부 논리를 거칩니다. 그러나 Java 버전 8부터는 이전에 null이 사용된 경우에 더 적합한 Optional이라는 새로운 참조 유형이 있습니다.

    지역 변수 유형 추론

    지금까지 변수를 정의하기 위해 Java의 일반적인 데이터 유형 중 일부를 사용했습니다. 그러나 Java 10에서는 새 변수 앞에 var 키워드를 사용할 수 있는 로컬 변수 유형 유추라는 새로운 기능을 도입했습니다. 이 기능을 사용하면 Java가 로컬 컨텍스트에서 데이터 유형을 추론(즉, 자동 추측)합니다. 형식 추론은 이전에 설명된 정의 변수의 장황함과 대조되기 때문에 논란의 여지가 있습니다. 이러한 기능의 장단점은 논쟁의 여지가 있지만 사실은 C++와 같은 다른 정적 유형 언어가 유형 유추를 지원한다는 것입니다.

    어떤 경우든 유형 유추는 메소드 내부의 변수인 지역 변수에 대해서만 작동하기 때문에 데이터 유형 사용을 완전히 대체할 수 없습니다. var의 예를 살펴보겠습니다.

    1. var hello = "Hello";
    2. System.out.println(hello);

    Java가 해당 데이터 유형을 감지하도록 지시하기 위해 var 키워드로 변수 hello를 선언합니다. 그런 다음 일반적인 방법으로 콘솔에 인쇄하여 예상대로 작동하는지 확인합니다.

    Ouput
    hello ==> "Hello" Hello

    이 예제는 Java 설치(특히 JDK)가 버전 10 이상인 경우 작동합니다. 이전 버전에서는 var 키워드가 지원되지 않습니다.

    형식 유추는 컴파일 프로세스 중에, 즉 코드를 컴파일할 때 발생합니다. 컴파일 프로세스는 일반 텍스트 소스 코드를 기계 코드로 변환하고 유형 추론을 포함한 다양한 최적화를 적용합니다. 이렇게 하면 형식 유추 변수에 대해 올바른 양의 시스템 메모리를 사용할 수 있습니다. 따라서 컴파일 후 실행하는 기계 코드는 마치 모든 데이터 유형을 수동으로 지정한 것처럼 완전히 최적화됩니다.

    이 예제에서 var 키워드는 변수가 로컬 변수이고 var 데이터 유형이 로컬 변수에서만 작동하기 때문에 작동합니다. 지역 변수는 메서드 내에서 정의되며 메서드 내에서만 액세스할 수 있으므로 "local\이라고 합니다.

    var가 지역 변수에만 사용될 수 있음을 표시하려면 다음과 같이 기본 메서드 외부에 배치해 보십시오.

    1. public class Hello {
    2. var hello = "Hello";
    3. public static void main(String[] args) {
    4. // example code
    5. }
    6. }

    위의 코드를 jshell에 붙여넣으면 다음과 같은 오류가 발생합니다.

    Output
    | Error: | 'var' is not allowed here | var hello = "Hello"; | ^-^

    hello가 메서드 외부에 있고 더 이상 로컬로 간주되지 않기 때문에 var는 허용되지 않습니다. 따라서 데이터 유형을 감지하는 데 컨텍스트를 안정적으로 사용할 수 없기 때문에 비지역 변수에 대해서는 유형 유추가 작동하지 않습니다.

    var를 사용하는 것은 까다로울 수 있고 필수 사항은 아니지만 알고 있으면 유용할 것입니다.

    예약된 키워드

    Java에서 변수를 선언할 때 알아야 할 중요한 규칙이 하나 더 있습니다. 변수 이름에 사용할 수 없는 예약 키워드가 있습니다. 예를 들어 int 유형의 프리미티브를 선언하고 다음과 같이 이름을 new로 지정할 수 없습니다.

    1. int new = 1;

    이 예제를 시도하면 new가 예약어이기 때문에 컴파일 오류가 발생합니다.

    Output
    | Error: | '.class' expected | int new = 1; | ^ | Error: | <identifier> expected | int new = 1; | ^ | Error: | '(' or '[' expected | int new = 1; | ^ | Error: | unexpected type | required: value | found: class | int new = 1; | ^--^ | Error: | missing return statement | int new = 1; | ^----------^

    new 키워드는 새 개체를 만드는 데 사용되며 Java는 이 위치에서 키워드를 예상하지 않습니다. 이전 출력의 오류 목록에서 첫 번째 부분이 가장 중요합니다.

    Output
    | Error: | '.class' expected | int new = 1; | ^

    .class expected 오류는 new 키워드를 사용할 때 Java가 클래스가 뒤따를 것으로 예상함을 의미합니다. 이 시점에서 Java는 명령문을 해석할 수 없으며 나머지 오류가 뒤따릅니다.

    abstract, continue, default, forbreak와 같은 나머지 예약 키워드는 도 Java에서 특정 의미를 가지며 변수 이름에 사용할 수 없습니다. 예약된 키워드의 전체 목록은 Java 언어 키워드 페이지에서 찾을 수 있습니다. 모든 예약 키워드를 기억하지 못하더라도 컴파일 오류를 사용하여 문제를 식별할 수 있습니다.

    결론

    이 자습서에서는 복잡하지만 필수적인 주제인 Java의 기본 및 참조 데이터 유형에 대해 배웠습니다. 시간을내어 연습하고 예제를 두 번 이상 살펴보십시오. 일부 데이터 유형 및 값을 변경해 보십시오. 성공적인 코드 실행에 대한 감각을 개발하기 위해 오류가 발생하는 경우와 발생하지 않는 경우에 주의를 기울이십시오.

    Java에 대한 자세한 내용은 Java로 코딩하는 방법 시리즈를 확인하십시오.