[18일차] 조건문 & 반복문 & 참조 타입과 참조 변수 & 배열
목차
1. 조건문: if문, switch문
2. 반복문: for문, while문, do-while문
3. 참조 타입과 참조 변수
4. 배열
1. 조건문: if문, switch문
0. if문과 switch문의 차이
- if문 : 조건식의 결과가 true, false이냐에 따라 실행
- else문 : 변수의 값에 따라 실행
1. if문
- 조건문이 true이면 블록을 실행하고, false면 블록을 실행하지 않음
- 만약 조건식이 true가 될 때 실행해야 할 문장이 하나밖에 없다면 중괄호 블록{}을 생략 가능
- 중괄호를 작성하지 않을 경우,
코드의 가독성이 좋지 않아 코드를 해석하는 것이 어려워지고,
버그 발생의 원인이 될 수 있기 때문에 생략하지 않고 작성하는 걸 추천
package sec01.exam01;
public class IfExample {
public static void main(String[] args) {
int score = 93;
if (score>=90) {
System.out.println("점수가 90보다 큽니다.");
System.out.println("등급은 A입니다.");
}
if (score < 90) {
System.out.println("점수가 90보다 작습니다.");
System.out.println("등급은 B 입니다.");
}
}
}
>>> 점수가 90보다 큽니다.
>>> 등급은 A입니다.
2. if-else문
- if문의 조건식이 true이면 if문의 블록이 실행되고, 조건식이 false이면 else 블록이 실행
package sec01.exam02;
public class IfElseExample {
public static void main(String[] args) {
int score = 85;
if (score>=90) {
System.out.println("점수가 90보다 큽니다.");
System.out.println("등급은 A 입니다.");
} else { //score이 90보다 작은 경우
System.out.println("점수가 90보다 작습니다.");
System.out.println("등급은 B 입니다.");
}
}
}
>>> 점수가 90보다 작습니다.
>>> 등급은 B 입니다.
🐰 앞의 if문 예시와 같은 내용을 다루었는데, else문을 통해 코드를 더욱 간결하게 작성할 수 있는 걸 확인할 수 있다.
3. if-else-if-else문
- 처음 if문의 조건식이 false일 경우 다른 조건식의 결과에 따라 실행 블록을 선택 가능
package sec01.exam03;
public class IfElseIfElseExample {
public static void main(String[] args) {
int score = 75;
if (score>=90) {
System.out.println("점수가 90~100입니다.");
System.out.println("등급은 A입니다.");
} else if (score>=80) {
System.out.println("점수가 80~89입니다.");
System.out.println("등급은 B입니다.");
} else if (score >=70) {
System.out.println("점수가 70~79입니다.");
System.out.println("등급은 C입니다.");
} else {
System.out.println("점수가 70 미만입니다.");
System.out.println("등급은 D입니다.");
}
}
}
>>> 점수가 70~79입니다.
>>> 등급은 C입니다.
- math.ranodm() 메소드를 활용하여 주사위 번호 뽑는 코딩
package sec01.exam04;
public class IfDiceExample {
public static void main(String[] args) {
int num = (int) (Math.random()*6) + 1;
if (num==1) {
System.out.println("1번이 나왔습니다.");
} else if (num==2) {
System.out.println("2번이 나왔습니다.");
} else if (num==3) {
System.out.println("3번이 나왔습니다.");
} else if (num==4) {
System.out.println("4번이 나왔습니다.");
} else if (num==5) {
System.out.println("5번이 나왔습니다.");
} else {
System.out.println("6번이 나왔습니다.");
}
}
}
4. switch문
- 변수의 값에 따라 실행문이 결정
- 설정한 case에 해당하지 않으면 defalut 코드 실행
(1) 주사위 숫자 뽑기
package sec01.exam05;
public class SwitchExample {
public static void main(String[] args) {
int num = (int) (Math.random() * 6) + 1;
switch(num) {
case 1:
System.out.println("1번이 나왔습니다.");
break;
case 2:
System.out.println("2번이 나왔습니다.");
break;
case 3:
System.out.println("3번이 나왔습니다.");
break;
case 4:
System.out.println("4번이 나왔습니다.");
break;
case 5:
System.out.println("5번이 나왔습니다.");
break;
default:
System.out.println("6번이 나왔습니다.");
}
}
}
📌 case 끝에 break가 붙어 있는 이유 :
다음 case를 실행하지 않고 switch문을 빠져나가기 위해서이다.
break가 없다면 다음 case가 연달아 실행되면서, case값과 상관없는 결과도 함께 출력된다.
(2) break문이 없는 case
package sec01.exam06;
public class SwitchNoBreakCaseExample {
public static void main(String[] args) {
int time = (int) (Math.random()*4)+8; // +가 몇부터 시작인지
System.out.println("[현재시간: "+ time + "시]");
switch (time) {
case 8:
System.out.println("출근합니다.");
case 9:
System.out.println("회의를 합니다.");
case 10:
System.out.println("업무를 봅니다.");
default:
System.out.println("외근을 나갑니다.");
}
}
}
(3) char 타입의 switch 타입
package sec01.exam07;
public class SwitchCharExample {
public static void main(String[] args) {
char grade = 'B';
switch (grade) {
case 'A':
case 'a':
System.out.println("우수 회원입니다.");
break;
case 'B':
case 'b':
System.out.println("일반 회원입니다.");
break;
default:
System.out.println("손님입니다.");
}
}
}
>>> 일반 회원입니다.
(4) String 타입의 switch문
package sec01.exam08;
public class SwitchStringExample {
public static void main(String[] args) {
String position = "과장";
switch (position) {
case "부장":
System.out.println("700만원");
break;
case "과장":
System.out.println("500만원");
break;
default:
System.out.println("300만원");
}
}
}
>>> 500만원
2. 반복문: for문, while문, do-while문
0. for문, while문, do-while문의 차이
- for문 : 반복 횟수를 알고 있을 때 주로 사용
- while문 : 조건에 따라 반복할 때 주로 사용
- do-while문 : 조건을 나중에 검사
1. for문
(1) 형식
for (초기화식; 조건식; 증감식) {
조건식이 true일경우 실행문;
}
🔎 초기화식이 실행된 후, 조건식이 true라면 실행문이 실행된 후 증감식을 실행한다.
증감식이 실행된 상태에서 조건식을 다시 평가하고, 실행문 실행 여부를 판단하는 과정을 계속해서 반복한다.
(2) 특징
주어진 횟수만큼 실행문을 반복한다.
- 💻 1부터 10까지 출력
package sec02.exam01;
public class ForPrintFrom1To10Example {
public static void main(String[] args) {
for (int i=1; i<=10; i++) {
System.out.println(i);
}
}
}
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5
>>> 6
>>> 7
>>> 8
>>> 9
>>> 10
- 💻 1부터 100까지 출력
package sec02.exam02;
public class ForSumFrom1To100Example1 {
public static void main(String[] args) {
int sum = 0;
for (int i=1; i<=100; i++) {
sum+=i;
}
System.out.println("1~100 합 : " + sum);
}
}
>>> 1~100 합 : 5050
- 💻 1부터 100까지 합을 출력
package sec02.exam03;
public class ForSumFrom1To100Example2 {
public static void main(String[] args) {
int sum = 0;
int i=1;
for (i=1; i<=100; i++) {
sum+=i;
}
System.out.println("1~"+(i-1)+" 합 : " + sum);
}
}
>>> 1~100 합 : 5050
- 💻 float 타입 카운터 변수
package sec02.exam04;
public class ForFloatCounterExample {
public static void main(String[] args) {
for(float x=0.1f; x<=1.f; x+=0.1f) {
System.out.println(x);
}
}
}
>>> 0.1
>>> 0.2
>>> 0.3
>>> 0.4
>>> 0.5
>>> 0.6
>>> 0.70000005
>>> 0.8000001
>>> 0.9000001
(3) 중첩 for문
- 💻 구구단 출력하기
package sec02.exam05;
public class ForMultiplicationTableExample {
public static void main(String[] args) {
for (int m=2; m<=9; m++) {
System.out.println("*** " + m + "단 ***");
for (int n=1; n<10; n++) {
System.out.println(m + " * " + n + " = " + m*n);
}
}
}
}
2. while문
(1) 특징
조건식이 true일 경우에 계속해서 반복한다.
- 💻 1부터 10까지 출력
package sec02.exam06;
public class WhilePrintFrom1To10Example {
public static void main(String[] args) {
int i = 1;
while (i<=10) {
System.out.println(i);
i++;
}
}
}
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5
>>> 6
>>> 7
>>> 8
>>> 9
>>> 10
- 💻 1부터 100까지 합을 출력
package sec02.exam07;
public class WhileSumFrom1To100Example {
public static void main(String[] args) {
int sum = 0;
int i = 1;
while (i<=100) {
sum += i;
i++;
}
System.out.println("1~" + (i-1) + " 합 : " + sum);
}
}
>>> 1~100 합 : 5050
3. do-while문
블록 내부의 실행문을 우선 실행하고 실행 결과에 따라서 반복 실행을 계속할지 결정한다.
작성 시 반드시 while()뒤에 세미콜론을 붙여야 한다.
4. break문
(1) 특징
반복문은 for문, while문, do-while문, switch문을 실행 중지할 때 사용한다.
- 💻 break로 while문 종료
package sec02.exam08;
public class BreakExample {
public static void main(String[] args) {
while (true) {
int num = (int) (Math.random()*6) + 1;
System.out.println(num);
if (num == 6) {
break;
}
}
System.out.println("프로그램 종료");
}
}
(2) 중첩된 반복문에서 바깥쪽 반복문까지 종료시키기
➡ 바깥쪽 반복문에 이름(라벨) 붙이고, 'break 이름;'을 사용
- 💻 바깥쪽 반복문 종료
package sec02.exam09;
public class BreakOutterExample {
public static void main(String[] args) {
Outter: for (char upper='A'; upper<='Z'; upper++) {
for (char lower = 'a'; lower<='z'; lower++) {
System.out.println(upper + "-" + lower);
if (lower=='g') {
break Outter;
}
}
}
System.out.println("프로그램 실행 종료");
}
}
>>> A-a
>>> A-b
>>> A-c
>>> A-d
>>> A-e
>>> A-f
>>> A-g
>>> 프로그램 실행 종료
5. continue문
블록 내부에서 continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동한다.
- 💻 continue를 사용한 for문
package sec02.exam10;
public class ContinueExample {
public static void main(String[] args) {
for (int i=1; i<=10; i++) {
if (i%2 != 0) {
continue;
}
System.out.println(i); // 홀수 실행 안 됨
}
}
}
>>> 2
>>> 4
>>> 6
>>> 8
>>> 10
3. 참조 타입과 참조 변수
1. 기본 타입과 참조 타입
- 기본 타입 (byte, char, short, int, long, float, double, boolean)
: 실제 값을 변수 안에 저장 - 참조 타입 (배열, 열거, 클래스, 인터페이스)
: 메모리의 번지를 변수 안에 저장
➡ 번지를 통해 객체를 참조한다.
2. 메모리 사용 영역
- 메소드 영역 : 모든 스레드가 공유하는 영역
- 힙 영역 : 객체와 배열이 생성되는 영역
👀 여기서 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조 - JVM 스택 영역 : 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작 수행
3. 참조 변수의 ==, != 연산
- 동일한 번지 값을 갖고 있다면 동일한 객체를 참조
4. null과 NullPointerException
- null
- 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음
- null값도 초기값으로 사용할 수 있기 때문에, null로 초기화된 참조 변수는 스택 영역에 생성
- Exception 예외
: 프로그램 실행 도중 발생하는 오류- NullPointerException
- 참조 타입 변수를 잘못 사용하면 발생
- 참조 변수가 null을 가지고 있는 경우, 참조 객체가 없으므로 변수를 통해 객체를 사용 불가
- 만약 null 상태에서 있지도 않은 객체의 데이터나 메소드를 사용하는 코드를 실행하면 NullPointer이 발생
- NullPointerException
5. String 타입
- 문자열을 저장하는 String 변수
- 문자열을 String 변수에 저장한다는 말은 엄밀히 말하면 틀린 표현!
➡문자열이 직접 변수에 저장되는 것이 아니라,
문자열은 String 객체로 생성되고, 변수는 String 객체를 참조하기 때문 - 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있음
🐰 문자열 리터럴이란 "산토끼", "java"와 같은 것들을 일컫는다!
- 문자열을 String 변수에 저장한다는 말은 엄밀히 말하면 틀린 표현!
- new 연산자
- new 연산자를 활용하여 직접 String 객체를 생성시킬 수 있다.
- equals() 메소드
- 동일한 String 객체이건 다른 String 객체이건 상관없이 내부 문자열을 비교하고 싶을 때 사용하는 String 객체의 메소드
- 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한지 비교한 후 true 혹은 false로 리턴
- 💻 문자열 비교
package sec01.exam01;
public class StringEqualsExample {
public static void main(String[] args) {
String strVar1 = "신민철";
String strVar2 = "신민철";
if (strVar1 == strVar2) {
System.out.println("strVar1과 Strvar2는 참조가 같음");
} else {
System.out.println("strVar1과 Strvar2는 참조가 다름");
}
if (strVar1.equals(strVar2)) {
System.out.println("strVar1과 Strvar2는 문자열이 같음");
}
String strVar3 = new String("신민철");
String strVar4 = new String("신민철");
if (strVar3 == strVar4) {
System.out.println("strVar3과 Strvar4는 참조가 같음");
} else {
System.out.println("strVar3과 Strvar4는 참조가 다름");
}
if (strVar3.equals(strVar4)) {
System.out.println("strVar3과 Strvar4는 문자열이 같음");
}
}
}
>>> strVar1과 Strvar2는 참조가 같음
>>> strVar1과 Strvar2는 문자열이 같음
>>> strVar3과 Strvar4는 참조가 다름
>>> strVar3과 Strvar4는 문자열이 같음
4. 배열
1. 배열이란?
- 정의: 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조
- 특징
- 같은 타입의 데이터만 저장
- 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없음
2. 배열 선언
- 대괄호 [] 는 배열 변수를 선언하는 기호로 사용되어서, 타입 뒤에 붙을 수도 있고, 변수 뒤에 붙을 수도 있음
👀 타입은 배열에 저장된 데이터의 타입을 의미 - 선언 형식 1 타입[] 변수;
int[] intArray;
double[] doubleArray;
String[] strArray;
- 선언 형식 2 타입 변수 [];
int intArray[];
double doubleArray[];
String strArray[];
👀 참조할 배열 객체가 없다면 배열 변수는 null 값으로 초기화 할 수 있다.
3. 배열 생성
- 값 목록으로 배열 생성
package sec02.exam01;
public class ArrayCreateByValueListExample1 {
public static void main(String[] args) {
int[] scores = {83, 90, 87};
System.out.println("score[0] : " + scores[0]);
System.out.println("score[1] : " + scores[1]);
System.out.println("score[2] : " + scores[2]);
int sum = 0;
for (int i=0; i<3; i++) {
sum += scores[i];
}
System.out.println("총합 : " + sum);
double avg = (double) sum/3;
System.out.println("평균 : " + avg);
}
}
>>> score[0] : 83
>>> score[1] : 90
>>> score[2] : 87
>>> 총합 : 260
>>> 평균 : 86.66666666666667
👀 배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이라면, new 연산자를 사용해서 값 목록을 지정해주면 된다.
package sec02.exam02;
public class ArrayCreateByValueListExample2 {
public static void main(String[] args) {
int[] scores;
scores = new int[] {83, 90, 87 };
int sum1 = 0;
for (int i=0; i<3; i++) {
sum1 += scores[i];
}
System.out.println("총합 : " + sum1);
int sum2 = add(new int[] {83, 90, 87});
System.out.println("총합 : "+sum2);
System.out.println();
}
public static int add(int[] scores) {
int sum = 0;
for (int i=0; i<3; i++) {
sum += scores[i];
}
return sum;
}
}
>>> 총합 : 260
>>> 총합 : 260
- new 연산자로 배열 생성
- 값의 목록을 가지고 있지 않지만,
향후 값들을 저장할 배열을 미리 만들고 싶다면 new 연산자로 배열 객체 생성 가능 - 타입[] 변수 = new 타입[길이];
- 자동적으로 기본값으로 초기화
- 값의 목록을 가지고 있지 않지만,
package sec02.exam03;
public class ArrayCreateByNewExample {
public static void main(String[] args) {
int[] arr1 = new int[3];
for (int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] :" + arr1[i]);
}
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
for (int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] : " + arr1[i]);
}
double[] arr2 = new double[3];
for (int i=0; i<3; i++) {
System.out.println("arr2[" + i + "] : " + arr2[i]);
}
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
for (int i=0; i<3; i++) {
System.out.println("arr2[" + i + "] : "+ arr2[i]);
}
String[] arr3 = new String[3];
for (int i=0; i<3; i++) {
System.out.println("arr3[" + i + "] : " + arr3[i]);
}
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
for (int i=0; i<3; i++) {
System.out.println("arr3[" + i + "] : "+ arr3[i]);
}
}
}
>>> arr1[0] :0
>>> arr1[1] :0
>>> arr1[2] :0
>>> arr1[0] : 10
>>> arr1[1] : 20
>>> arr1[2] : 30
>>> arr2[0] : 0.0
>>> arr2[1] : 0.0
>>> arr2[2] : 0.0
>>> arr2[0] : 0.1
>>> arr2[1] : 0.2
>>> arr2[2] : 0.3
>>> arr3[0] : null
>>> arr3[1] : null
>>> arr3[2] : null
>>> arr3[0] : 1월
>>> arr3[1] : 2월
>>> arr3[2] : 3월
4. 배열 길이
- 배열에 저장할 수 있는 전체 항목의 개수
- 코드로부터 배열의 길이를 얻으려면, 배열 객체의 length 필드(객체 내부의 데이터)를 읽음
package sec02.exam04;
public class ArrayLengthExample {
public static void main(String[] args) {
int[] scores = {83, 90, 87};
int sum = 0;
for (int i=0; i<scores.length; i++) {
sum += scores[i];
}
System.out.println("총합 : "+ sum);
double avg = (double) sum / scores.length;
System.out.println("평균 : "+ avg);
}
}
>>> 총합 : 260
>>> 평균 : 86.66666666666667