04 조건문과 반복문
04-1 조건문: if문, switch 문
if문
if(조건식){
실행문A
}
실행문B
- 조건식이 true → 실행문 A 실행 → 실행문 B 실행
- 조건식이 false → 실행문 B 실행
- 실행문 A에 들어갈 실행문이 하나밖에 없으면 생략, but 가독성이나 해석의 용이성을을 위해 생략 X
if-else 문
if(조건식){
실행문A
}else{
실행문B
}
실행문C
- 조건식 true → 실행문 A 실행 → 실행문 C실행
- 조건식 false → 실행문 B실행 → 실행문 C실행
if-else if-else 문
if(조건식1){
실행문A
}else if(조건식2){
실행문B
}else{
실행문C
}
실행문D
- 조건식 1 true → 실행문 A 실행 → 실행문 D실행
- 조건식 1 false → 조건식 2 이동
- 조건식 2 true → 실행문 B실행 → 실행문 D실행
- 조건식 2 false → 실행문 c실행 → 실행문 D실행
switch 문
switch(변수){
case 값1 :
실행문A
break;
case 값2 :
실행문B
break;
.
.
.
default :
실행문C
}
- 변수의 값이 해당하는 case로 이동하여 해당 실행문을 실행
- 변수의 값이 case의 값에 해당하지 않을때 default의 실행문을 실행(defaut는 생략가능)
- 실행문 마지막에 break를 작성하지 않으면 다음 case의 값에 상관없이 실행문이 실행된다.
04-2 반복문: for문, while문, do-wile문
for문
for(초기화식;조건식;증감식){
실행문
}
- 초기화식 실행 → 조건식이 true이면 for문 내부 실행문 실행 → 증감식 실행 → 조건식평가 → 조 건식 true 이면 실행문실행 → 조 건문 false 일때까지 반복
- 조건식 false 일 경우 실행 문을 실행하지 않고 for문 종료
*주의할점
초기화식에서 선언된 변수는 로컬변수. For문 안에 서만 사용.
초기화식에서 루프카운터변수는 float을 사용하지 않는다.
중첩 for문
- For 문안에 for 문이 있는 것.
- 바깥쪽 for 문을 실행하다가 안쪽 for 문을만나면 안쪽 for 문을 돌고 다시 바깥쪽 for 문 으로 돌아간다
while 문
while(조건식){
실행문
}
- 조건식이 t rue인 경우 계속 반복
- 조건식이 false가 되면 반복을 멈추고 while문 종료
- 조건식 평가 → true → 실행문실행 → 조건문 평가 → true → 실행문 실행→…→ 조건문평가
→ false → while 문 종료
do-while문
do{
실행문
}while(조건식);
- 실행문 우선 실행
- 조건식 평가 → true → 실행문실행 → 조건식평가 →....→ 조건식 false → do while문 종료
break문
- break문은 조건문, 반복문의 실행을 중지시킬 때 사용
- 중첩문일때 바깥쪽 조건문이나 반복문 앞에 Label : 을 붙이고 break Label;이라고 작성하면 바깥쪽 중첩문까지 중지
continue문
- 반복문 내부에서 continue를 만나면 for문의 증감식, while do-while문에서는 조건식으로 이동 후 계속 진행
05 참조 타입
05-1 참조 타입과 참조 변수
- 타입 : 기본 타입 - 정수, 실수, 문자, 논리 리터럴
참조 타입 - 배열, 열거, 클래스, 인터페이스
기본타입과 참조 타입
- 차이점 : 저장되는 값이 다름
- 기본타입은 실제 값을 변수 안에 저장하지만 참조 타입은 메모리의 번지를 변수에 저장
- 참조 타입에서 실제 값은 메모리에 저장되어 있고 변수에는 메모리의 번지를 저장하여 참조한다는 의미
메모리 사용 영역
메소드 영역
- JVM이 시작될때 생성되고 모든 스레드가 공유하는 영역
- 클래스 로더로 읽어 정적필드, 상수, 메소드 코드, 생성자 등을 분류해 저장
힙 영역
- 객체와 배열이 생성되는 영역
- JVM 스택 영역의 변수나 다른 객체의 필드에서 참조
- 여기에 참조하는 변수나 객체가 없으면 JVM이 이를 쓰레기 취급하고 자동으로 제거(별도의 제거 코드 필요x)
JVM 스택 영역
- 메소드를 호출할 때마다 프레임 추가, 메소드 종료되면 프레임 제거
- 생성된 변수는 초기화 될 때 스택에 추가
- 로컬변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 제거됨
참조 변수의 ==, != 연산
- 기본 타입 변수의 ==, != 연산은 값이 같은지 아닌지를 조사
- 참조 타입 변수의 ==, != 연산은 동일한 객체를 참조했는지 아닌지 조사
null과 NullPointerException
- null : 힙 영역의 객체를 참조하지 않는다는 의미, null을 초기값으로 사용 가능
- 예외 : 프로그램 실행 도중 발생하는 오류
- 참조 변수가 null을 가질 경우 참조 객체가 없으므로 데이터나 메소드를 사용할 수 없어 NullPointException이 발생
String 타입
- 큰 따옴표로 감싼 문자열 리터럴 객체를 참조한다
- 동일한 문자열 리터럴을 참조할 경우 동일한 객체를 참조한다
- new 연산자 : 객체 생성 연산자, 힙 영역에 새로운 객체를 만들 때 사용하는 연산자
- new 연산자로 객체를 생성하면 동일한 문자열이라도 다른 객체가 된다(==연산 결과 false)
String name1 = "신용권";
String name2 = "신용권";
String name3 = new String("신용권")
- name1 == name2 의 결과는 true
- name1 == name3 또는 name2 == name3 의 결과는 false
- 문자열이 같은지만 비교하려면 .equals() 사용
05-2 배열
배열이란?
※ 배열의 특징
- 배열은 같은 타입의 데이터만 저장 할 수 있다
- 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다
배열 선언
int[] intArray;
타입[ ] 변수;
int intArray[];
타입 변수[ ];
배열 생성
값 목록으로 배열 생성
- 타입[ ] 변수 = {값0, 값1, 값2, 값3, …};
- 이미 생성된 배열의 값을 바꾸고 싶을때는 대입연산자를 이용
String[] names = {"신용권", "홍길동", "감자바"};
names[1]="홍삼원";
← 이렇게 하면 배열의 값을 바꿀 수 있음
names = {"신용권", "홍삼원", "감자바"}; ←바꾼 이후의 배열
new 연산자로 배열 생성
- 타입[] 변수 = new 타입[길이];
- 타입[] 변수 = null;
변수 = new 타입[길이];
배열 길이
- 배열 변수.length;
int [] intArray = {10, 20, 30};
int num = intArra.length;
- 위와 같이 사용 가능, for문에서 배열 전체를 돌때 우용하게 사용 가능
- for문에서 인덱스를 초과해서 사용하면 ArrayIndexOutOfBoundsException 발생
명령 라인 입력
- 메인 메소드에서 String[] args는 실행인자 전달용
다차원 배열
- n * m 의 행렬 형태
int[][] intArray = new int[2][3];
(0,0) |
(0,1) |
(0,2) |
(1,0) |
(1,1) |
(1,2) |
intArray.length
← 2 intArray의 길이
intArray[0].length
←3 intArray[0]의 길이
intArray[1].length
←3 intArray[1]의 길이
객체를 참조하는 배열
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");
- strArray[0] == strArray[1] →true
- strArray[0] == strArray[2] →false
- strArray[0].equals(strArray[2]) →true
배열 복사
- 배열을 복사하기 위해서는 for문 또는 System.arraycopy() 메소드 사용
- for문 사용
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
for(int i=0; i<oldIntArray.length; i++){
newIntArray[i] = oldIntArray[i];
}
- System.arraycopy(원본 배열, 원본배열의 시작 인덱스, 새 배열, 새 배열의 시작 인덱스, 복사할 개수) 메소드 사용
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
System.arraycopy(oldIntArray, 0, newIntArray, 0, oldIntArray.length);
향상된 for문
for(타입 변수 : 배열) {
실행문
}
- for문에서 가져올 첫번째 값 존재 여부 확인
- 값이 존재하면 변수에 값 저장
- 실행문 실행
- 값이 없을때 까지 반복 후 종료
05-3 열거 타입
public enum Week {
MONDAY, TUESDAY, WEDNSDAY, THURSDAY FRIDAY, SATURDAY, SUNDAY
}
Week today;
today = Week.FRIDAY;
- 이 예제에서 Week가 열거타입, Week 안에 있는 요일들이 열거 상수
열거 타입 선언
- 열거 타입 이름의 소스파일(java파일)이 있어야 함
- 첫글자는 대문자(관례)
public enum 열거타입 이름 {...};
열거 타입 변수
- 선언 방법
열거타입 변수;
열거타입 변수 = 열거타입.열거상수;
과제
- 기본과제

둘째주 느낀점 : 이번에는 한글이 깨져 나와서 고생을 많이 했다. 분명 이전에도 겪었던 일이었을텐데 매번 같은 문제로 해메고 있다. 언제쯤 능숙하게 문제가 슉슉 해결하게 될까? 아직은 조금만 찾아보면 금방 해결할 문제라 괜찮지만 점점 더 어려운 문제가 생길텐데 그땐 어떻게 해결할지 벌써부터 걱정이다
아직은 도움 줄 사람들도 많고 금방 해결할 문제들이니 차분히 생각하면서 하나씩 해결해보자
|