Java Study

참조 타입이란?

Z00_HWAN_99 2024. 6. 21. 17:33
728x90
반응형

객체(Object)란?

  • 객체는 데이터와 메서드로 구성된 덩어리
  • 객체 = 데이터(필드) + 메서드

참조 타입

  • 객체의 번지를 참조하는 타입.
  • 배열, 열거, 클래스, 인터페이스 타입.
  • 기본 타입으로 선언된 변수는 값 자체를 저장하지만, 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장.

메모리 사용 영역

  • JVM은 운영체제에서 할당받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용.
  • 메서드 영역 : 바이트코드 파일을 읽은 내용이 저장되는 영역
  • 힙 영역 : 객체가 생성되는 영역. 객체의 번지는 메서드 영역과 스택 영역의 상수와 변수에서 참조.
  • 스택 영역 : 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역

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

  • ==, != 연산자는 객체의 번지를 비교해 변수의 값이 같은지, 아닌지를 조사.
  • 번지가 같다면 동일한 객체를 참조하는 것이고, 다르다면 다른 객체를 참조하는 것.

null 과 NullPointerException

  • null값
    • null(널) 값 : 참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻.
    • null도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에서 생성.
  • NullPointerException
    • 변수가 null인 상태에서 객체의 데이터나 메서드를 사용하려 할 때 발생하는 예외.
    • 참조 변수가 객체를 정확히 참조하도록 번지를 대입해야 해결됨.

 

 

String 타입

  • 문자열은 String 객체로 생성.
public static void main(String[] args)
{
    String name; // String 타입 변수 name 선언
    name = "가나다"; // name 변수에 문자열 선언
    String hobby = "라마바"; //String 타입 변수 hobby를 선언하고 문자열 대입
}
  • 문자열 리터럴이 동일하다면 String 객체를 공유
public static void main(String[] args) {
  String name1 = "가나다";
    String name2 = "가나다";
}
  • new 연산자(객체 생성 연산자)로 직접 String 객체를 생성 / 대입 가능.
  • 문자열 추출 : charAt() 메소드로 문자열에서 매개값으로 주어진 인덱스의 문자를 리턴해 특정 위치의 문자를 얻을 수 있음.
  • 문자열 길이 : length() 메소드로 문자열에서 문자의 개수를 얻을 수 있음.
  • 문자열 대체 : replace() 메소드로 기존 메소드는 그대로 두고, 대체한 새로운 문자열을 리턴할 수 있음.
public static void main(String[] args) {
  String oldStr = "가나다";
  String newStr = oldStr.replace("가", "꺄");
}
  • 문자열 잘라내기 : 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("가나다");
}
  • 문자열 분리 : split() 메소드로 구분자가 있는 여러 개의 문자열을 분리할 수 있음.
public static void main(String[] args) {
  String board = "번호, 제목, 내용, 글쓴이";
  String[] arr = board.split(",");
}

 

배열(Array) 타입

  • 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조.
  • 인덱스는 대괄호 []와 함께 사용하여 각 항목의 값을 읽거나 저장하는데 사용.

배열 변수 선언

  • 두 가지 형태로 작성. ex) 타입[] 변수;  or  타입 변수[];(첫번째가 관례적인 표기)
  • 배열은 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 주소를 저장.
  • 참조할 배열이 없다면 배열 변수도 null로 초기화할 수 있음.

값 목록으로 배열 생성

  • 배열에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열을 생성할 수 있음.
public static void main(String[] args) {
  타입[] 변수 = {값0, 값1, 값2, 값3};
}
  • 배열 변수를 선언한 시점과 값 목록이 대입되는 시점이 다르다면 new 타입[]을 중괄호 앞에 붙여줌. 타입은 배열 변수를 선언할 때 사용한 타입과 동일하게 지정
public static void main(String[] args) {
  변수 = new 타입[] {값0. 값1, 값2, 값3}
}

 

new 연산자로 배열 생성

  • new 연산자로 값의 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성
public static void main(String[] args) {
  타입[] 변수 = new 타입[길이];
}
  • new 연산자로 배열을 처음 생성하면 배열 항목은 기본값으로 초기화됨.
데이터 타입 초기값
기본 타입 bytr[]
char[]
short[]
int[]
long[]
0
'\u0000'
0
0
0L
float[]
double[]
0.0f
0.0
boolean[] false
참조 타입 클래스[]
인터페이스[]
null
null

 

배열 길이

  • 배열의 길이란 배열에 저장할 수 있는 항목 수
  • 코드에서 배열의 길이를 얻으려면 도트(.)연산자를 사용해서 참조하는 배열의 length 필드를 읽음. ex) 배열변수.length;
  • 배열의 length 필드는 읽기만 가능하므로 값을 변경할 수는 없음.
  • 배열 길이는 for문을 사용해서 전체 배열 항목을 반복할 때 많이 사용.

다차원 배열

  • 배열 항목에는 또 다른 배열이 대입된 배열
  • Ex) 변수[1차원 인덱스][2차원인덱스]...[N차원인덱스]

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

  • 값 목록으로 다차원 배열을 생성 시 변수 선언 시 타입 뒤에 대괄호[]를 차원의 수만큼 붙이고, 값 목록도 마찬가지로 차원의 수만큼 중괄호를 중첩.

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

  • new 연산자로 다차원 배열을 생성하려면 배열 변수 선언 시 타입 뒤에 대괄호[]를 차원의 수만큼 붙이고, new 타입 뒤에도 차원의 수만큼 대괄호[]를 작성.
  • Ex) 타입[][] 변수 = new 타입[1차원수][2차원수];

배열에서 객체 참조하기

  • 기본 타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 값을 직접 저장.
  • 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 저장.

배열 복사하기

  • 배열은 한 번 생성하면 길이를 변경할 수 없음. 더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전 배열로부터 항목들을 복사해야함.
  • System의 arrayCopy() 메소드를 이용해 배열 복사 가능.

https://github.com/bottomsUp-99

 

bottomsUp-99 - Overview

Backend Developer. bottomsUp-99 has 10 repositories available. Follow their code on GitHub.

github.com

 

728x90
반응형

'Java Study' 카테고리의 다른 글

@Override가 있고 없고의 차이  (2) 2024.06.30
상속(Inheritance)이란?  (0) 2024.06.28
객체지향 프로그래밍에 대해서...  (0) 2024.06.21
메서드 오버로딩(Method Overloading)이란?  (0) 2024.06.20
메서드(method)란?  (0) 2024.06.20