[Java] 자바 프로그래밍 - 05 literal,연산자 보충, 제어 흐름(조건문,반복문)

Dev_Honey·2022년 12월 6일
0

JAVA

목록 보기
5/8
post-thumbnail

1. 리터럴(literal)

리터럴 : 프로그램에서 사용하는 모든 숫자, 값, 논리 값
예)10,3.14,'A',true
리터럴에 해당되는 값은 특정 메모리 공간인 상수 풀(constant pool)에 있음
필요한 경우 상수 풀에서 가져와서 사용
상수 풀에 저장 할 때 정수는 int로 실수는 double로 저장
따라서 long 이나 float 값으로 저장해야 하는 경우 식별자 (L,I,F,f)를 명시

형 변환(Type conversion)
자료형은 각각 사용하는 메모리 크기와 방식이 다름
서로 다른 자료형의 값이 대입되는 경우 형 변환이 일어남

  • 묵시적 형변환 : 작은 수에서 큰 수로, 덜 정밀한 수에서 더 정밀한 수로 대입되는 경우
    ex) long num = 3; Int 값에서 long으로 자동 형 변환 >> L,l을 명시하지 않아도 됨
  • 명시적 형변환 : 묵시정 형 변환의 반대의 경우, 변환되는 자료 형을 명시해야 함. 자료의 손실 방지를 위해서
    ex) double dNum = 3.14;
    int num = (int)dNum; //자료형 명시!

묵시적 형 변환(ImplicitConversion)

package variable_lecture;
public class ImplicitConversion {
	public static void main(String[] args) {
		// 묵시적 형 변환
		byte bNum = 10;
		int num = bNum;
		System.out.println(num);
		// 10출력
		long lNum = 10;
		float fNum = lNum;
		System.out.println(fNum);
		// 10.0출력
		double dNum = fNum + num;
		// num이 float로 먼저 형 변환이 일어나고, 계산된 후 double로 형 변환돼어서 최종 type은 double
		System.out.println(dNum);
		// 즉, 적은 수 -> 큰 수, 덜 정밀 -> 더 정밀한 수 로 형 병환은 묵시적으로 일어날 수 있다.
	}
}

명시적 형 변환(ExplicitConversion)

package variable_lecture;
public class ExplicitConversion {
	public static void main(String[] args) {
		// 명시적 형 변환
		int iNum = 1000;
//		byte bNum = iNum; >> 오류난다.
		byte bNum = (byte) iNum;
//		System.out.println(iNum);
//		System.out.println(bNum);
		// 1000이 byte형에 들어가니깐 bNum을 출력해보면 , 1000이 아니고 -24가 출력이 된다.byte(-128~127까지)
		// 기존 int 였던 1000의 4바이트 중 1바이트만 가져와서 변수에 넣기 때문에 저렇게 출력(데이터 유실)
		double dNum = 3.14;
		iNum = (int) dNum;
//		System.out.println(iNum);
		// 3이 출력이되는데 double type이 명시적으로 int로 바꾸게 되면 소숫점 이하가 없어짐
		// 이렇게 날리고 싶을 때는 사용하면 된다.
		float fNum = 0.9F;
		int num1 = (int) dNum + (int) fNum;
		int num2 = (int) (dNum + fNum);
		System.out.println(num1);
		System.err.println(num2);
		// truncate된다고 하고 , 유실된다고도 한다.
	}
}

2. 연산자

  • 항(operand) : 연산에 사용되는 값
  • 연산자(operator) : 항을 이용하여 연산하는 기호

항의 개수에 따른 연산자 구분

연산자설명연산 예
단항 연산자항이 한 개인 연산자++num
이항 연산자항이 두 개인 연산자num1+num2;
삼항 연산자항이 세 개인 연산자(5>3)?1:0;

관계 연산자
이항 연산자
연산의 결과가 true(참) or false(거짓)으로 반환

연산자기능연산 예
>왼쪽 항이 크면 참을 아니면 거짓을 반환num>3;
<왼쪽 항이 작으면 참, 아니면 거짓을 반환num<3;
>=왼쪽 항이 오른쪽 항보다 크거나 같으면 참, 아니면 거짓num>=3;
<=왼쪽 항이 오른쪽 항보다 작거나 닽으면 참, 아니면 거짓num<=3;
==두 개의 항의 값이 같으면 참, 아니면 거짓num==3;
!=두 개의 항이 다르면 참, 아니면 거짓num!=3;

1. 대입 연산자

변수에 값을 대입 하는 연산자
연산의 결과를 변수에 대입
우선 순위가 가장 낮은 연산자
왼쪽 변수(lvalue)에 오른쪽 변수(값)(rvalue)를 대입
ex)
int age = 24; // age변수에 24를 대입
totalScore = mathScore + engScore
// mathScore 값과 영어 점수 engScore를 더하여 총점을 의미하는 totalScore 변수에 더한 값을 대입

2. 산술 연산자

사칙연산에 사용되는 연산자

연산자기능연산 예
+두 항을 더합니다5+3
-앞에 있는 항에서 뒤에 있는 항을 뺍니다.5-3
*두 항을 곱합니다.5*3
/앞에 있는 항에서 뒤에 있는 항을 나누어 몫을 구합니다5/3
%앞에 있는 항에서 뒤에 있는 항을 나누어 나머지를 구합니다5%3

%는 나머지를 구하는 연산자
-> 숫자 n의 나머지는 0~n-1 범위의 수
-> 특정 범위 안의 수를 구할 때 존종 사용

3. 증가 감소 연산자

단항 연산자
1만큼 더하거나 1만큼 뺄 때 사용하는 연산자
하으이 앞/뒤 위치에 따라 연산의 결과가 달라짐에 유의

연산자기능연산 예
++항의 값에 1을 더합니다val = ++num;//먼저 num 값이 1증가한 후 val 변수에 대입
val = num++;//val 변수에 기존 num값을 먼더 대입한 후 num값 1 증가
--항의 값에서 1을 뺍니다val = --num;//먼저 num 값이 1감소한 후 val 변수에 대입
val = num--;//val 변수에 기존 num값을 먼더 대입한 후 num값 1 감소

4. 단락 회로 평가(short circuit evaluation)

논리 곱(&&)==AND 은 두 항이 모두 true일 때만 결과가 true
=>앞의 항이 false면 뒤 항의 결과를 평가하지 않아도 false
논리 합(||)==OR 은 두 항이 모두 false일 때만 결과가 false
=> 앞의 항이 true면 뒤 항의 결과를 평가하지 않아도 true

5. 조건 연산자

삼항 연산자
조건 식의 결과가 true(참) 인 경우와 false(거짓)인 경우에 따라 다른 식이나 결과가 수행됨
제어문 중 조건문을 간단히 표현할 때 사용할 수 있음

연산자기능연산예
조건식 ? 결과1:결과2 ;조건식이 참이면 결과1, 조건식이 거짓이면 결과2가 선택int num=(5>3)? 10:20;

3. 제어 흐름

1. 조건문

if문
if(조건식){ 수행문 }

if(age>=8){
	System.out.println("학교에 다닙니다.");
}

if-else문
if(조건식){ 수행문1;} else {수행문2;}

package assignment_lecture;
public class ifExample1 {
	public static void main(String[] args) {
		int age = 10;
		if (age >= 8) {
			System.out.println("학교에 다닙니다.");
		} else {
			System.out.println("학교에 다니지 않습니다.");
		}
		// 만약 수행문이 하나면 중괄호 쓸 필요가 없다.
		// 가독성을 위해서는 수행문이 1개라도 중괄호를 해주면 좋다.
	}
}

if-else if-else 문
하나의 경우에 조건이 여러 개에 해당하는 경우

if(조건 1){
	문장1;
}
else if(조건 2){
	문장2;
}
else if(조건 3){
	문장3;
}
else{
	문장4;
}

예제

package assignment_lecture;
public class ifExample2 {
	public static void main(String[] args) {
		int age = 20;
		int charge;
		if (age < 8) {
			charge = 1000;
			System.out.println("미취학 아동입니다.");
		} else if (age < 14) {
			charge = 2000;
			System.out.println("초등학생입니다.");
		} else if (age < 20) {
			charge = 2500;
			System.out.println("중,고등학생입니다.");
		} else {
			charge = 3000;
			System.out.println("일반인 입니다.");
		}
		System.out.println("입장료는" + charge + "원 입니다.");
	}
}

결과

if-else 조건문은 조건 연산자로 구현 가능

if-else문

if(a>b)
	max = a;
else{
	max = b;
}

이거를 조건 연산자로 구현

max = (a>b) ? a:b;

switch-case 문
조건식의 결과가 정수 또는 문자열의 값이고 그 값에 따라 수행문이 결정될 때
if-else if-else문을 대신하여 switch-case문을 사용할 수 있다.

if(rank==1){
	medalColor = "G";
}
else if(rank == 2){
	medalColor = "S";
}
else if(rank == 3){
	medalColor = "B";
}
else {
	medalColor = "A";
}

이것을, switch- case구문으로

//중괄호는 한번만
package assignment_lecture;

public class SwitchCase {

	public static void main(String[] args) {
		//switch-case
		int rank = 1;
		char medalColor;
		switch (rank) {
		case 1:
			medalColor = 'G';
			break;
		case 2:
			medalColor = 'S';
			break;
		case 3:
			medalColor = 'B';
			break;
		default:
			medalColor = 'A';
		}
		;
		System.out.println(rank + "등 메달의 색은" + medalColor + "입니다.");
	}
}

2. 반복문

주어진 조건이 만족 할 때까지 수행문을 반복적으로 수행함
while, do-while, for 문이 있음
조건의 만족과 반복 가능 여부에 대해 정확한 코딩을 해야 함

while 문

while(조건식){
	수행문1;
} // 조건식이 참인 동안 반복 수행
수행문 2;
....

예)

package loop_lecture;
public class WhileExample {
	public static void main(String[] args) {
		int num = 1;
		int sum = 0;
		while (num <= 10) {
			sum += num;
			num++;
		}
		System.out.println("1부터 10까지의 합은" + sum + "입니다.");
	}
}

결과)

do-while 문

package loop_lecture;
public class WhileExample {
	public static void main(String[] args) {
		int num = 1;
		int sum = 0;
		do {
			sum += num;
			num++;
		} while (num <= 10);
		System.out.println("1부터 10까지의 합은" + sum + "입니다.");
	}
}

do-while문의 조건문은 아래 while에 적으면 된다.
do-while문은 언제 사용하냐면, 일반적인 while문은 조건문이 true가 아니면 안의 수행문이 수행되지않는데, do-while문은 먼저 한번의 수행문이 수행되고 while의 조건이 체크된다.
그래서 한 번의 수행이 일어나고 조건이 체크되는 로직에서 사용하면 된다.

for문
반복문 중 가장 많이 사용하는 반복문
주로 조건이 횟수인 경우에 사용
초기화식, 조건식, 증감식을 한꺼번에 작성

for(초기화식;조건식;증감식){
	수행문;
}
int num;
for(num = 1; num <= 5; num++){
	System.out.println(num);
}
  • 1 초기화는 한번만 수행
  • 조건식이 만족하면 수행문이 수행
  • 증감식이 수행
  • 조건식이 만족하는지 체크하고 만족하면 수행문 수행
  • 조건식이 만족하지 않으면 for 반복문 escape!

예제. 1~10 까지 더하는 for 반복문

package loop_lecture;
public class ForExample {
	public static void main(String[] args) {
		int num;
		int sum = 0;
		for (num = 1; num <= 10; num++) {
			sum += num;
		}
		System.out.println("1~10까지의 합은" + sum + "입니다.");
	}
}

결과

정리
각 반복문의 쓰임

  • while문
    • 하나의 조건에 대해 반복수행이 이루어질때 사용
    • 조건이 맞지 않으면 수행문이 수행되지 않음
    • 주로 조건식이 true,false로 나타남
  • do-while문
    • 하나의 조건에 대해 반복수행이 이루어질 때 사용
    • 단, 수행문이 반드시 한번 이상 수행됨
  • for문
    • 가장 많이 사용
    • 수의 특정 범위, 횟수와 관련한 반복수행에서 주로 사용
    • 조건문 안에 초기화,조건식,증감식이 다 들어가는게 특징!

무한 반복

while(true){
	수행문
}
do{
	수행문;
}while(true);
for(;;){
	수행문;
}

중첩된 반복문
반복문 내부에 또 반복문이 사용 됨
ex)구구단

//2단 ~ 9단
int dan;
int times;
for(dan = 2; dan <=9; dan++){
	for(times = 1; times <=9; times++){
	System.out.println(dan + "X" + times + "=" + dan*times);
    }
    System.out.println();//한 줄 띄워서 출력 === \n(개행)
}

결과

.....

continue문
반복문과 함께 쓰이며, 반복문 내부 continue문을 만나면, 이후 반복되는 부분을 수행하지 않고 조건식이나 증감식을 수행함 1부터 100까지 중 홀수만 더하는 예

package loop_lecture;
public class ContinueExample {
	public static void main(String[] args) {
		int total = 0;
		int num;
		for (num = 1; num <= 100; num++) { // 100까지 반복
			if (num % 2 == 0){ // num 값이 짝수인 경우
				continue; }// 이후 수행을 생략하고 num++ 수행
			total += num; // num 값이 홀수인 경우에만 수행
		}
		System.out.println("1부터 100까지의 홀수의 합은:" + total + "입니다.");
	}
}

결과

break문
반복문에서 break문을 만나면 더 이상 반복을 수행하지 않고 반복문을 빠져 나옴
중첩된 반복문 내부에 있는 경우 가장 가까운 반복문 하나만 빠져 나옴
아래의 경우 내부 반복문만 빠져 나옴

//이중 loop
while(조건식){			// 외부 반복문
	while(조건식2){		// 내부 반복문
    if(조건식)	// 조건에 해당하는 경우
    	break // 내부 반복문만 빠져나옴
    }
}
//합이 100보다 클 때, break걸어서 반복문 escape
package loop_lecture;
public class BreakExample {
	public static void main(String[] args) {
		int sum = 0;
		int num = 1;
		while (true) {
			sum += num;
			if (sum > 100) {
				break;
			}
			num++;
		}
		System.out.println(sum);
		System.out.println(num);
	}
}
  • 여타 다른 언어들과 제어와 관련된 syntax는 차이가 없는 것 같아서 사용하는 데 무리는 없다고 생각한다.

출처 및 참조

Inflearn Do it ! 자바 프로그래밍 입문 with 은종쌤 강의


profile
자습서 같은 공부 블로그 만들기!

0개의 댓글