TIL / JAVA 1주차(2) / 조건문 / 반복문 / 배열

병아리코더 아카이브·2023년 8월 15일

JAVA

목록 보기
2/20
post-thumbnail

조건문

조건을 만족할 때만 { } 를 수행

if 문

if문을 사용할 때 반드시 else를 사용해야 하는 건 아니다.
하지만 if 안의 조건을 만족하지 못할 경우를 만들 때는 else 를 활용하는 것이 유리하다
if만 사용하면 어느 것도 해당되지 않을 때의 경우 ( 틈 ) 를 따로 만들어야 해서 더 복잡해지기 때문이다. else 이러한 틈을 메워준다.

switch 문

처리해야 하는 경우의 수가 많을 때 유용한 조건문
특정 case 마다 특정 내용을 실행한다.

조건을 하나씩 확인하는 if 와 달리 swtich는 해당 값과 조건이 일치하면 바로 그 case 로 이동한다.
그래서 여러 조건을 사용하고 싶을 때는 if 를 사용하는 것이 적합하고, 한 번에 빠르게 처리하고 싶을 때는 switch를 활용하는 것이 좋다.

switch ( 조건식 ) {
	case 값1 : // 조건식 결과가 값1 이면 수행할 내용
    		   break;
    case 값2 : // 조건식 결과가 값2 이면 수행할 내용
    		   break;
    ...
    default : // else 와 동일 ( 없어도 상관 없음 )
}

switch 의 제약조건

case 값에는 조건이 들어가지 못한다. 오로지 값만 들어가 한계가 있다.
그래서 값이 명확할 경우에 switch를 활용한다.

*switch case 는 jdk 1.6 이하에서는 문자열을 받지 못한다. ( int, char 은 가능 ) 만약 문자열을 사용하고 싶으면 배열로 만들어 인덱스를 이용한다.


반복문

조건을 만족하는 동안 { } 의 내용을 반복

for 문

반복횟수가 정해진 경우 주로 사용함.

for (;;) {...} 와 같이 선언, 조건, 증감은 생략이 가능하다.
단 이렇게 쓰면 for(true) 가 되서 무한 반복한다.

이중 for 문

바깥 쪽 for 문이 한 번 일어날 때 동시에 여러 번의 반복이 일어날 대 이중 for 문을 사용한다.

( ex ) 구구단, 별찍기 etc ...

향상된 for 문

덩어리에서 값을 하나씩 뽑을 때 사용 한다.
인덱스는 알려주지 않음.

// score 이라는 배열의 요소를 하나씩 뽑아 int i 에 저장
for (int i : score) {
	System.out.println("점수 : " + i);
}

while 문

while 의 조건식이 참일 동안은 문장이 계속 돌아가는데 조건의 반복 횟수를 모를 때 유용하다.
for 문 처럼 반복 횟수를 적어 사용도 가능하다.

Do while 문

do {
 // 조건 만족 시 실행할 문장 ( do 먼저 실행 후 while 실행 )
} while ( 조건 );

while 과 do-while 은 기본적으로는 같은 값을 반환하지만 조건을 벗어난 값이 들어왔을 때 차이가 생긴다.
( while 은 아예 실행 안하고 do는 일단 한 번 할 일을 한 뒤 실행 중단 )

사용자 입력을 받는 코드에서 유용하게 쓰인다.

int input = 0;
int answer = 0;

answer = (int) (Math.random() * 100) + 1;	// 랜덤값
System.out.println("answer=" + answer);		
Scanner scanner = new Scanner(System.in);	
// 화면으로부터 데이터를 입력받는 기능 제공 클래스

do {	
	System.out.println("1과 100사이의 정수를 입력하세요. >");
	input = scanner.nextInt();	
    // 입력 후 입력받은 값 input에 대입

	if (input > answer) {
		System.out.println("더 작은 수로 다시 시도해 보세요");
	} else if (input < answer) {
		System.out.println("더 큰 수로 다시 시도해 보세요");
	}	
} while (input != answer);

Break 문

break 에 걸리면 코드를 탈출시켜준다.
반복문을 돌리다가 그만 돌리고 싶을 때 break 사용.
switch 에서도 case 마다 break 가 걸려있어야 다음 case로 넘어가지 않는다.

Break 예시

  1. 탐색할 때 (10000 개의 데이터 중 찾는 내용이 500 번 째에 있다면 더이상 반복하지 않는다)
  2. sharing (10000 개의 빵을 나누어 주는 데, 10000 개가 소진되면 더이상 나눠주지 않고 빠져나온다.)

Continue 문

continue 걸렸을 때 그 밑의 내용을 싹 무시하고 다음 문장을 실행한다.
반복 돌리는 도중 특정 문자를 무시하고 싶을 때 주로 사용한다. (i=3은 무시하고 나머지는 돌림)

Dead code / Unreachable code

  • Dead code : 조건문 true 면 그 아래 else의 코드 블록 내용은 실행되지 않아 이건 절대로 실행 되지 않는다는 경고 ( 노란색줄 )

  • Unreachable code : 무한루프 아래 코드들은 더이상 당도할 수 없다는 뜻 ( 빨간줄로 에러가 뜸 )
      해결 방법 1 : unreachable code가 된 코드를 지워버린다.
      해결 방법 2 : 특정한 상황에 정지할 수 있는 구문을 추가해 준다.
                        (ex) if ( i >= 100 ) { break ; }


배열

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것이다.
배열은 특정 지점을 기준으로 일렬로 배치 되어야 하므로 공간이 확보 되어야 한다. ( 저장 공간이 연속적으로 붙어 있다 )

그래서 배열 선언 시 크기 지정은 필수이다.

배열의 선언

  • 타입[] 변수명; : JAVA 스타일
    ( ex ) int[ ] score;
  • 타입 변수명[]; : C언어 스타일
    ( ex ) int score[ ];

배열의 생성

  • 타입[] 변수명 = new 타입 [길이]; : 선언과 생성 동시에 가능
    ( ex ) int[ ] score = new int[5];
  • 타입[ ] 변수명 = new int [ ] { 요소1, 요소2, ... }; : 선언 + 생성 + 초기화까지 OK
    ( ex ) int[ ] score = new int[ ] { 10, 20, 30, 40, 50 };
  • 타입[ ] 변수명 = { 요소1, 요소2, ... }; : new int[ ] 를 생략한 ver
    ( ex ) int[ ] score = { 10, 20, 30, 40, 50 };

int[ ] score;
score = { 10, 20, 30, 40, 50 };
로 2문장으로 만들면 Error 발생한다. 반드시 한문장으로 써줘야 한다.
두문장으로 만들고 싶으면,
score = new int[ ] { 10, 20, 30, 40, 50 }; 으로 써줘야 한다.

int[][] arr = { { 0, 1, 2, 3 }, { 11, 12, 13 }, };
String[][] royal = new String[4][4];

배열의 인덱스

JAVA 에서 배열에 값을 넣고 빼는 방법은 직접 인덱스를 지정하는 방법 밖에 없다. ( JS 처럼 push 등 사용 불가능 )
그래서 for 문을 이용하여 index 값을 넣는 방법도 있다.

int[] score = new int[5];

score[5] = 10;	// 에러 
				// score의 index 4 까지 밖에 없음

for ( int i = 0; i < score.length; i++ ) { 
	score[i] = (i+1)*10; 
}

배열의 크기를 벗어난 인덱스를 호출하면 에러가 뜬다.
( JS 에서는 null, undefined 값을 줬음 )
또, 배열의 공간만 만들고 값을 주지 않으면 기본적으로 null, 0 등으로 표시한다.

자료형기본값
booleanfalse
char'/u0000'
byte, short, int0
long0L
float0.0f
double0.0
참조형(String etc...)null

배열의 초기화

초기화 : 처음으로 값을 저장하는 것

*int 는 기본적으로 0 으로 자동초기화함

배열의 출력

int[] arr = {100, 95, 80, 70, 60};

System.out.println(arr);		// [I@14318bb 와 같은 문자열 출력됨

// 첫번째 방법
for ( int i = 0; i < score.length; i++ ) {
	System.out.println(arr[i]);
}

// 두번째 방법 : 배열 arr 을 "[100, 95, 80, 70, 60]" 문자열로 바꿔주는 메서드 
System.out.println(Arrays.toString(arr)); 

배열 출력 시

  • Arrays.toString(출력할 배열) : 1차원 배열에서 사용
  • Arrays.deepToString(출력할 배열) : 2차원 배열에서 사용

배열의 비교 / 복사 / 정렬

배열의 비교

  • Arrays.equals(배열1,배열2) : 1차원 배열에서 사용
  • Arrays.deepEquals(배열1,배열2) : 2차원 배열에서 사용

배열의 복사

  • Arrays.copyOf(복사할 배열, 복사할 요소 개수)
int[] arr = {0,1,2,3,4}
int[] copy = Arrays.copyOf(arr, 3);	// copy 배열에 {0,1,2} 복사
int[] copy2 = Arrays.copyOf(arr, 7);// copy2 배열에 {0,1,2,3,4,0,0} 복사
  • Arrays.copyOfRange(복사할 배열, 어디서부터, 어디까지)

이 때 어디까지에 들어가는 index 수는 포함되지 않는다.

( from <= x < to )

int[] copy3 = Arrays.copyOfRange(arr, 2, 4);// copy3 배열에 {2,3} 복사
int[] copy3 = Arrays.copyOfRange(arr, 0, 7);
// copy3 배열에 {0,1,2,3,4,5,0,0} 복사

배열의 정렬

Arrays.sort(정렬할 배열) : 오름차순으로 정렬

String 배열

String[] name = new String[3];

이 때 배열의 공간에는 기본적으로 null 이 들어가있다.

참조형은 메모리 주소를 저장한다.

2차원 배열

2차원 배열의 선언

String[ ][ ] royal = new String[4][4];

2차원 배열의 초기화

선언과 동시에 값 생성 가능.

int[ ][ ] arr = { { 0, 1, 2, 3 }, { 11, 12, 13 }, };

2차원 배열 활용 : for 중첩 사용

String[][] apart = new String[4][4];
apart[0][0] = "1층 1호";

for (int i = 0; i < apart.length; i++) {
	for (int j = 0; j < apart.length; j++) {
		apart[i][j] = (i + 1) + "층 " + (j + 1) + "호";
	}
}

0개의 댓글