향상된 for문은 반복 실행을 하기 위해 카운터 변수와 증감식을 사용하지 않고 배열 및 컬렉션 항목의 개수만큼 반복하고 자동적으로 for문을 빠져나갑니다.
-(그림)
for문의 괄호( ) 에는 배열에서 꺼낸 항목을 저장할 변수 선언과 콜론 : 그리고 배열을 나란히 작성합니다.
1. 배열에서 가져올 첫 번째 값이 존재하는지 평가 -> 가져올 값이 존재하면 해당 값을 2 변수에 저장합니다.
그리고 3 실행문을 실행하는데 블록 내부의 실행문이 모두 실행되면 다시 루프로 돌아 1 배열에서 가져올 가음 값이 존재하는지 확인합니다. 만약 항목이 존재하면 2 -> 3 -> 1로 다시 진행되고 가져올 항목이 없으면 for문이 종료됩니다.
따라서 for문의 반복 횟수는 배열의 항목 수가 됩니다.
public class AdvancedForEx {
public static void main(String[] args) {
int[] scores = {95, 71, 84, 93, 87};
// 배열의 길이 5개
int sum = 0;
for(int score : scores) {
// 배열의 길이 반큼 반복합니다.
sum = sum + score;
}
System.out.println("점수 총합 : " + sum);
double avg = (double) sum/scores.length;
System.out.println("점수 평균 : " + avg);
}
}
결과 출력
열거 타입
데이터 중에는 몇 가지로 항전된 값만을 갖는 경우가 흔히 있는데 예를 들면 요일에 대한 데이터는
월, 화, 수, 목, 금, 토, 일 이라는 7개의 값만을 갖고, 계절에 대한 데이터는 봄, 여름, 가을, 겨울이라는 4개의 값만 가집니다.
이와 같은 한정된 값만을 갖는 데이터 타입을 열거 타입(enumeration type)입니다.
열거 타입은 몇 개의 열거 상수(enumeration constant) 중에서 하나의 상수를 저장하는 데이터 타입입니다.
열거 타입을 선언 해보면 먼저 열거 타입의 이름을 정하고 열거 타입 이름으로 소스파일을 생성해야 합니다.
열거 타입 이름은 관례적으로 첫 문자는 대문자고 나머지는 소문자로 구성됩니다. 여러 단어로 구성되었으면 첫 문자는 대문자입니다.
public enum 열거타입이름 {....}
요일로 한번 만들어 보겠습니다.
열거 타입을 선언했으면 열거 상수도 선언해야 하는데 열거 상수는 열거 타입의 값으로 사용되는데
관례적으로 열거 상수는 모두 대문자로 작성합니다.
public enum Week {
Monday,
TUESDAY,
WEDENSDAY,
THURSDAY,
FRIDAY,
SATUDAY,
SUNDAY
}
만약 열거 상수가 여러단어로 구성되어 있으면 단어 사이에 _을 사용하는 게 관례라고 합니다.
열거 타입의 변수를 선언하는 방법입니다.
열거타입 변수;
위에 Week로 예를들면
Week today;
이런 식으로 작성하면 됩니다.
열거 타입 변수를 선언하고 밑처럼 열거 상수를 저장할 수 있습니다.
열거 상수는 단독으로 사용할 수는 없고 반드시 열거 타입. 열거 상수로 사용됩니다
열거타입 변수 = 열거타입.열거상수;
예를 들어 today 열거 변수에 열거 상수인 SUNDAY를 저장하면 다음과 같습니다.
Week today = Week.SUNDAY;
열거 타입 변수는 null 값도 저장 가능합니다. 열거 타입도 참조 타입이기 때문입니다.
Week birthday = null;
Calendar를 이용해서 오늘의 요일을 얻고 나서 열거 타입 변수 today에 해당 열거 상수를 대입하는 예제입니다.
import java.util.Calendar;
public class EnumWeekEx {
public static void main(String[] args) {
Week today = null; // 열거 타입 변수 선언
Calendar cal = Calendar.getInstance();
int week = cal.get(Calendar.DAY_OF_WEEK);
// 일1~토7까지의 숫자를 리턴해줍니다.
switch(week) {
// 열거 상수를 대입
case 1:
today = Week.SUNDAY; break;
case 2:
today = Week.Monday; break;
case 3:
today = Week.TUESDAY; break;
case 4:
today = Week.WEDENSDAY; break;
case 5:
today = Week.THURSDAY; break;
case 6:
today = Week.FRIDAY; break;
case 7:
today = Week.SATUDAY; break;
}
System.out.println("오늘 요일 : " + today);
if(today == Week.SUNDAY) {
System.out.println("일요일에는 축구를 합니다.");
}else {
System.out.println("열심히 자바 공부를 합니다.");
}
}
}
결과 출력
열거 객체의 메서드
리턴 타입 | 메소드(매개 변수) | 설명 |
String | name() | 열거 객체의 문자열을 리턴 |
int | ordinal() | 열거 객체의 순번(0부터 시작)을 리턴 |
int | compareTo() | 열거 객체를 비교해서 순번 차이를 리턴 |
열거타입 | valueOf(String name) | 주어진 문자열의 열거 객체를 리턴 |
열거 배열 | values() | 모든 열거 객체들을 배열로 리턴 |
name() 메서드
열거 객체가 가지고 있는 문자열을 리턴해줍니다.
Week today = Week.SUNDAY;
String name = today.name();
ordinal() 메서드
ordinal() 메서드는 전체 열거 객체 중 몇 번째 열거 객체인지 알려줍니다.
열거 객체의 순번은 열거 타입을 정의할 때 주어진 순번을 말하는데, 0번부터 시작합니다.
Week today = Week.Sunday;
int ordinal = today.ordinal();
oridinal()가 6을 리턴해서 ordinal변수에 6을 저장시킵니다.
월, 화, 수, 목, 금, 토, 일 = 0, 1, 2, 3, 4, 5, 6
compareTo() 메서드
compareTo() 메서드는 매개 값으로 주어진 열거 객체를 기준으로 전후로 몇 번째 위치하는 지를 비교합니다.
만약 열거 객체보다 순번이 빠르면 음수, 순번이 늦으면 양수가 리턴됩니다.
Week day1 = Week.MONDAY;
Week day2 = Week.WEDENSDAY;
int result1 = day1.compareTo(day2); // -2
int result2 = day2.compareTo(day1); // 2
월요일은 0이고 수요일은 2이기 때문에 비교해보니 월요일이 (순번 : 0) 이 수요일(순번 : 2) 보다 앞에 위치하고 순번 차이가 나므로 음수 -2가 저장되는 것입니다.
반대는 2가 저장되는 거죠
values() 메서드
values() 메서드는 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴해줍니다.
Week[] days = Week.values()
for(Week day : days) {
System.out.println(day);
}
Week 배열은 위처럼 생성됩니다. 열거 객체의 순번은 같고 각 인덱스 값은 해당 순번의 열거 객체 번지입니다.
-(그림)
열거 객체의 메서드
public class EnumMethodEx {
public static void main(String[] args) {
// name() 메소드
Week today = Week.SUNDAY;
String name = today.name();
System.out.println(name);
// ordinal() 메소드
int ordinal = today.ordinal();
System.out.println(ordinal);
// compareTo() 메소드
Week day1 = Week.Monday;
Week day2 = Week.WEDENSDAY;
int result1 = day1.compareTo(day2);
int result2 = day2.compareTo(day1);
System.out.println(result1);
System.out.println(result2);
// valueOf() 메소드
if(args.length == 1) {
String strDay = args[0];
Week weekDay = Week.valueOf(strDay);
if(weekDay == Week.SATUDAY || weekDay == Week.SUNDAY) {
System.out.println("주말 입니다.");
}else {
System.out.println("평일 입니다.");
}
}
// values() 메소드
Week[] days = Week.values();
for(Week day : days) {
System.out.println(day);
}
}
}
결과 출력
valueOf 메서드가 출력이 안되네요??? 뭐지.. 시간 될 때 다시 해보겠습니다.
'JAVA' 카테고리의 다른 글
Java 클래스 - 필드 (0) | 2022.07.15 |
---|---|
Java 클래스 (0) | 2022.07.15 |
Array 다차원 배열 (0) | 2022.06.23 |
Arrary (0) | 2022.06.21 |
Stream (0) | 2022.06.03 |