[Java] 기본 타입과 참조 타입

전우석·2024년 3월 26일

Java

목록 보기
18/24

기본 타입과 참조 타입

기본 타입

기본 타입(Primitive Type)은 변수의 값(value)을 저장하는 변수이다.

  • 기본 타입 변수는 실제 값스택 메모리에 직접 저장한다.
  • 따라서 메모리 공간효율적으로 사용하며, 접근 속도가 빠르다는 장점이 있다.

기본 타입 종류

  • Java에서 미리 정의된 기본 타입으로는 정수, 실수, 문자, 불리언 타입의 8가지가 있다.
    • 정수: byte, short, int, long
    • 실수: float, double
    • 문자: char
    • 불리언: boolean

== 연산자

기본 타입 변수의 비교에 사용한다. 두 변수의 값이 같은지를 평가한다.

  • 두 변수가 저장하고 있는 값이 같은지를 비교한다.
    • 따라서 참조 타입 변수에 사용하게 되면, 메모리의 주소(변수의 값)를 비교하게 된다.
  • 메모리상에서 같은 위치를 가리키고 있는지 비교한다.
  • 기본 타입 변수는 실제 데이터 값을 직접 저장한다.
    • 예를 들어, 두 개의 int 변수가 각각 100과 100의 값을 가진다면, 이들을 == 연산자로 비교했을 때 true를 반환한다. 왜냐하면, 두 변수의 값이 메모리상에서 실제로 같기 때문

      // a, b는 모두 100이라는 값을 참조한다.
      int a = 100;
      int b = 100;
      System.out.println(a == b);  // true
  • 그러나 참조 타입의 경우 == 연산자는 두 객체의 참조(메모리상의 주소)가 같은지를 비교한다.
    • 따라서 두 객체가 내용적으로 동일해도, 다른 메모리 주소를 가리키고 있다면, == 연산자는 false를 반환한다.
    • 이런 경우에는 equals() 메서드를 사용하여 객체의 내용을 비교한다.

참조 타입

참조 타입(Reference Type)은 변수의 메모리 주소(address)를 참조하는 변수이다.

  • 참조 타입은 메모리 주소를 저장한다.
  • 실제 데이터는 힙 메모리에 저장되며, 변수에는 데이터가 저장된 메모리 주소가 저장된다.
  • 참조 타입은 메모리를 더 많이 사용하고, 접근 속도가 기본 타입에 비해 느릴 수 있다.
    • 그러나, 더 복잡한 데이터 구조를 표현할 수 있다는 장점이 있다.
  • 참조 타입은 기본값으로 null 값을 가진다.

참조 타입 종류

  • 배열
    • 특정 타입의 여러 값을 연속된 메모리 공간에 저장하기 위한 자료구조이다.
    • 해당하는 변수타입에 대괄호[]를 붙여서 정의
    • new 연산자를 사용하여 실제 메모리 공간을 할당(객체를 생성)한다.
    • 인덱스를 통해 각 요소에 접근할 수 있다.
  • 클래스
    • 클래스는 객체 지향 프로그래밍의 기본 단위
    • 데이터와 이를 처리하는 메소드(함수)를 하나의 단위로 묶은 것
    • 기본 타입의 데이터를 객체로 포장하는 클래스를 래퍼(Wrapper) 클래스라 하며, 별도의 메서드를 제공한다.
      • String, Integer, Boolean, ..
  • 인터페이스
    • 실제 기능을 구현하기 전 필요한 메서드를 정의하는(추상화) 클래스
    • 구체적인 구현 없이 메서드의 시그니처(이름, 파라미터 타입, 반환 타입)만을 정의한다.
      • 클래스를 통해 인터페이스를 구현(implement)할 때는 인터페이스에 정의된 모든 메서드를 구현해야 한다.
    • 다중상속 지원, 다형성 구현
  • 열거
    • 요일, 계절과 같이 한정된 상수 값의 집합을 정의한다.
    • enum {클래스명}과 같이 선언
    • 열거형의 각 요소는 내부적으로는 인스턴스로 취급되며, 정적(static) 영역에 생성되어 어디서든 접근할 수 있다.

equals() 메서드

참조 타입 변수의 비교에 사용한다.

  • 객체의 내용이 같은지 비교한다.
  • 기본적으로 Object 클래스의 equals() 메서드는 두 객체의 참조가 같은지(동일한 객체인지)를 비교하도록 되어있다.
    • Object 클래스에 정의된 equals() 메서드를 모든 클래스가 상속받는다.(Object 클래스가 모든 클래스의 부모이기 때문에)
    • 대부분의 경우, 클래스를 설계할 때 equals() 메서드를 오버라이드(재정의)하여 객체의 상태(인스턴스 변수의 값)를 비교하는 방식으로 구현한다.
    • String과 같은 래핑 클래스도 마찬가지로, 이를 통해 두 객체가 서로 다른 메모리 주소를 가리키더라도, 내부적으로 같은 값을 가질 경우 동등하다고 판별하도록 한다.
      // a와 b는 다른 주소를 가리킨다.(서로 다른 객체이다.)
      String a = new String("홍길동");
      String b = new String("홍길동");
      System.out.println(a == b);  // false
      System.out.println(a.equals(b));  // true

0개의 댓글