본문 바로가기
JAVA/이것이 자바다

[Chapter 05] 참조 타입

by Dream Jin 2022. 12. 31.

Chapter 05 참조타입

5.1 데이터 타입 분류

  • 데이터 타입은 크게 기본타입, 참조타입 으로 나뉜다

    기본타입

    정수 타입 byte, char, short, int, long

    실수 타입 float, double

    논리 타입 boolean

    참조 타입 → 참조 타입이란 객체의 번지를 참조하는 타입

    배열 타입, 열거 타입, 클래스, 인터페이스

    객체란? 데이터(필드)와 메소드(실행 블럭) 으로 구성된 덩어리.

  • 기본타입과 참조타입의 차이는, 저장되는 값 이다. 기본타입에는 값이 직접 저장되지만, 참조 타입에는 heap 영역에 저장된 번지주소가 저장된다.

  • 즉, 기본타입은 stack 영역의 변수에 값이 직접 저장 되지만, 참조 타입은 stack 영역의 변수가 heap 영역에 생기는 객체의 주소가 저장된다.

5.2 메모리 사용 영역

  • 자바에서는 java 명령어로 JVM이 구동되면 운영체제에 할당받은 메모리영역을 구분한다.
  1. 메소드(Method) 영역
    바이트코드 파일이 저장되는 영역
  2. 힙(heap) 영역
    객체가 생성되는 영역
  3. 스택(Stack) 영역
    기본 타입 변수와, 참조 타입 변수가 생성되고 제거된다.

즉 .java 라는 소스파일이 컴파일 되면, .class 라는 바이트 코드파일이 메소드 영역에 저장된다. (JVM이 .class 파일을 실행시키기 위하여 메소드 영역에 올리는 과정을 로딩Loading 이라고 한다.) 여기서 메소드 영역의 클래스는 각 바이트 코드 별로 만들어지며, 메소드 코드는 1개이지만, 생성자 코드에 있는 객체의 경우 힙 영역에 생성되며 , 여러개 가질수 있고, 해당 과정에서 필요한 변수가 스택 영역에 생성된다.

5.3 참조 타입 변수의 ==, ≠ 연산

  • 참조 타입 변수에서의 ==, ≠ 연산은 변수가 참조하고있는 번지를 비교하는 것 이다.

5.4 null과 NullPointerException

  • 참조 타입 변수가 아직 번지를 저장하고 있지 않다는 뜻으로 null(널) 값을 가질수 있다.
  • NullPointerException 의 경우 참조 변수가 객체를 참조하고 있지 않는것을 나타낸다.
int[] intArray = null;
intArray[0] = 10; //NullPointerException -> 참조변수가 객체를 참조하고 있지 않구나.

String str = null;
System.out.println("총 문자 수:" + str.length()); //NullPointerException 

//옛날에는 안쓰는 객체의 메모리를 제거할때 사용하기도 하였다. 
String hobby = "여행";
hobby = null;

5.5 문자열(String) 타입

  • 자바의 문자열은 String 객체로 생성된다.
String name; //String 타입의 name변수 선언
name = "홍길동"; //name 변수에 문자열 대입
String hobby = "여행"; //변수 선언, 문자열 대입

문자열 비교

  • 자바는 문자열 리터럴이 동일하다면 같은 객체를 공유한다, 하지면 new 연산자를 통하여 다른 객체를 만들수 있는데 이를 객체 생성 연산자 라고 한다.
String name1 = "홍길동";
String name2 = "홍길동"; 
// name1과 name2 는 같은 객체를 참조한다. name1 = name2

String name1 = new String("홍길동");
String name2 = new String("홍길동");
// name1이 참조하는 객체와, name2가 참조하는 객체는 다르다 name1 != name2
  • 문자열 안에있는 리터럴만 비교하기 위해서는 equals() 메소드를 사용한다.
boolean result = str1.equals(str2); //str1 원본 문자열과, str2의 비교 문자열이 같은지 검사

//String 변수는 빈 문자열("")을 대입하여  equals와 비교할수도 있다. 

문자열 추출

  • 특정 문자의 문자를 얻고 싶을때 charAt() 메소드 사용
String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);

//charValue = "프"

문자열 길이

  • 문자열에서 문자의 개수를 얻고 싶다면 length() 메소드 사용 → 공백도 포함
String subject = "자바 프로그래밍";
int length = subject.length();

//length = 8

문자열 대체

  • 특정 문자열을 다른 문자열로 대체하고자 할때 replace() 메소드 사용
String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "JAVA");

//newStr = JAVA 프로그래밍

→ 여기서 중요한 부분은 한번 만들어진 객체는 수정이 불가능하다. 따라서 oldStr의 객체를 수정하는 것이 아니라, 새로운 객체 newStr을 만드는 것이다.

문자열 잘라내기

  • 특정 위치에서 문자열을 잘라내고 가져오고 싶다면 substring() 메소드를 사용한다.
String ssn = "221228-1234567";
String firstNum = ssn.substring(0,6); //0번 index에서 시작하여, 6번째 까지 자른다
String secondNum = ssn.substirng(7); //7번 index에서 끝까지 자른다

//firstnum = "221228"
//secondNum = "1234567"

문자열 찾기

  • 문자열을 찾는대에는 2가지 방법이 있다. indexOf()메소드와, contains()메소드
String subject = "자바 프로그래밍";
int index = subject.indexOf("프로그래밍");
//index = 3 문자열이 없다면 -1을 리턴, 문자열이 있다면 시작하는 index 를 리턴

boolean result = subject.contains("프로그래밍");
//result = True 문자열이 포함되어 있다면 true, 아니면 false

문자열 분리

  • 문자열이 특정한 구분자로 구분되어 있을때, split()메소드를 이용하여 나눈다.
String board = "번호,제목,내용,글쓴이";
String[] arr = board.split(","); 

//arr -> "번호" "제목" "내용" "글쓴이" 가 저장이 된다.
// 이렇게 나뉘는 각각을 token이라고 부른다. 

5.6 배열(Array) 타입

  • 변수는 하나의 값만 저장할 수 있지만, 배열의 경우 연속된 공간에 값을 나열시키고, 각 값에 index를 부여한 자료구조 이다.
    1. 배열은 같은 타입의 값만 관리한다.
    2. 배열의 길이는 늘리거나 줄일수 없다.

배열 변수 선언

  • 배열을 사용하기 위해서는 배열 변수를 선언 하여야 한다.

2가지 방법이 있지만 관례적으로 1번을 많이 사용한다.

1)
타입[] 변수;
int[] intArray;
double[] doubleArray;
String[] strArray;

2)
타입 변수[];
int intArray[];
double doubleArray[];
String strArray[];

//배열 자체도 객체이므로, 힙 영역에 생성되며 null로 초기화 할수도 있다.
int[] intArray = null;

값 목록으로 배열 생성

타입[] 변수 = {값0, 값1, 값2, 값3, ...}
int[] intarr = {1,2,3,4,5};
  • 주의사항
일반 변수처럼
타입[] 변수; 
변수 = {값1, 값2, 값3....} 으로 저장할 수 업삳. // 컴파일 에러 발생

변수 = new 타입[] {값1, 값2, 값3 ...}; //으로 대입

String[] names = null;
names = new String[] {"가나다", "라마바", "사아자"};
  • 메소드의 매개변수가 배열타입 일때도 동일하다.
//메소드 선언
void printItem(int[] scores){...}

//잘못된 메소드 호출
printItem({10, 20, 30}); //컴파일 에러

//올바른 메소드 호출
printItem( new int[] {10, 20, 30});

new 연산자로 배열생성

  • 배열 항목 값을 기본값으로 초기화한 상태 → 즉 값이 주어지지않고 길이만 정해서 배열을 만든 상태
타입[] 변수 = new 타입[길이];

int[] intarr = null;
intarr = new int[5]; // 길이가 5인 int타입의 intarr배열 생성
-> 배열 안에는 0을 의미하는 기본 값으로 초기화 된다. 

배열 길이

  • 배열의 길이의 경우 문자열의 길이를 구하는 방법과 비슷하다.
배열변수.length; -> for문에서 전체 배열 항목을 반복할때 자주 사용된다. 

5.7 다차원 배열

  • 배열항목에 또다른 배열이 대입된 것 을 다차원 배열이라 부른다.
변수[1차원인덱스][2차원인덱스][3차원인덱스] 

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

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

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

  • 1차원 배열과 동일하게 값이 없고 길이만 정할 경우
타입[][] 변수 = new 타입[1차원수][2차원수];
->
int[][] scores = new int[2][3];

5.8 객체를 참조하는 배열

  • 기본 타입 배열은 각 항목에 직접 값을 저장하지만, 참조 타입(클래스, 인터페이스) 배열은 각 항목에 배열의 번지를 저장한다.

5.9 배열 복사

  • 배열의 경우 한 번 생성되면 길이를 변경할수 없다. 따라서 더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전의 배열을 복사하여야 한다. 대표적으론 system의 arraycopy() 메소드가 있다.
int[] oldIntArray = {1,2,3}; //길이가 3인 배열

int[] newIntArray = new int[5]; //길이가 5인 배열 생성

for (int i = 0; i<oldIntArray.length; i++){
    newIntArray[i] = oldIntArray[i];
} //배열 복사

-> System의 arraycopy()메소드
System.arraycopy(원본 배열, 원본 배열 복사 시작 인덱스, 새배열, 새배열 붙여넣을 인덱스, 복사항목수);

System.arraycopy(oldIntArray, 0, newIntArray,0, oldIntArray.length); 

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

  • 향상된 for문의 경우 증감식 을 사용하지 않고, 항목의 개수만큼 반복한 뒤 자동으로 for문을 빠져나간다.
for( (2)타입변수: (1)배열){
(3)실행문;
}

int[] scores = {10,20,30,40,50};

int sum = 0;

for (int score: scores){
    sum += score;
}

//sum -> 150

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

  • 터미널에서 프로그램을 실행할 때 요구하는 값이 있을수도 있다. 이때 사용
java sum 10 20 -> 10과 20이 메인 메소드의 String 타입 매개변수로 전달된다

public static void main(String[] args){..}
여기에서 10과 20은
String x = args[0];
String y = args[1]; 로 전달된다. 

5.12 열거(Enum) 타입

  • 열거 Enum타입의 경우 제한된 목록에서 값을 사용 할때 사용한다.
  • 요일(7), 이나 계절(4) 등을 예로 들수 있고, 열거 타입의 이름은 첫 문자를 대문자로 하고 캐멀 스타일로 지어주는것이 관례 이다.
Week.java
MemberGrade.java
ProductKind.java

public enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

'JAVA > 이것이 자바다' 카테고리의 다른 글

자바 개념 정리  (0) 2023.03.01
[Chapter 06] 클래스  (0) 2022.12.31
[Chapter 04] 조건문과 반복문  (0) 2022.12.03
[Chapter 03] 연산자  (0) 2022.12.03
[Chapter 02] 변수와 타입  (0) 2022.12.03

댓글