JAVA/JAVA 정리

[JAVA] 참조 타입

h0-0cat 2023. 5. 5. 11:13
728x90

 

데이터 타입 분류

 

메모리 사용 영역

 

메소드 영역

메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.

 

 

힙 영역 (Heap Area)

힙 영역은 객체와 배열이 생성되는 영역이다.

 

객체와 배열이 저장된다.

힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수에서 참조한다.

참조를 잃어버린 객체나 배열은 변수가 꺼내올 수 없으므로(사용불가)

자동으로 Garbage Collector(쓰레기 수집기)에 의해 힙 영역에서 제거된다.

 

 

 

JVM 스택 영역 (Stack)

스택 영역은 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역이다

각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.

메소드를 호출할 때 프레임이 생성되며, 해당 프레임은 메소드가 종료될 때 제거된다.

프레임 내부에는 메소드를 호출할 때 메소드 안에서 사용되는 변수들이 저장된다.

프레임은 메소드가 실행될 때만 존재하며, 추가된 프레임은 stack 형태(위-아래)로 쌓인다

 

 

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

 

 

기본 타입 변수의 ==, != 연산은 변수의 값이 같은지, 아닌지를 조사하지만,

참조 타입 변수들 간이 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.

참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 주소값을 비교하는 것이 된다.

동일한 주소 값을 갖는다는 것은, 동일한 객체를 참조한다는 뜻이다.

 

null NullPointerException

 

참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다

1. null 값 확인

참조 타입 변수가 null 값을 가지는지 확인하려면 ==, != 연산을 수행하면 된다.

 

 

 

위의 그림에서 refVar1은 객체를 참조하므로 연산의 결과는 다음과 같다.

refVar1 == null //결과: false

refVar2 != null //결과: true

refVar2 null 값을 가지므로 연산의 결과는 다음과 같다.

refVar2 == null //결과: true

refVar2 != null //결과: false

 

NullPointerException

NullPointerException null을 가지고 있는 참조 타입 변수를 사용할 때 발생하는 에러이다.

 

 


String타입

 

변수 = "문자열";

 

String 변수 = "문자열";

 


배열

타입[] 변수;

타입 변수 [];

 

열타입

변수는 한 개의 데이터만 저장할 수 있다.

배열이란 연관된 데이터를 하나의 변수에 그룹핑해서 관리하기 위한 방법입니다. 배열을 이용하면 하나의 변수에 여러 정보를 담을 수 있고, 반복문과 결합하면 많은 정보도 효율적으로 처리할 수 있습니다.

 

 

* 배열의 선언

배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조 변수를 위한 공간이 만들어질 뿐이다.

 

 

* 배열의 생성

배열을 생성해야 값을 저장할 수 있는 공간이 만들어진다.

 

new 연산자로 배열 생성

타입[] 변수 = new 타입[길이];

 

ex

길이가 5인 int []배열을 생성한다.

int[] intArrat = new int[5]


 

배열 길이

 

배열의 길이란 배열에 저장할 수 있는 전체 항목 수를 말한다.

 

배열변수.length;

 

int[] intArray = {10, 20, 30};

int num = intArray.length;

 


 

커멘드 라인 입력

Command Line 입력이란?

자바 프로그램을 실행할 때 커맨드 라인(args[ ] 배열)에 인수를 넣어주는 것을 의미한다.

프로그램이 작동 시 다양한 값을 넣어 어떻게 반응하는지 테스트 할 때 편리하게 사용된다.

 

※ 프로그램이 실행되면 JVM은 길이가 0인 String 배열을 먼저 생성하고

main( ) 메소드를 호출할 때 매개값(인자)으로 전달한다.

 

 


 

다차원 배열

 

다차원 배열이란 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열을 의미합니다.

 

즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며,

3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이고,

4차원 배열은 배열 요소로 3차원 배열을 가지는 배열인 것입니다.

 

 


 

객체를 참조하는 배열

기본타입 배열은 각 항목에 직접 값을 각조 있지만, 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있다. 예를들어 String은 클래스 타입이므로 String[]배열은 각 항목에 문자열이 아니라,

String 객체의 주소를 가지고있다.

 


배열복사

 

배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다.

 


향상된 for문

자바 5부터 배열 및 컬렉션 객체를 좀 더 쉽게 처리할 목적으로 향상된 for문을 제공한다. 향상된 for문은 반복 실행을 하기 위해 카운터 변수와 증감식을 사용하지 않는다. 배열 및 컬렉션 항목의 개수만큼 반복하고, 자동적으로 for문을 빠져나간다.

for( 타입 변수이름 : 배열 ){ 실행문; }

 

 

열거 타입

한정된 값만을 갖는 데이터 타입을 열거 타입(enumeration type)이라고 한다. 열거 타입은 몇 개의 열거 상수(enumeration constant) 중에서 하나의 상수를 저장하는 데이터 타입이다.

 

열거 타입 선언

열거 타입을 선언하기 위해서는 먼저 열거 타입의 이름을 정하고 열거 타입 이름으로 소스 파일(.java)을 생성해야 한다. 열거 타입 이름은 관례적으로 첫 문자를 대문자로 하고 나머지는 소문자로 구성한다. 만약 여러 단어로 구성된 이름이라면 각 단어 첫 문자는 대문자로 하는 것이 관례이다.

 

열거 타입 변수

열거 타입을 선언했다면 이제 열거 타입을 사용할 수 있다. 열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야 한다. 다음은 열거 타입 변수를 선언하는 방법이다.

 

열거 객체의 메소드

열거 객체는 열거 상수의 문자열을 내부 데이터로 가지고 있다.

아래 표는 열거 객체가 가지는 메소드들이다. 열거 객체의 메소드는 java.lang.Enum 클래스에 선언된 메소드인데, 열거 객체에서 사용할 수 있는 이유는 모든 열거 타입은 컴파일 시에 Enum 클래스를 상속하게 되어 있기 때문이다.

 
리턴 타입
메소드(매개 변수)
설명
String
name()
열거 객체의 문자열을 리턴
int
ordinal()
열거 객체의 순번(0부터 시작)을 리턴
int
compareTo()
열거 객체를 비교해서 순번 차이를 리턴
열거 타입
valueOf(String name)
주어진 문자열의 열거 객체를 리턴
열거 배열
values()
모든 열거 객체들을 배열로 리턴

 

 

name() 메소드

name() 메소드는 열거 객체가 가지고 있는 문자열을 리턴한다. 이때 리턴되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일하다.

 

// name() 메소드 사용 예시

Week today = Week.SUNDAY;

String name = today.name();

 


 

ordinal() 메소드

ordinal() 메소드는 전체 열거 객체 중 몇 번째 열거 객체인지 알려준다. 열거 객체의 순번은 열거 타입을 정의할 때 주어진 순번을 말하는데, 0번부터 시작한다.

// ordinal() 메소드 사용 예시

Week today = Week.SUNDAY;

int ordinal = today.ordinal();

 


compareTo() 메소드

compareTo() 메소드는 매개값으로 주어진 열거 객체를 기준으로 전후로 몇 번째 위치하는지를 비교한다. 만약 열거 객체가 매개값의 열거 객체보다 순번이 빠르다면 음수가, 순번이 늦다면 양수가 리턴된다.

// compareTo() 메소드 사용 예시 Week day1 = Week.MONDAY; Week day2 = Week.WEDNESDAY;

int result1 = day1.compareTo(day2); //-2

int result2 = day2.compareTo(day1); //2

 


valueOf() 메소드

valueOf() 메소드는 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴한다.

// valueOf() 메소드 사용 예시

 

728x90

'JAVA > JAVA 정리' 카테고리의 다른 글

[JAVA] 상속  (0) 2023.05.07
[JAVA] 클래스(Class) - 기본 개념  (0) 2023.05.06
[JAVA] 연산자와 연산식  (0) 2023.05.04
[JAVA] 반복문 (for문, while문, do-while문)  (0) 2023.05.04
[JAVA] 조건문 ( if문, switch문 )  (0) 2023.05.04