본문 바로가기

개발(합니다)/Java&Spring

[java-기초-05] 참조 타입

반응형

데이터 타입 분류

참조 타입이란 객체의 번지(메모리 주소)를 참조하는 타입이다.
기본 타입과의 차이점으로 기본 타입은 값을 메모리에 저장하고 참조 타입은 객체가 저장된 메모리 주소를 저장한다.

데이터 타입
기본 타입과 참조 타입의 차이

메모리 영역

  • 메소드 영역 : 클래스(.class)를 읽어들여 저장한다.
    • 런타임 상수풀, 필드 데이터, 메서드 데이터, 메서드 코드, 생성자 코드 등을 저장한다.
    • 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.
  • 힙 영역 : 객체와 배열이 생성되는 영역이다.
    • JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
    • 참조하는 변수나 필드가 없으면 JVM이 가비지 컬렉터를 실행시킨다.
    • 자바는 코드로 직접 제거시키는 방법을 제공하지 않지만 null처리로 대신한다.
  • JVM 스택 영역 : JVM 스택 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
    • 추가적으로 스레드를 생성하지 않으면 main 스레드만 존재하므로 JVM 스택도 하나이다.

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

  • 참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 주소 값을 비교하게 된다.
  • 객체의 주소는 다르지만 값이 같을 수 있으니 유의해서 사용해야 한다.
  • equals()를 오버라이딩해서 사용하길 권장한다.

null과 NullPointerException

  • null은 참조 타입 변수는 힙 영역의 객체를 참조하지 않았다는 뜻으로 주소를 가지고 있지 않다는 의미이다.
  • NullPointerException은 주소를 가지지 않은 참조 타입을 호출했다는 오류를 의미한다.

String 타입

  • 문자열을 저장할 수 있는 타입으로 가장 널리 사용되는 타입이다.
  • 리터럴 형태이므로 메모리 낭비가 생길 수 있으니 StringBuffer나 StringBuilder와 함께 사용하자.

배열 타입

  • 각 데이터에 인덱스를 부여해 놓은 자료 구조이다.
  • 같은 주제나 이름의 상자에 번호를 붙여서 순서를 정해놓은 자료 구조이다.

커멘드 라인 입력

  • public static void main(String args[])의 args는 cmd 창에서 입력 받은 값을 의미한다.
  • hello.java를 실행 할 때 > java hello 1 에서 1이 args로 받을 수 있는 값이 된다.

다차원 배열

  • 1차원 배열이 아닌 2차원 배열 이상의 배열을 의미한다.
  • 2차원 배열은 엑셀에 있는 행과 열을 떠올리면 된다.

객체를 참조하는 배열

  • 배열은 객체이므로 메모리의 주소를 가지고 있다.
  • 얕은 복사와 깊은 복사를 구분해야 한다.
  • public class test {
      public static void main(String[] args) {
      // 깊은 복사 하는 방법
          String[] s = new String[3];
          s[0] = "a";
          s[1] = "b";
          s[2] = "c";
          String[] ss = new String[3];
          System.arraycopy(s, 0, ss, 0, s.length);
    
          ss[0] = "C";
    
          System.out.println(s[0] + " : " + ss[0]);
    
          String[] sss = Arrays.copyOf(s, s.length);
          sss[0] = "D";
          System.out.println(s[0] + " : " + sss[0]);
    
          List<String> l = new ArrayList<>();
    
          l.add("a");
          l.add("b");
          l.add("c");
    
          // List<String> ll = new ArrayList<>();
          // System.arraycopy(l, 0, ll, 0, l.size());
    
          // ll.add("K");
          // System.out.println(l.get(2) + " : " + l.get(3));
          List<String> ll = new ArrayList<>(l);
          ll.add("E");
          System.out.println(ll.get(3));
          System.out.println(l.get(3));
    
      }
    }

향상된 for문

    public static void main(String[] args) {
        int s[] = { 95, 71, 84, 93, 87 };
        int sum = 0;

        for (int score : s) { // 증감을 자동으로 해줌
            sum += score;
        }

        System.out.println(sum);

    }

열거 타입

  • 상수를 대신 하는 방법으로 사용한다.
  • 작성 된 순서대로 0, 1, 2 .. 로 번호가 붙는다.
    public enum Week {
        MONDAY, TUESDAY, WENESDAY // MONDAY는 0, TUESDAY는 1
    }
  • 열거 객체의 메소드
리턴 타입 메소드(매개 변수) 설명
String name() 열거 객체의 문자열을 리턴
int ordinal() 열거 객체의 순번(0번 부터 시작)을 리턴
int compareTo() 열거 객체를 비교해서 순번 차이를 리턴
열거 타입 valueOf(String name) 주어진 문자열의 열거 객체를 리턴
열거 배열 values() 모든 열거 객체들을 배열로 리턴
반응형

'개발(합니다) > Java&Spring' 카테고리의 다른 글

[java-기초-07] 상속  (0) 2021.01.05
[java-기초-06] 클래스  (0) 2021.01.04
[java-기초-04] 조건문과 반복문  (2) 2021.01.02
[java-기초-03] 연산자  (0) 2021.01.01
[java-기초-02] 변수와 타입  (0) 2020.12.31