본문 바로가기
Back-End/Java

참조 타입

by newny 2022. 12. 9.
반응형

참조 타입

  • 배열 타입, 열거 타입, 클래스, 인터페이스
  • 기본 타입은 실제 값을 변수에 저장하지만, 참조 타입은 변수에 힙 영역에 생성되어있는 객체의 메모리의 번지 수를 저장하여 객체를 참조함
  • 모든 변수는 스택 영역에 생성
String name = "홍길동";
String hobby = "독서";
// String 객체로 생성이 되기 때문에 번지를 참조함

 

메모리 영역

java 명령어로 JVM이 구동되면 JVM은 운영체제에서 할당받은 메모리 영역을 다음과 같이 구문해서 사용

  • 메소드 영역
    • 클래스별로 정적필드와 상수, 메소드 코드, 생성자 코드 등이 저장됨
    • 바이트코드 파일을 읽은 내용이 저장됨 (소스코드(.java) → 바이트코드파일(.class))
  • 힙 영역
    • 클래스로 부터 생성된 객체와 배열이 저장됨
    • 여기에서 생성된 객체나 배열을 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조함
  • 스택 영역
    • 메소드 실행시 사용되는 변수를 포함하는 프레임이 저장, 제거하는 동작을 수행
    • 최초로 변수에 값이 저장될 때 스택영역에 변수 생성
    • 변수가 선언되어 블록 안에서만 스택에 존재하고, 블록을 벗어나면 스택에서 제거됨

 

참조 변수의 ==,≠ 연산

  • 동일한 객체(동일한 번지)를 참조하는지 알아볼 때 사용
  • 문자열은 같으나 참조객체가 다를경우가 있음

 

null과 NullPointerException

  • null : 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음
  • null 값도 초기값으로 사용할 수 있기 때문에 스택 영역에 생성됨
  • 예외(Exception) : 프로그램 실행 도중에 발생 하는 오류들
  • NullPointerException : 참조 변수가 null을 가지고 있을경우, 참조 객체가 없으므로 변수를 통해 객체를 사용 할 수 없음

 

String 타입

  • 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 설계되어있음
  • 문자열은 String 객체로 생성되고, 변수는 String 객체를 참조
  • new 연산자로 문자열이 같은 두개의 String객체를 생성할 경우 참조하는 번지수가 다르기 때문에 == 연산으로 비교할 경우 false가 나옴
  • 따라서 문자열 자체가 같은지 비교할 경우엔 equals() 메소드를 사용
boolean result = str1.equals(str2);

// str1 → 원본 문자열, str2 → 비교 문자열
  • JVM은 참조되지 않는 객체는 쓰레기 객체로 취급하고 쓰레기 수집기(Gabage Collector)를 구동시켜 메모리에서 자동 제거함

 

  • 문자 추출 : 특정 위치의 문자를 얻고 싶다면 charAt() 메소드를 이용할 수 있음
  • 문자열 길이 : 문자의 개수를 얻고 싶다면 length() 메소드를 이용할 수 있음
  • 문자열 대체 : 특정 문자열을 다른 문자열로 대체하고 싶다면 replace() 메소드를 이용할 수 있음
  • 문자열 잘라내기 : substring(시작인덱스, 종료인덱스(기술하지 않을경우 문자열 끝으로 설정됨)) 메소드 이용, 시작인덱스 부터 종료인덱스 까지 출력됨
  • 문자열 찾기 : 특정 문자열의 위치를 찾고싶다면 indexOf() 메소드 사용, 문자열이 시작되는 인덱스를 리턴
  • 문자열 분리 : 문자열이 구분자를 사용하여 여러 개의 문자열로 구성되어 있을 경우, 이를 따로 분리해서 얻고싶다면 split() 메소드 사용 → 반환 타입 배열
String subject = "자바 프로그래밍";

char charValue = subject.charAt(3); // "프" 추출됨

int length = subject.length(); // 8 리턴함

String newStr = subject.replace("자바", "JAVA") // "JAVA 프로그래밍" 으로 출력됨

String firstStr = subject.substring(0,1) // "자바" 저장됨
String secondStr = subject.substring(3) // "프로그래밍" 저장됨

int findIndex = subject.indexOf("프로그래밍") // 3 리턴함

String board = "번호, 제목, 내용, 글쓴이";
String[] arr = board.split(","); // ","를 기준으로 문자열이 구분되어 배열에 저장됨

 

 

배열 타입

  • 같은 타입의 데이터를 연속된 공간(메모리)에 나열하고, 각 데이터에 인덱스(0~번호)를 부여해 놓은 자료구조
  • 한번 생성된 배열은 길이를 늘리거나 줄일 수 없음
  • 배열 변수는 참조 변수에 속함 → null값으로 초기화될 수있음
  • 배열 변수 선언
// 형식1 → 대부분 형식1로 선언
타입[] 변수;
int[] intArray;

//형식2
타입 변수[];
int intArray[];

 

배열생성

  • 값 목록으로 배열 생성
타입[] 변수 = { 값0, 값1, 값2, 값3, ...};
String[] names = {"신용권", "홍길동", "감자바"};

 

  • 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않음 → new 연산자를 이용해 값 목록을 지정해주면 됨
타입[] 변수;
변수 = { 값0, 값1, 값2, 값3, ...}; // 컴파일 에러

String[] names = null;
names = new String[] {"신용권", "홍길동", "감자바"};

 

  • new 연산자로 배열 생성
타입[] 변수 = new 타입[길이];

int[] intArray = new int[5]; // 인덱스 0~4까지 생성
// 0~4 인덱스 모두 초기값으로 설정됨

 

배열 길이

  • 코드에서 배열의 길이를 얻으려면 도트(.) 연산자를 사용해서 참조하는 배열의 length 필드를 일어야함
  • length필드는 읽기 전용 필드이기 때문에 값을 바꿀 수 없음

 

다차원 배열

 : 배열 항목에 또 다른 배열이 대입된 것

<배열의 각 차원의 항목에 접근하는 방법>
변수 [1차원인덱스] [2차원인덱스] [3차원인덱스]

 

값 목록으로 다차원 배열 생성

 타입[][] 변수 = {
   {값1, 값2, ...}, // 1차원 배열의 0 인덱스
   {값3, 값4, ...}, // 1차원 배열의 1 인덱스
   ...
 };

 

new 연산자로 다차원 배열 생성

타입[][] 변수 = new 타입[1차원수][2차원수];

 

 

배열 복사

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
		  원본배열   원본배열 복사   새 배열      새 배열    복사 항목 수
                  	     시작 인덱스			붙여넣기
                             			       시작 인덱스

 

 

배열 항목 반복을 위한 향상된 for문

  • ①배열에 가져올 항목이 있을경우 ②타입 변수에 항목을 저장하고 ③실행문을 실행함
  • 배열에 가져올 항목이 없을경우 for문을 종료함
for ( ②타입 변수 : ①배열) {

     ③실행문

}

 

 

main() 메소드 String[] 매개변수 용도

윈도우의 명령 프롬프트나 맥OS의 터미널에서 프로그램을 실행할 때 요구하는 값이 있을 수 있음 (ex. 명령 프롬프트 상에서 프로그램 실행을 위해 값을 입력하게 함)

public class MainStringArrayArgument {
    public static void main(String[] args) {
        if(args.length == 0) {
            System.out.println("프로그램 입력값이 부족");
            System.exit(0);
        }
        
        String strNum1 = args[0];
        String strNum2 = args[1];
        
        int num1 = Integer.parseInt(strNum1);
        int num2 = Integer.parseInt(strNum2);
        
        int result = num1 + num2;
        System.out.println(num1 + "+" + num2 + "=" + result );
         
    }
}

 

 

열거(Enum) 타입

한정된 값을 갖는 타입 (ex. 요일, 계절)

열거 타입은 참조 타입, 열거 상수는 객체

열거타입 변수명 = 열거타입.열거상수;

열거 상수는 상수 → 메소드 영역 저장

열거타입.열거상수는 객체로 생성 → 힙 영역 저장

변수명은 변수 → 스택 영역 저장

반응형

'Back-End > Java' 카테고리의 다른 글

클래스 - 01  (0) 2022.12.11
조건문과 반복문  (0) 2022.12.08
연산자  (0) 2022.12.08

댓글