티스토리 뷰
[JAVA] Primitive Type vs Reference Type / 타입별 변수의 메모리 저장 위치 비교 / 열거 타입(Enumeration type)
angelatto 2021. 2. 17. 21:28public static void main(String[] args) {} -> 메인 메소드이다. (함수와는 다르다.)
- 위의 메인 메소드의 종료 시점이 마지막 괄호가 닫힐때까지 인데,
return을 주게 되면 그 시점에 프로그램을 종료한다.
[데이터 타입]
1. 기본 타입(primitive type)
: 값 자체를 저장함
정수 타입 | byte |
char | |
short | |
int | |
long | |
실수 타입 | float |
double | |
논리 타입 | boolean |
2. 참조 타입 (reference type)
: 값 자체가 아닌 값이 저장되어 있는 메모리 주소를 저장하는 타입
- 참조 타입 변수는 객체를 참조하는 변수이다.
배열 타입 |
열거 타입 |
클래스 - String |
인터페이스 |
[기본 타입과 참조 타입의 메모리 위치 비교]
- 참조 타입 변수는 힙에 있는 번지 주소를 가지고 있음
- 힙 영역에 생성되는 것은 모두 객체라고 한다.
(ex)
int age = 25;
double price = 100.5;
String name = "채정";
String hobby = "필라테스";
※ Runtime Data Area
1. 메소드 영역(정적 영역)
- JVM을 시작할 때 생성
- 로딩된 클래스 바이트 코드 내용을 분석후 저장
- 모든 스레드가 공유
2. 힙 영역
- JVM을 시작할 때 생성
- 객체/배열 저장
- 사용되지 않는 객체는 GC가 자동 제거
3. JVM 스택
- 스레드별로 생성
- 메소드를 호출할 때마다 Frame을 스택에 추가(push)
- 메소드가 종료하면 Frame을 제거(pop)
※ null과 NullPointerException
[null]
- 위치 정보가 없을 수 있다. 힙 영역에 어떠한 객체를 참조하고 있지 않다는 의미이다.
- 변수가 참조하는 객체가 없을 경우 초기값으로 사용 가능
- 참조 타입의 변수에만 저장가능
- null로 초기화된 참조 변수는 스택 영역 생성
[NullPointerException]
- 참조 변수에 null이 들어가있으면 사용할 수 없다. 그런데도 사용하면 NullPointerException 이 발생한다.
▶ 이제부터 Reference Type 에 해당하는 타입에 대하여 알아보기
※ String (클래스 타입에 속함)
cf) 리터럴 : 직접 코드에 입력한 값 (숫자던 문자던)
- 문자열 리터럴이 동일하다면 String 객체를 공유한다.
- String 타입이 가진 메소드 : equals()
[실습]
package pr05;
public class exam01 {
public static void main(String[] args) {
int var1 = 10;
int var2 = 10;
// 값 자체 비교
System.out.println(var1 == var2); // true
System.out.println(var1 != var2); // false
String var3 = "자바";
String var4 = "자바";
String var5 = new String("자바");
// 번지비교
System.out.println(var3 == var4); // true - 리터럴이 같으면 주소가 같다.
System.out.println(var3 == var5); // false - new로 생성한 객체는 다른 주소를 가리킴
System.out.println(var3 != var4); // false
System.out.println(var3.equals(var5)); // true
}
}
※ 배열 타입
- 같은 타입의 데이터를 연속된 공간에 저장하는 자료구조
1. 배열을 생성하는 첫 번째 방법
package pr05;
import java.util.Arrays;
public class exam02 { // 배열을 생성하는 첫 번째 방법
public static void main(String[] args) { // main 메소드
// 변수를 선언하면서 값 목록을 제공할 경우
int[] scores1 = {90, 85, 95};
System.out.println(scores1[0]);
System.out.println(scores1[1]);
System.out.println(scores1[2]);
// 변수를 선언하면서 값 목록을 제공할 경우
int[] scores2 = null;
// scores2 = {90, 85, 95}; 잘못된 코드
scores2 = new int[] {10, 20, 30};
// 컴파일러는 scores가 참조변수인것은 알아도 정확히 배열을 가리키는 건 모를수가 있다.
// 컴파일러를 위해서 int 배열임을 명시적으로 나타내준다.
// 메소드 호출 - 값을 전달하면서 호출하겠다
add(10); // call by value
add2(scores1); // call by reference
add2(scores2);
add2( new int[]{10, 20, 30});
}
// 메소드 선언
public static void add(int value) { // add 메소드
System.out.println("값: ");
}
// 메소드 선언
public static void add2(int[] arr) {
System.out.println("값: " + Arrays.toString(arr));
System.out.println("번지: " + arr);
}
}
package pr05;
public class exam03 { // 배열을 생성하는 첫 번째 방법
public static void main(String[] args) { // main 메소드
int[] scores1 = {90, 85, 95};
int[] scores2 = {90, 85, 95};
int[] scores3 = scores1;
System.out.println(scores1 == scores2); // false
System.out.println(scores1 == scores3); // true
}
}
2. 배열을 생성하는 두 번째 방법 - new 연산자로 배열 생성
: 향후 값들을 저장할 배열을 미리 생성하고 싶을 경우
[기본값 ]
package pr05;
public class exam04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr1 = new int[3];
for(int i=0; i<arr1.length; i++) {
System.out.println(arr1[i]); // 0
}
double[] arr2 = new double[3];
for(int i=0; i<arr2.length; i++) {
System.out.println(arr2[i]); // 0.0
}
boolean[] arr3 = new boolean[3];
for(int i=0; i<arr3.length; i++) {
System.out.println(arr3[i]); // false
}
String[] arr4 = new String[3];
for(int i=0; i<arr4.length; i++) {
System.out.println(arr4[i]); // null
}
}
}
- 기본타입을 제외한 참조타입의 기본값은 null이 들어감. 번지가 없다는 뜻
[다차원 배열]
- 자바는 1차원 배열을 이용해서 2차원 배열을 구현한다.
- 자바는 행렬 구조, 테이블 구조로 만들어지는 것이 아니다.
그럼 여기서 질문!
Q) scores[0]과 scores[1]이 참조하는 객체의 길이를 각각 다르게 줄 수 있을까?
답은 YES ~!! 아래 코드를 보시오!
int[][] scores = new int[2][];
scores[0] = new int[2];
scores[1] = new int[3];
※ 열거 타입
: 한정된 값만을 갖는 데이터 타입이 열거 타입(enumeration type) 이다.
열거 타입은 몇 개의 열거 상수중에서 하나의 상수를 저장하는 데이터 타입이다.
1. 열거 타입 선언
- 열거 타입은 관례적으로 첫 문자를 대문자로 하고 나머지는 소문자로 구성한다.
2. 열거 타입 변수
- 열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야 한다.
Week today = Week.SUNDAY;
- 열거 상수는 단독으로 사용할 수 없고 반드시 열거타입.열거상수로 사용된다.
- 열거 타입 변수는 null 값을 저장할 수 있는데 열거 타입도 참조 타입이기 때문이다.
- 열거 상수도 SUNDAY는 Week객체이다.
3. 열거 객체의 메소드
리턴 타입 | 메소드(매개 변수) | 설명 |
String | name() | 열거 객체의 문자열을 리턴 |
int | ordinal() | 열거 객체의 순번(0 부터 시작)을 리턴 |
int | compareTo() | 열거 객체를 비교해서 순번 차이를 리턴 |
열거 타입 | valueOf(String name) | 주어진 문자열의 열거 객체를 리턴 |
열거 배열 | values | 모든 열거 객체들을 배열로 리턴 |
[실습]
package ch05homework;
public class EnumMethodExample {
public static void main(String[] args) {
Week today = Week.SUNDAY;
String name = today.name();
System.out.println(name);
int ordinal = today.ordinal();
System.out.println(ordinal);
Week day1 = Week.MONDAY;
Week day2 = Week.WEDNESDAY;
int result1 = day1.compareTo(day2);
int result2 = day2.compareTo(day1);
System.out.println(result1);
System.out.println(result2);
if(args.length == 1) {
String strDay = args[0];
Week weekDay = Week.valueOf(strDay);
if(weekDay == Week.SATURDAY || weekDay == Week.SUNDAY) {
System.out.println("주말 이군요");
} else {
System.out.println("평일 이군요");
}
}
Week[] days = Week.values();
for(Week day : days) {
System.out.println(day);
}
}
}
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] Call-By-Reference vs Call-By-Value / 인스턴스멤버 vs 정적멤버 / 자바 접근제한자 (0) | 2021.02.22 |
---|---|
[JAVA] 객체지향 개념 / Method vs Function / 클래스 (필드, 메소드, 생성자) (0) | 2021.02.21 |
[JAVA] 배열 복사하는 3가지 방법 / Shallow Copy vs Deep Copy (0) | 2021.02.19 |
[JAVA] 자바 버전/ 기본 타입 / 타입변환(자동 vs 강제)/ JRE vs JDK (0) | 2021.02.16 |
JVM은 무엇이며 자바 코드는 어떻게 실행하는가. (0) | 2020.11.16 |
- Total
- Today
- Yesterday
- @functools.lru_cache
- os
- 메이븐 저장소
- 익명자식객체
- nodejs
- @functools.singledispatch
- 생성자필드메소드
- yarn start
- 정적멤버
- 자바스크립트Call-back
- java
- 백준2206 파이썬 풀이
- 자바스크립트Promise
- ES6
- 사용자정의예외클래스
- jre
- @functools.wraps
- sequelize.fn
- 객체지향개념
- 자바스레드
- nunjucks
- 클래스와객체
- 자바빌드도구
- es6모듈
- 백준
- 인스턴스멤버
- dynamic-project
- Git
- method와 function
- jdk
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |