해당 포스트는
Yalco님의 강의를 바탕으로 작성했습니다.
| 자료형 | 크기 | 표현 범위 | 참고 |
|---|---|---|---|
| byte | 1바이트(8비트) | -128 ~ 127 | 2⁸ (2의 8승)개의 데이터 표현 |
| short | 2바이트(16비트) | -32,768 ~ 32,767 | 2¹⁶ (2의16승)개의 데이터 표현 |
| int | 4바이트(32비트) | -2,147,483,648 ~ 2,147,483,647 | 2³² (2의32승)개의 데이터 표현 |
| long | 8바이트(64비트) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 2⁶⁴ (2의64승)개의 데이터 표현 |
byte였던 1이 short의 변수 값으로 들어가면 동일한 1의 값을 갖지만short 자료형의 1로 바뀐다.casting)Java에서 정수 리터럴은 int타입으로 간주되기 때문에, long타입을 명시적으로 나타내지 않으면
컴파일러는 int로 인식하여 범위를 초과하는 값에 대해 오류를 발생시킨다.
🪄 정수 리터를 끝에 L을 붙여 long형을 명시한다.
long _8b_longNum1 = 123456789123456789; // error
long _8b_longNum2 = 123_456_789_123_456_789L;
또한 정수 표현의 가독성을 위해 Java7부터 _사용이 가능하다.
long _8b_longNum = 123456789123456789L;
변수나 값을 다른 데이터 타입으로 변환하는 과정으로,
묵시적 형 변환과 명시적 형 변환이 있다.
묵시적 형 변환 : 작은 데이터 타입에서 큰 데이터 타입으로 변환할 때 자동으로 이루어진다.
명시적 형 변환 : 큰 데이터 타입에서 작은 데이터 타입으로 변환할 때 직접 형 변환을 명시해야 한다.
byte byteNum;
int intNum = 12345;
byteNum = (byte)intNum; // error, 12345는 byte형 범위를 벗어난다.
위의 경우 byteNum에는 12345의 32비트 이진수 표현에서 하위 8비트만 취한 값의 10진수인 57이 할당된다.
연산자에는 우선순위가 존재한다.

이항 연산자는 좌우 두 값을 계산한 뒤 결과를 반환(return)한다.
| 연산자 | 연산 의미 |
|---|---|
| + | 더하기 |
| - | 빼기 |
| * | 곱하기 |
| / | 나누기 |
| % | 나머지 |
%연산자는 홀수/짝수 구분에 널리 사용된다.(short) intNum1 + intNum2의 경우, intNum1만 short형으로 형 변환short + int의 연산이므로 error발생int intNum1 = 10;
int intNum2 = 20;
short result = (short) intNum1 + intNum2; // error
short result = (short)(intNum1 + intNum2);
byte와 short간의 연산은 모두 int를 반환한다.byte와 byte의 연산 결과 intshort와 short의 연산 결과 intbyte와 short의 연산 결과 intint result = 5/2의 연산 결과는 2복합 대입 연산자는 부수효과를 발생시킨다.
부수 효과란 연산을 수행하면서 변수의 값을 변경하는 것을 의미한다.
복합 대입 연산자는 산술 연산과 대입 연산을 동시에 수행하므로, 변수의 상태를 변화시키는 결과를 낳는다.
| 연산자 | 연산 의미 |
|---|---|
| a += b | a = a + b |
| a -= b | a = a - b |
| a *= b | a = a * b |
| a /= b | a = a / b |
| a %= b | a = a % b |
byte x = 127 // byte의 최대값
x += 1 // 128이 아닌 byte의 최솟값 -128이 할당된다.
| 연산자 | 반환값 | 부수효과 |
|---|---|---|
| + | 값 그대로 | 없음 |
| - | 양음 반전 | 없음 |
| x ++ | 값 그대로 | 1증가 |
| ++ x | 1증가한 값 | 1증가 |
| x -- | 값 그대로 | 1감소 |
| -- x | 1감소한 값 | 1감소 |
++x, --xx++, x--단항 연산자는 변수 내의 값에 연산을 하므로 리터럴에 사용할 수 없다.
int intNum1 = 3++ ; //error
int intNum2 = --5; //error
비교 연산자는 연산의 결과로 boolean값을 반환한다. - true or false
| 연산자 | 연산 의미 |
|---|---|
| a == b | a와 b는 같다 |
| a != b | a와 b는 다르다 |
| a > b | a가 b보다 크다 |
| a >= b | a가 b보다 크거나 같다 |
| a < b | a가 b보다 작다 |
| a <= b | a가 b보다 작거나 같다 |
실수 자료형을 이해하기 위해서는 부동소수점에 대한 이해를 먼저 해야한다.
참고 자료
Tistory-inpa-실수표현(부동소수점) 원리 한눈에 이해하기
Youtube-yalco-부동소수점
| 자료형 | 크기 |
|---|---|
| float | 4바이트 |
| double | 8바이트 |
double은 float보다 단순히 범위가 넓은 것이 아니라, 보다 정밀한 표현이 가능하다.
float에는 double을 담을 수 없고, double에는 float을 담을 수 있다.Java에서 flaot형 변수를 선언할 때 f/F를 사용하지 않으면, 해당 값은 기본적으로 double형으로 간주된다.
f/F을 명시하지 않으면 float형 변수에 double형 값을 할당하는 것으로 해석하므로
컴파일 오류가 발생할 수 있다.
float floatNum1 = 3.14; //error
float floatNum2 = 3.14f;
🪄 정수형에서 정수형의 리터럴은 기본적으로 int타입으로 간주되어
L을 명시하여 long형임을 알리는 것과 같다.
실수 자료형 float과 double에 정수 자료형 long의 값을 대입할 때 묵시적 형 변환이 발생한다.
🪄 단, float은 4바이트(32비트)로 제한되기 때문에 long의 큰 값을 정확하게 표현하지 못해
long에서 float으로 변환할 때는 정밀도 손실이 발생할 수 있다.
float과 flaot의 연산 결과는 flaotfloat과 double의 연산 결과는 double🪄 단, 실수 자료형의 연산은 부동소수점 방식상 오차가 자주 있다.
부동소수점 오차 해결을 위해서는 BigDecimal 클래스를 사용하면 해결 가능하다.
int result = 5 / 2.5f; // error, 연산 결과는 실수
int result = (int)(5 / 2.5f); // 명시적 형 변환을 통해 해결
float result = 5 / 2.5f; // 결과를 담는 변수의 자료형을 실수형으로 바꿔 해결
double을 명시하려면 .0을 붙인다.double result = 5/2; 의 경우, 정수 연산 5/2이 먼저 처리되어 소수점 이하는 버려진 2가 double result = 5 / 2 ; // 연산결과 2.0
double reulst = 5 / 2.0; // 연산결과 2.5
float floatNum = 3.14f;
int result = (int)floatNum; // 연산 결과 3
비교 연산은 정수-실수, 또는 다른 숫자 자료형 간 사용 가능하다.
int intNum = 5;
float floatNum = 5f;
double doubleNum1 = 5.0;
double doubleNum2 = 7.89;
boolean bool1 = intNum == floatNum;
boolean bool2= floatNum == doubleNum1;
boolean bool3= intNum == doubleNum2;
boolean bool4= intNum > dobuleNum2;
boolean bool5 floatNum >= doublueNum2;
boolean bool6 dobuleNum1 < doubleNum2;
문자 자료형 char(character)는 홑따옴표를 사용해 1개의 문자를 표현한다.
문자 자료형의 크기는 2byte를 사용하며, 유니코드상의 문자 표현이 가능하다.
각 문자는 상응하는 정수를 가진다.
Java는 Uni code표준을 따른다.
Uni code는 전 세계 문자들을 표현하는 표준ASCII code는 Uni code의 하위 집합으로, 영문자/숫자/일부 특수 문자를 7비트로 표현하는 표준char형은 Uni code 문자를 저장하지만, ASCII code로 표현 가능한 문자에 대해서는 ASCII code값을 그대로 사용한다.char ch1 = 'A'; // 65
char ch2 = 'a'; // 97
char ch3 = 'a'+1; // b, 98
char ch4 = '가'; // 44032
char ch5 = '가'+1; // '각' 44033
// 명시적으로 형변환을 하지 않아도 묵시적 형변환 가능
int ch1Int = (int) ch1; // ch1Int: 65
int ch5Int = (int) ch5; // ch5Int: 44033
int ch1Int = ch1;
int ch5Int = ch5;
//문자 리터럴과 숫자, 유니코드로 표현 가능(모두 A를 표현)
char ch6 = 'A';
char ch7 = 65;
char ch8 = '\u0041';
각 문자는 상응하는 정수를 가진다 를 머리에 박고 시작
char형은 문자 데이터를 저장하지만, 내부적으로 int형으로 저장되기 때문에,
int형과의 연산이 가능하며 문자와 숫자 간의 변환이 용이하다.
char → int 변환char는 2byte, int는 4byte, 데이터 손실이 없다.char ch1 = 'a'; // 유니코드 97
int a1 = ch1; // 자동 형 변환
System.out.println(a1); // 출력: 97
int → char 변환int는 4byte, char는 2byte, 데이터 손실 가능성이 있다.int a2 = 65; // 'A'의 유니코드 값
char ch2 = (char) a2; // 명시적 형 변환
System.out.println(ch2); // 출력: A
char와 int의 연산 결과는 int🪄 char와 int의 연산 결과는 항상 int이므로
결과를 다시 char로 사용하고 싶다면 명시적 형 변환이 필요
char ch = 'A';
int result = ch + 1; // 'A'의 유니코드 값 65에 1을 더함
System.out.println(reulst); // 출력 66
System.out.println((char)reulst); // 출력 'B'
char와 char의 연산 결과도 int🪄 결과를 다시 char로 사용하고 싶다면 명시적 형 변환이 필요
📌 그니까 char변수와 char변수의 연산 결과는 int
📌 근데 char리터럴과 char리터럴의 연산 결과는 char ㅅㅄㅂ
char ch1 = 'a'; // 유니코드 값 97
char ch2 = 'b'; // 유니코드 값 98
int result = ch1 + ch2; // 두 유니코드 값을 더함, 195
char ch3 = (char)(ch1 + ch2); // 결과를 char로 변환, A
char ch4 = 'a' + 'b'; // A, 195
char, int 둘 다 가능char 불가, int 가능 // 문자 리터럴 + 정수 리터럴 = char, int 둘다 가능
char chResult = 'A' + 1;
System.out.println(chResult); // 출력 B
int intResult = 'A' + 1;
System.out.println(intResult); // 출력 66
// 문자 변수 + 정수 리터럴 = char 불가, int 가능
char ch = 'A';
chResult = ch + 2; // error
intResult = ch + 2;
System.out.println(intResult); // 출력 67
char 형에서 빈 문자는 불가, 공백(space)은 가능 - String에서는 빈 문자(열) 가능
char empty =''; // error
char space = ' ';
char은 내부적으로 int형으로 저장된다. - 문자와 정수의 비교 연산이 가능하다.
boolean bool1 = 'A' == '가';
// 정수값을 기준으로 비교한다.
boolean bool2 = 'A' == 65;
boolean bool3 = 'A' == 66.0; // 정수 66과 비교
booelan bool4 = 'A' == 67f; // 정수 67과 비교
// 사전 상 먼저 오는 쪽이 작다.
boolean bool5 = 'A' < 'B';
boolean bool6 = '가' > '나';
boolean 자료형은 참/거짓(true/false) 둘 중 하나의 값을 가진다.true, false)보다는 반환 값으로 많이 사용된다.| 분류 | 연산자 | 연산 의미 |
|---|---|---|
| 부정 연산자 | ! | boolean 값을 반전 |
| 논리 연산자 | a && b | a와 b가 모두 true일때만 true반환 |
| 논리 연산자 | a ll b | a와 b중 하나만 true여도 true반환 |
| 삼항 연산자 | a ? b : c | a가 true면 b반환, false면 c반환 |
🪄 && 연산자가 ||연산자보다 우선순위가 높다.
&& : 앞의 연산이 false면 뒤의 연산을 평가할 필요 없음|| : 앞의 연산이 true면 뒤의 연산을 평가할 필요 없음평가는 실행을 의미한다.
단축 평가를 이용해 간결한 코드를 작성하고,
실행에 필요한 리소스를 절약하기 위해 연산 부하가 적은 코드를 앞에 작성한다.
조건식의 true / false에 따라 하나의 연산만 수행
int x = 1, y = 2;
int changed1 = x < y ? (x += 2) : (y += 2);
int changed2 = x < y ? (x += 2) : (y += 2);
문자열 자료형 String은 참조 자료형(Reference Type)이다.
그러나 기본 자료형(Primitive Type)과 유사하게 사용 가능하다.
"")로 둘러쌈String형은 클래스의 인스턴스String형의 생성은 리터럴 방식과 인스턴스 방식이 있다.
String str1 = "Literal";
String str2 = new String("Instance");
Heap 영역의 String Pool에 저장String Pool의 주소를 참조String hl1 = "Hello";
String hl2 = "Hello";
String wld = "World";
new 키워드를 사용해 문자열 객체가 생성new 키워드를 사용하면 매번 새로운 객체가 Heap에 생성되므로,String hl3 = new String("Hello");
String hl4 = new String("Hello");
== 연산 : 두 객체의 참조(주소)를 비교== 결과 true== 결과 falseequals() 메소드 : 두 객체의 내용을 비교=(대입) 연산 : 객체의 참조를 복사 // 리터럴 생성 방식
String hl1 = "Hello";
String hl2 = "Hello";
String wld = "World";
// 리터럴끼리는 == 을 사용하여 비교 가능
boolean bool1 = hl1 == hl2; // true
boolean bool2 = hl1 == wld; // false
// 인스턴스 생성 방식
String hl3 = new String("Hello");
String hl4 = new String("Hello");
// hl5는 hl4를 참조하도록 초기화
// 동일한 객체 참조, 동일한 메모리 주소를 가리킴
String hl5 = hl4;
// 💡 인스턴스와 비교하려면 equals() 메소드를 사용
// 특별한 경우가 아니면 문자열은 equals()로 비교할 것
boolean bool3 = hl3 == hl4; // ⚠️false
// 리터럴, 인스턴스 모두 equals() 사용 가능
boolean bool4 = hl1.equals(hl2);
boolean bool5 = hl1.equals(hl3);
boolean bool6 = hl3.equals(hl4);
boolean bool7 = wld.equals(hl2);
// 같은 곳을 참조하는 인스턴스들
boolean bool8 = hl4 == hl5; // ✅true
boolean bool9 = hl4.equals(hl5); // ✅true
+ 연산 : 이어붙인 결과를 반환+= 연산 : 해당 변수에 문자열을 이어붙이고, 결과를 반환(부수효과)final)에는 적용할 수 없음+=외에 다른 복합 대입 연산자 사용불가+ 연산다른 자료형을 문자열로 취급해 이어붙임
int intNum = 123;
double dbNum = 3.14;
boolean bool = true;
char ch = '가';
String str ="내 밑으로 다 집합";
System.out.println(str + intNum + dbNum + bool + ch);
String.valueOf()메서드String str1 = String.valueOf(3.14f);
String str2 = String.valueOf(true);
+ 연산자 이용하기+ 다른 자료형 = 문자열""(공백) 입력이 가능String str3 = true + "";
String str4 = 123.45+"";
Wrapper class의 parse()메서드
Boolean.parseBoolean(String s) 의 경우"true" 라고 정확하게 매칭되는 문자열만 true로 변환하고, 그 외에 모든 문자열에 대해서는 false를 반환한다.Character는 parseCharacter() 메서드가 없다.charAt() 메서드로 문자열을 문자로 변환String 클래스 메서드로, 문자열에서 특정 인덱스에 있는 문자를 반환한다.
// String - char
String str = "난 짱이다";
char ch = str.chatAt(2); // '짱'
String str = "123";
// String - 정수
byte byteNum = Byte.parseByte(str);
short shtNum = Short.parseShort(str);
int intNum = Integer.parseInteger(str);
long longNum = Long.parseLong(str);
// String - 실수
float fltNum = Float.parseFloat(str);
double dbNUM = Double.parseDouble(str);
// String - boolean
boolean bool1 = Boolean.parseBoolean(str); // false
boolean bool2 = Boolean.parseBoolean("TRUE"); // true
boolean bool3 = Boolean.parseBoolean("True"); // true
boolean bool4 = Boolean.parseBoolean("true"); // true
Wrapper Class의 parse()메소드 중 문자열을 숫자로 변환하는 과정에서
해당 문자열이 적절한 숫자 형식이 아니면 NumberFormatException 런타임 에러가 발생한다.
byte byteNum = Byte.parseByte("12345"); // 범위 초과
int intNum = Integer.parseInteger("123.45"); // 부적절한 형식
double dbNum = Double.parseDouble("하나"); // 부적절한 형식
| 이스케이프 문자 | 표현 |
|---|---|
| \" | 큰 따옴표 |
| \' | 작은 따옴표 |
| \n | 줄바꿈(개행) |
| \t | 탭 |
| \\ | 백슬래시 하나 |
String 객체는 불변성을 가지므로, String 객체가 한 번 생성되면 그 객체의 내용을 바꿀 수 없다.String 객체의 불변성은 String 클래스에서 제공하는 모든 메서드가String 객체를 반환하는 방식으로 구현된다.String객체를 수정하지 않고, 새로운 String객체를 생성한다.+= 연산자를 생성하면, 새로운 String 객체가 생성되고,위의 코드에서 "삼겹살" 문자열이 str에 할당된 후, str.concat() 메서드를 통해 "삼겹살항정살", "삼겹살항정살냉면", "삼겹살항정살냉면껍데기" 라는
새로운 String 객체들이 생성된다.
str이 가리키는 참조가 바뀌는 것이고, 그 전의 문자열 객체들은 여전히 변경되지 않고 그대로 메모리에 남아있다.
또 중요한 점은 concat 메서드는 원래 문자열(str)을 변경하는 것이 아니라,
새로운 문자열을 생성해서 반환한다는 것이다. - String의 불변적 특성
| 메서드 | 메서드 동작 | 사용예시 | 리턴값 |
|---|---|---|---|
| length() | 문자열 길이 반환 | str.length() | int |
| isEmpty() | 문자열의 길이가 0인지 확인 | str.isEmpty() | bool |
| isBlank() | 공백문자를 제외한 문자열 길이가 0인지 확인 | str.isBlank() | bool |
| trim() | 문자열 앞뒤 공백 제거 트리밍 | str.trim() | String |
| charAt(index) | 문자열에서 index위치의 문자 반환 | str.charAt(5) | char |
| indexOf(문자 또는 문자열) | 문자열에서 문자 또는 문자열의 위치 반환 | str.indexOf("대박") | int |
| lastIndexOf(문자 또는 문자열) | 문자열에서 문자 또는 문자열이 마지막으로 등장하는 위치 반환 | str.lastIndexOf("이다") | int |
| equals(문자열) | 두 문자열이 동일한 내용인지 비교 (대소문자 구분) | str1.equals(str2) 또는 "안녕".equals("안뇽") | bool |
| equlasIgnoreCase() | 두 문자열이 동일한 내용인지 비교 (대소문자 무시) | equals() 참고 | bool |
| contains(문자열) | 문자열이 특정 문자열을 포함하는지 확인 | str.contains("짱") | bool |
| startsWith(문자열) | 문자열이 특정 문자열로 시작하는지 확인 | str.startWith("나는") | bool |
| endsWith(문자열) | 문자열이 특정 문자열로 끝나는지 확인 | str.endsWith("이다") | bool |
| compareTo(문자열) | 서로 다른 문자열을 (대소문자를 구분하여) 사전적 비교에 따라 음수/양수 반환 | str1.compareTo(str2) | int |
| compartToIgnoreCase(문자열) | 서로 다른 문자열을 (대소문자를 무시하고) 사전적 비교에 따라 음수/양수 반환 | compareTo() 참고 | int |
| toUpperCase() | 문자열을 모두 대문자로 변환 | str.toUpperCase() | String |
| toLowerCase() | 문자열을 모두 소문자로 변환 | str.toLowerCase() | String |
| concat(문자열) | 두 문자열 연결 | str.concat("이어붙이기") | String |
| repeat(정수) | 문자열을 주어진 정수만큼 반복 | str.repeat(3) | String |
| substring(begin, end) | 문자열을 begin부터 end까지 잘라오기 | str.substring(5, 7) | String |
| replace(old, new) | 문자열의 old문자열을 new문자열로 치환 | str.replace("밥", "빵") | String |
| toCharArray() | 문자열을 분할하여 문자 배열로 반환 | char[] arr=str.toCharArray() | char[ ] |
| split(구분자) | 문자열을 구분자 기준으로 분할하여 문자열 배열로 반환 | String[ ] arr = str.split(","); | String[] |
compareTo(), comparToIgnoreCase()이어붙이기 대상
concat()은 문자열끼리만 이어붙이기 가능
+ 연산은 다른 자료형을 문자열로 취급해 이어붙이기 가능
인스턴스 생성
concat()은 필요시에만 새 인스턴스 생성
str.concat(""); 과 같은 코드는 새 인스턴스를 생성하지 않음.
+ 연산은 새 인스턴스 생성
str + ""; 과 같은 경우에도 새 인스턴스를 생성
null과의 관계
concat()은 null과 이어붙이기 불가
null과 이어붙이면 NullPointException 발생
+연산은 null과 이어붙이기 가능
str1 + null + "ABC"; 가능
format() : 정적 메서드, 클래스 이름(String)을 사용해 호출
formatted() : 인스턴스 메서드, 포메팅이 필요한 문자열 객체에서 바로 호출
String profile = "Name: %s, Age: %d";
String name = "Haley";
int age = 28;
// 변수에 저장하는 방식
String formatString1 = String.format(profile, name, age);
String formattedString2 = profile.formatted(name, age);
// 바로 출력하는 방식
System.out.println(String.format("Name: %s, Age: %d", name, age));
System.out.println("Name: %s, Age: %d".formatted(name, age));
| 포맷 지정자 | 데이터 타입 |
|---|---|
| %s | String |
| %d | Integer |
| %f | Float |
| %c | Character |
| %b | Boolean |
| %t | Date/Time |
| %n | 포맷 문자열 내 줄바꿈 |
Java에서 null은 참조 자료형과 원시 자료형에서 다르게 동작한다.
이 차이는 메모리 관리와 변수 선언 방식에서 비롯된다.
1. 🪄 참조 자료형(Reference Type)
참조 자료형은 객체를 참조하는 타입으로, 객체의 메모리 주소를 저장한다.
Heap 영역에 있는 객체의 메모리 주소를 저장한다.Stack 에 저장Heap 에 저장된다.null을 기본값으로 가진다.null을 할당하면,Garbage Collector에 의해 Heap에서 제거된다.null은 아무것도 참조하지 않는다는 것을 의미한다.null이 할당되면 해당 변수는 어떤 객체도 참조하지 않으며,NullPointerException이 발생할 수 있다.2. 🪄 원시 자료형(Primitive Type)
원시 자료형은 가장 기본적인 데이터 타입으로, 메모리에 직접 값을 저장한다.
Stack 영역에 직접 값을 저장null을 할당할 수 없다.Heap영역에 자리를 차지null문자열 : Heap영역에 할당되지 않음(참조하는 곳이 없음)
같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여한 자료구조
Heap 영역에 생성되고 배열 변수는 Heap 영역의 배열 객체를 참조한다.타입[] 변수 = {값1, 값2, 값3 ... };⚠️배열 변수를 이미 선언한 후에 다른 실행문에서 중괄호를 이용한 배열 생성 불가
String[] names;
names = {"한놈", "두시기", "석삼", "너구리"}; // error
✅ 배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황일때 new연산자 이용
String[] names;
names = new String[]{"한놈", "두시기", "석삼", "너구리"};
new 연산자로 생성타입[] 변수 = new 타입[]{값1, 값2, 값3 ...};타입[] 변수 = new 타입[길이]; - new연산자로 생성시, 배열은 기본값으로 초기화length : 배열을 대상으로 배열의 길이(배열 요소의 수)를 나타내는 int형 필드length() : 문자열을 대상으로 문자열의 길이를 반환하는 int형 메서드2차원 이상의 다차원 배열로, 상위 배열은 하위 배열의 주소값을 가진다.
int[][] scores = new int[2][3];
scores.length : scores배열의 행의 개수 - 배열의 첫 번째 차원scores[0].length : scores배열의 첫 번째 행의 열의 개수scores[1].length : scores배열의 두번째 행의 열의 개수
Stack
참조 변수 scores - 첫 번째 차원(배열의 행)을 가리키는 메모리 주소 저장
Heap
scores가 참조하는 행 배열 생성
scores[0], scores[1]은 하위 배열을 가리키는 참조 변수로 사용scores[0]이 가리키는 하위 배열 생성
scores[1]이 가리키는 하위 배열 생성
split(구분자) : 문자열 → 배열, 문자열을 구분자로 나누어 배열로 반환
String namesString = "한놈 두시기 석삼 너구리";
String namesArray = namesString.split(" ");
join(구분자) : 배열 → 문자열, 배열 요소 사이에 구분자를 삽입해 문자열 생성
String[] namesArray = {"한놈", "두시기", "석삼", "너구리"};
String namesString = String.join(" ", namesArray);
요일 : 월, 화, 수, 목, 금, 토, 일
계절 : 봄, 여름, 가을, 겨울
위와 같이 한정된 값만을 갖는 타입을 열거 타입(Enumeration Type) 이라고 한다.
열거 상수(Enumeration Constant)enum Day {
SUNDAY, MONDAY, THUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
public class Main{
public static void main(String[] args){
Day today = Day.SUNDAY;
System.out.println(today);
}
}
null을 할당할 수 있다.public static final 필드로 공개한다. 
Method 영역에 열거 타입 클래스가 올라간다. - 열거 타입은 일종의 클래스Method 영역에 생성된 열거 상수가 객체를 각각 참조한다.Heap 영역에 실제 객체(인스턴스)가 올라간다.Stack 영역에 열거 타입 변수가 올라간다.today에 Week.SUNDAY열거 상수가 참조하는열거 타입은Enum 클래스를 상속한다.
따라서 열거 타입에서 사용할 수 있는 메소드는 Enum 클래스에서 제공하는 메소드다.
| 메소드 | 메소드 동작 | 사용 예시 | 리턴값 |
|---|---|---|---|
| name() | 열거 상수의 이름 반환 | today.name(); | String |
| ordinal() | 열거 상수가 정의된 순서 반환 | today.ordinal() | int |
| valueOf(String name) | 주어진 이름과 일치하는 열거 상수 반환 | Week.valueOf("Modnay"); | Week(열거 상수) |
| values() | 모든 열거 상수를 배열로 반환 | Week.values(); | Week[](열거 상수 배열) |
휴 큰일했다 ..