데이터 엔지니어링 과정/java

[18일차] 조건문 & 반복문 & 참조 타입과 참조 변수 & 배열

오리는짹짹 2023. 1. 16. 19:21
목차
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이 발생

5. String 타입

  • 문자열을 저장하는 String 변수
    • 문자열을 String 변수에 저장한다는 말은 엄밀히 말하면 틀린 표현!
      ➡문자열이 직접 변수에 저장되는 것이 아니라,
         문자열은 String 객체로 생성되고, 변수는 String 객체를 참조하기 때문
    • 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있음
      🐰 문자열 리터럴이란 "산토끼", "java"와 같은 것들을 일컫는다!
  • 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