본문 바로가기
JAVA

향상된 for문

by 요리하다그만둠 2022. 6. 24.

향상된 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