[Java] 참조 타입, 문자열, 열거형

2024. 8. 3. 11:52Java/참조타입

데이터 타입 분류

자바의 데이터 타입은 기본 타입과 참조 타입으로 분류된다. 참조 타입은 객체의 주소를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입이 있다. 변수들은 모두 스택(stack)이라는 메모리 영역에 생성된다. 

 

예를 들어서, int age = 25  /  double price = 100.5 의 기본 타입인 age와 price는 직접 값을 저장하고 있다. 하지만 String name = "Kim" / String hobby = "독서"의 name과 hobby는 힙 메모리 영역에서 생성된 객체의 주소를 저장한다. 

 

메모리 사용 영역

자바에서 사용하는 메모리 영역은 다음과 같다. 

메소드 영역은 바이트코드 파일을 읽는 내용이 저장되는 영역이다. 

 

힙 영역은 객체가 생성되는 영역이다. 

 

스택 영역은 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역이다. 메소드 호출이 끝나면 프레임은 자동 제거된다. 프레임 내부에는 로컬 변수 수택이 있다. 층층히 쌓이는 영역이다. main의 스택에 대해서는 <<자바의 정석 기초편>> p.184를 참조하자. 

 

참조 타입 변수의 ==, != 연산

==, != 연산자는 변수 값의 동등 여부를 확인한다. 참조 타입에 ==, !=를 사용하면 연산자는 주소값을 비교한다. 

 public static void main(String[] args) {
      int[] arr1;
      int[] arr2;
      int[] arr3;

      arr1 = new int[]{1,2,3};
      arr2 = new int[]{1,2,3};
      arr3 = arr2;

      System.out.println(arr1 == arr2);
      System.out.println(arr2 == arr3);
    }

 

위와 같이 나온 이유는 arr1과 arr2가 배열 항목은 서로 같지만, 다른 배열 객체로 생성되어 주소가 다르기 때문이다. 

Null과 NullPointerException

참조 타입 변수는 주소값을 가지지 못하면 Null 값을 가질 수 있다. 참조 변수가 nll값을 가졌는지 확인하려면 == 혹은 !=을 이용하면 된다. 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려고 하면 NullPointerException 예외를 발생시킨다. 

 

문자열 타입

자바의 문자열은 String 객체로 생성된다. 그래서 문자열값은 힙 영역에서 생성되고 주소값만 변수에 저장된다. 그래서 String name = new String("홍길동")을 실행해도 오류가 발생하지 않는다. 참고로 String에 빈 문자열(" ")을 대입할 수도 있다. 

주의할 점은, 자바는 문자열 리터럴이 동일하다면 같은 String 객체를 공유하도록 설계되었다. 하지만 new로 생성한 String 객체는 별도의 주소값을 갖는다. 

    public static void main(String[] args) {
      String name1 = "홍길동";
      String name2 = "홍길동";
      String name3 = new String("홍길동");

      System.out.println(name1 == name2);
      System.out.println(name2 == name3);
    }

 

만약 이와 상관없이 내부 문자열만으로 비교하고 싶으면 equals() 메소드를 사용하면 된다. 빈문자열도 String 객체로 생성되어있기 때문에 equals를 사용해야만 한다. 

 

문자 추출

문자열의 특정 위치의 문자를 얻고 싶으면 charAt()메소드를 사용할 수 있다. charAt() 메소드는 매개값으로 인덱스값을 부여 받는다. 

 

문자열의 길이

문자의 개수를 알고 싶으면 length() 메소드를 사용하면 된다. 

 

문자열 대체

문자열에서 특정 문자열을 대체하고 싶으면 replace() 메소드를 사용한다. String 객체는 변경이 불가능하기 때문에 replace() 메소드가 리턴하는 문자열은 완전 새로운 문자열이다. 

    public static void main(String[] args) {
      String oldStr = "자바 프로그래밍";
      String newStr = oldStr.replace("자바", "Java");

      System.out.println(newStr); //Java 프로그래밍
    }

 

문자열 잘라내기

문자열에서 특정 위치의 문자열을 잘라내어 가져오고 싶으면 substring() 메소드를 사용한다. 

substring(int beginIndex) beginIndex에서 끝까지 자르기
substring(int beginIndex, int endIndex) beginIndex에서 endIndex앞까지 자르기

 

문자열 찾기

특정 문자열의 위치를 찾고자 할 때에는 indexOf() 메소드를 사용한다. 

    public static void main(String[] args) {
      String subject = "자바 프로그래밍";
      int index = subject.indexOf("프로그래밍");

      System.out.println(index); //3
    }

 

만약 포함되어 있지 않다면 -1을 리턴한다. 단순히 포함 여부만 확인하고 싶으면 contains() 메소드를 사용하면 편하다. 

 

문자열 분리

문자열이 구분자를 사용하여 여러 개의 문자열로 구성되어 있을 경우에 split() 메소드를 사용하여 분리하여 배열로 만들 수 있다. 

    public static void main(String[] args) {
      String board = "번호,제목,내용,성명";
      String[] arr = board.split(",");
      for(int i = 0; i < arr.length; i++){
        System.out.print(arr[i]); //번호제목내용성명
      }
    }

 

열거 타입

데이터 중에서 몇 가지로 한정된 값(계절, 일주일, 사계절)을 갖는 경우가 있는데, 이러한 값이 가지는 타입을 열거 타입이라고 한다. 열거 타입을 사용하기 위해서는 열거 타입 이름으로 소스 파일을 생성하고 한정된 값을 코드로 정의해야한다. 

 

 

관례적으로 알파벳으로 정의하고 모두 대문자로 작성한다. 여러 단어일 경우에는 언더바(_)로 연결하는 것이 관례이다. 열거 타입도 하나의 데이터 타입이기 때문에 변수를 선언하고 사용해야만 한다. 

Week today;
Week reservationDay;

 

열거 타입 변수에는 열거 상수를 대입할 수 있는데 '열거타입.열거상수'형태로 작성한다.

Week today = Week.SUNDAY;

'Java > 참조타입' 카테고리의 다른 글

[Java] 배열 연습문제 풀이  (0) 2024.08.04
[Java] 배열 연습문제  (0) 2024.08.04
[Java] 배열  (0) 2024.08.04