조컴퓨터

200819 OOP 05 - Java Datatype Conversion, If, Switch, While 본문

자바 웹개발자 과정/JAVA

200819 OOP 05 - Java Datatype Conversion, If, Switch, While

챠오위 2020. 8. 27. 09:50

자료형 변환 Datatype Conversion

자료형 변환이란 데이터 자료형을 다른 데이터 자료형으로 변환하는 것을 말한다. 예를 들어, byte형을 int형으로 변환하거나 반대로 int형을 byte형으로 변환하는 행위를 말한다. 자료형 변환에는 두 가지 종류가 있다. 하나는 자동형 변환이고 다른 하나는 강제형 변환이다.

 

 

① 자동형 변환

자동형 변환(Promotion)은 프로그램 실행 도중에 자동적으로 형 변환이 일어나는 것을 말한다. 자동형 변환은 작은 크기를 가지는 자료형이 큰 크기를 가지는 자료형에 저장될 때 발생한다.

큰 크기의 자료형과 작은 크기의 자료형의 구분은 사용하는 메모리 크기이다. 크기별로 자료형을 정리하면 다음과 같다.

 

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

 

float은 4byte 크기인데 int(4)와 long(8)보다 더 큰 자료형으로 표시했다. 그 이유는 표현할 수 있는 값의 범위가 float이 더 크기 때문이다. 

 

byte a=3;
int b=a; 	//자료형에 맞는 형태를 넣어줘야 함.
long c=b; 	//->그러나 표현할 수 있는 범위 내에 있으므로, 자동으로 타입 변환이 이루어져 대입
//a=c; 오류	//int형 변수가 표현할 수 있는 범위를 벗어난 long형 데이터를 대입하므로, 오류가 발생
		
float d=1.2f;
double e=d; //자동형변환

 

 

② 강제형 변환 (cast 연산자)

큰 크기의 자료형은 작은 크기의 자료형으로 자동형 변환을 할 수 없다. 예를 들어, 4byte인 int형을 1byte인 byte형에 답을 수 없다. 이때 int형을 4개의 byte로 쪼갠 다음, 끝에 있는 1byte만 byte형 변수에 저장하는 것은 가능하다. 이와 같이 강제적으로 큰 데이터 자료형을 작은 데이터 자료형으로 쪼개어서 저장하는 것을 강제형 변환(cast 연산자)이라 한다. 강제형 변환은 cast 연산자 ()를 사용하는데, 괄호 안에 들어가는 자료형은 쪼개는 단위이다.

 

System.out.println((int)3.5);  		//3
System.out.println((double)4); 		//4.0
System.out.println((int)2.6+(int)5.7);	//7=2+5
System.out.println((int)(2.6+5.7));	//8=(int)8.3

 

정수값을 계산하면 정수형만 반환된다

 

System.out.println(5/3);		//1
System.out.println(5/3.0);		//1.6666666666666667
System.out.println(5.0/3);		//1.6666666666666667 
System.out.println(5/3.);		//1.6666666666666667
System.out.println(5/(double)3);	//1.6666666666666667
System.out.println((double)5/3);	//1.6666666666666667

 

 

int형과 char형의 형변환

int형은 char형으로 자동 변환되지 않기 때문에 강제형 변환을 사용해야 한다. int형에 저장된 값이 유니코드 범위라면 다음과 같이 (char) 캐스팅 연산자를 사용해서 char형으로 변환할 수 있다. char형으로 변환된 값을 출력하면 유니코드에 해당하는 문자가 출력된다.

 

 

ASCII코드값, ASCII문자

ko.wikipedia.org/wiki/ASCII

 

ASCII - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 1972 프린터 사용 설명서에 개시된 아스키 코드 차트표 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( , 아스키)는 영문

ko.wikipedia.org

 

 

System.out.println(65);
System.out.println((char)65); //'A'
System.out.println((char)66); //'B'
System.out.println((char)67); //'C'
		
System.out.println((char)97); //'a'
System.out.println((char)98); //'b'
System.out.println((char)99); //'c' //0 ~ 127
		
System.out.println((int)'A'); //'65'
System.out.println((int)'B'); //'66'
System.out.println((int)'C'); //'67'

System.out.println((int)'a'); //'97'
System.out.println((int)'b'); //'98'
System.out.println((int)'c'); //'99'

 

 

대문자가 소문자보다 크다 → true  /예시) 오름차순

 

System.out.println('A'<'a'); //true

 

 

그외의 ASCII코드값

 

System.out.println((int)'+'); //43
System.out.println((int)'-'); //45
System.out.println((int)'*'); //42
System.out.println((int)'/'); //47
		
System.out.println((int)' '); //32 공백문자
System.out.println((int)'\r');//13 엔터
		
System.out.println('a'-'A');  //32
System.out.println((int)('a'-'A'));	//32=97-65
System.out.println("#"+(char)('a'-'A')+"#"); //# # -> (char)32; //인트 생략 ' '공백

 

 

예제1) 임의의 문자가 소문자인지 확인하시오.

         소문자 'a' ~ 'z'

 

char ch='A';
String result=(ch>='a' && ch<='z') ? "맞다" : "아니다";
System.out.println(ch+"는 소문자가 " +result);

//A는 소문자가 아니다

 

 

예제2) 다음 코드를 분석하시오.

 

int a=3, b=5;
char op='+';
//출력결과 3+5=8
		
System.out.println(a+op+b+"="+(a+b)); //51=8
		// 3+'+'+5 +=+ 8
		// '+'; 43

System.out.println(a+""+op+""+b+"="+(a+b)); //3+5=8

 

 

 

 

제어문

제어문은 조건식과 중괄호 { } 블록으로 구성되는데, 조건식의 연산 결과에 따라 블록 내부의 실행 여부가 결정된다. 

 

제어문의 종류는 조건문과 반복문이 있다.

① 조건문 - if문, switch문

② 반복문 - for문, while문, do-while문

 

 

① 조건문 - if문

if문은 조건식의 결과에 따라 블록 실행 여부가 결정된다. 조건식에는 true 또는 false값을 산출할 수 있는 연산식이나, boolean 변수가 올 수 있다. 조건식이 true이면 블록을 실행하고 false이면 블록을 실행하지 않는다.

 

- if-else문

if문은 else 블록과 함께 사용되어 조건식의 결과에 따라 실행 블록을 선택한다. if문의 조건식이 true이면 if문의 블록이 실행되고, 조건식이 false이면 else 블록이 실행된다. 조건식의 결과에 따라 이 두 개의 블록 중 어느 한 블록의 내용만 실행되고 전체 if문을 벗어난다. 

 

- if-else if-else문

조건문이 여러 개인 if문도 있다. 처음 if문의 조건식이 false인 경우 다른 조건식의 결과에 따라 실행 블록을 선택할 ㅜㅅ 있는데, if 블록의 끝에 else if문을 붙이면 된다. else if문의 수는 제한이 없고 여러 개의 조건식 중 true가 되는 블록만 실행되고 전체 if문을 벗어난다. else if 블록의 마지막에는 else 블록을 추가할 수 있는데, 모든 조건식이 false일 경우 else 블록을 실행하고 if문을 벗어나게 된다. 

 

- 중첩 if문

if문의 블록 내부에 또 다른 if문을 사용할 수 있다. switch문, for문, while문, do-while문도 서로 중첩시킬 수 있다. 예를 들어 if문 안에 for문을 중첩시킬 수 있고, while문 안에 if문을 중첩시킬 수도 있다. 

 

 

예제1) 성적 프로그램

 

String name="코로나";
int kor=100, eng=100, mat=35;
int aver=(kor+eng+mat)/3;

System.out.println("이름:"+name);
System.out.println("국어:"+kor);
System.out.println("영어:"+eng);
System.out.println("수학:"+mat);
System.out.println("평균:"+aver);

 

예제1-1) 평균이 95점 이상이면 장학생이라 할 때 코로나는 장학생인가?

 

if (aver>=95) {
	System.out.println("장학생");
}//if end

 

예제1-2) 국어 점수가 70점 이상이면 "합격" 아니면 "불합격"

 

if (kor>=70) {
	System.out.println("국어:합격");
}else {
	System.out.println("국어:불합격");
}//if end

 

예제1-3) 수학점수가 90점 이상이면 수학 : A학점

                           80점 이상이면 수학 : B학점

                           70점 이상이면 수학 : C학점

                           60점 이상이면 수학 : D학점

                           아니면 수학 : F학점

 

if (mat>=90 ) {
	System.out.println("수학:A학점");
}else if (mat>=80) {
	System.out.println("수학:B학점");
}else if (mat>=70) {
	System.out.println("수학:c학점");
}else if (mat>=60) {
	System.out.println("수학:D학점");
}else {
	System.out.println("수학:F학점");
}//if end

//수학:F학점

 

예제1-4) 과락

            평균이 70점 이상이면 결과 : 합격

            (단, 국영수 세 과목 중에서 한 과목이라도 40점 미만이면 결과 : 재시험)

            평균이 70점 미만이면 결과 : 불합격

 

1) OR 조건

if (aver>=70) {
	if (kor<40 || eng<40 || mat<40) {
		System.out.println("결과:재시험");
	}else {
		System.out.println("결과:합격");
	}//if end
			
}else {
	System.out.println("결과:불합격");
}//if end

//결과:재시험

 

2) AND 조건

 

if (aver>=70) {
	if (kor>=40 && eng>=40 && mat>=40) {
		System.out.println("결과:합격");
	}else {
		System.out.println("결과:재시험");
	}//if end
			
}else {
	System.out.println("결과:불합격");
}//if end

//결과:재시험

 

 

 

 

① 조건문 - switch문

switch문은 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다.

 

switch문은 괄호 안의 값과 동일한 값을 갖는 case로 가서 실행문을 실행시킨다. 만약 괄호 안의 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행시킨다. default는 생략 가능하다.

 

switch(30) {
case 10: System.out.println("SEOUL"); break;
case 20: System.out.println("JEJU"); break;
case 30: System.out.println("BUSAN"); break;
}//switch end

//BUSAN

 

switch(50) {
case 10: System.out.println("SEOUL"); break;
case 20: System.out.println("JEJU"); break;
case 30: System.out.println("BUSAN"); break;
default: System.out.println("기타..");
}//switch end

//기타..

 

단, break문이 없으면 계속해서 switch문이 수행된다.

 

switch(20) {
case 10: System.out.println("SEOUL"); break;
case 20: System.out.println("JEJU");
case 30: System.out.println("BUSAN"); break;
}//switch end

/*
	JEJU
	BUSAN
*/

 

case 끝에 break가 붙어 있는 이유는 다음 case를 실행하지 말고 switch문을 빠져나가기 위해서이다. break가 없다면 다음 case가 연달아 실행되는데, 이떄에는 case값과는 상관없이 실행된다.

 

 

 

문제1) 평균 점수에 따라서 A, B, C, D, F학점을 출력하시오.

 

int kor=100, eng=100, mat=100;
int aver=(kor+eng+mat)/3;

 

내 답안

 

switch(aver/10) {
case 10: System.out.println("결과:A학점"); break;
case  9: System.out.println("결과:A학점"); break;
case  8: System.out.println("결과:B학점"); break;
case  7: System.out.println("결과:C학점"); break;
case  6: System.out.println("결과:D학점"); break;
default: System.out.println("결과:F학점");
}//switch end

 

선생님 답안

 

switch(aver/10) {
case 10: 
case  9: System.out.println("결과:A학점"); break;
case  8: System.out.println("결과:B학점"); break;
case  7: System.out.println("결과:C학점"); break;
case  6: System.out.println("결과:D학점"); break;
default: System.out.println("결과:F학점");
}//switch end

 

break문이 없으면 계속해서 switch문이 수행되므로 선생님 답안이 옳다.

 

 

 

문제2) 연산기호(op)에 따라 결과값을 출력하시오.

 

2-1) int a=5, b=3

int a=5, b=3;
char op='/';		//op='+' 또는 op='-' 또는 op='*' 또는 op='/' 또는 op='%'

/* 
	출력결과
	5+3=8
	5-3=2
	5*3=15
	5/3=1.6
	5%3=2 
*/

 

switch(op) {
case '+': System.out.println(a+""+op+""+b+"="+""+(a+b)); break;			//5+3=8
case '-': System.out.println(a+""+op+""+b+"="+""+(a-b)); break;			//5-3=2
case '*': System.out.println(a+""+op+""+b+"="+""+(a*b)); break;			//5*3=15
case '/': System.out.println(a+""+op+""+b+"="+""+((double)a/b)); break;		//5/3=1.0**
case '%': System.out.println(a+""+op+""+b+"="+""+(a%b)); break;			//5%3=2
}//switch end

 

2-2) int ans1=0 / double ans2=0.0

 

int ans1=0; //정수형인 결과
double ans2=0.0; //실수형인 결과

 

switch(op) {
case '+': ans1=a+b; break;
case '-': ans1=a-b; break;
case '*': ans1=a*b; break;
case '/': ans2=(double)a/b; break;
case '%': ans1=a%b; break;
}//switch end

if (op=='/') {
	System.out.println(a+""+op+""+b+"="+""+ans2); //5/3=1.6666666666666667
}else {
	System.out.println(a+""+op+""+b+"="+""+ans1);
}//if end

 

 

문제3) 주민번호를 이용해서 나이와 성별을 출력하시오.

         나이 : 올해년도 - 태어난년도

         성별 : 1 또는 3 남자

                 2 또는 4 여자

                 성별코드가 1 또는 2이면 1900년도 출생

                 성별코드가 3 또는 4이면 2000년도 출생

 

int myYear=15; //태어난 년도
int myCode=3;  //성별코드
/*
	출력결과
	나이:5
	성별:남자
*/

//태어난 년도 완성하기
switch(myCode) {
case 1: myYear=1900+myYear; break;
case 2: myYear=1900+myYear; break;
case 3: myYear=2000+myYear; break;
case 4: myYear=2000+myYear; break;
}//switch end
		
//나이
int myAge=2020-myYear;
System.out.println("나이:"+myAge);
		
//성별
String gender="";
switch(myCode%2) {
case 0: gender="여자"; break;
case 1: gender="남자"; break;		
}//switch end
		
System.out.println("성별:"+gender);

 

 

 

 

② 반복문 - while문

while문은 조건식이 true일 경우에 계속해서 반복한다. 조건식에는 비교 또는 논리 연산식이 주로 오는데, 조건식 false가 되면 반복 행위를 멈추고 while문을 종료한다. 

 

int a=1;
while(a<=3) {
	System.out.println("JAVA");
	a=a+1;
}//while end

/*
	JAVA
	JAVA
	JAVA
*/

 

 

위의 코드는 a=4일 때 while문의 조건식이 false가 되어 반복 행위를 멈추고 while문을 종료한다.

 

무한 루프는 무한히 반복해서 실행하기 때문에 언젠가 while문을 빠져나가기 위한 코드가 필요하다. while문을 빠져나가기 위한 또 다른 방법으로 break문을 이용하는 방법도 있다. 다음은 그에 대한 예시 코드이다.

 

int b=1;
while(true) {
	System.out.println("Python");
	if(b==3) {
		break;
	}
	b=b+1; //b+=1; b++; ++b;
}//while end

/*
	Python
	Python
	Python
*/

 

위의 코드는 b=1이 while문에 들어가 Python을 출력하는 식이다. 출력 후 b=b+1이 되고 이를 반복하다 while문 안에 중첩되어 있는 if문의 조건식이 true가 되어 종료된다.

 

 

 

 

② 반복문 - do-while문

do-while문은 조건식에 의해 반복 실행한다는 점에서 while문과 동일하다. while문은 시작할 때부터 조건식을 검사하여 블록 내부를 실행할지 결정하지만, 경우에 따라서는 블록 내부의 실행문을 우선 실행시키고 실행 결과에 따라서 반복 실행을 계속할지 결정하는 경우도 발생한다. 이때 do-while문을 사용할 수 있다.

 

do {
	조건이 true이면 수행
}while(조건);

 

int c=1;
do {
	System.out.println("KOREA");
	c=c+1;		
}while(c<=3);

/*
	KOREA
	KOREA
	KOREA
*/

 

 

단, 조건이 거짓이어도 무조건 1번은 수행된다.

 

int d=3;
do {
	System.out.println("SEOUL");
}while(d<=1);

//SEOUL

 

 

 

문제1) 1년 (365.242일)은 365일 몇 시간 몇 분 몇 초인가?

 

         1분    : 60초
         1시간 : 60분*60초 = 3600초
         1일    : 3600초*24시간 = 86400초
         365.242일 : 86400초*365.242일 = 31556908.8초

 

        0.242일 : 20908.8초

 

        h=sec%3600 #5
        m=(sec/3600-h)*3600%60 #48
        s=m*60 #28.8

 

        double year=365.242;
        int 1m=60, 1h=3600, 1d=86400;

 

        //1년이 몇 초인지 계산
        int total = (int)(year*86400);
        int hour = (int)(total/365)-1d; //57.2843835616463
        int min = (int)(hour/60)

 

나는 위의 데이터를 기반으로 코드를 작성했다.

 

 

내 답안

 

double year=365.2425;
int total = (int)(year*86400);
int day, hour, min, sec;
		
day=total/86400;
total=total%86400;
		
hour=total/3600;
total=total%3600;
		
min=total/60;
sec=total%60;
		
System.out.println(year);

System.out.printf("%f일은 365일 %d시간 %d분 %d초이다.", year, hour, min, sec);
//365.242000일은 365일 5시간 48분 28초이다.

 

선생님 답안

 

double year=365.2425;
//1년이 몇 초인지 계산
int total = (int)(year*86400);
		
int day=total/86400;
System.out.println(day+"일");	//365일
		
total=total%86400;
int hour=total/3600;
System.out.println(hour+"시간");	//5시간
		
total=total%3600;
int min=total/60;
System.out.println(min+"분");	//48분
		
int sec=total%60;
System.out.println(sec+"초");	//28초

 

 

 

문제2) 어느 달팽이가 낮에는 3cm 올라가고 밤에는 2.5cm 내려간다고 할 때,

         달팽이가 13cm의 나무 꼭대기에 올라가려면 몇 일이 걸리는지 고르시오.

 

 

내 답안

 

double tree=0.0;
int count=0;
while(true) {
	tree=tree+3;
	count=count+1;
	if(tree==13) {
		break;
	}
	tree=tree-2.5;
}//while end
System.out.println(count); //21

 

선생님 답안

 

int count=0;		//며칠
double snail=0.0;	//달팽이
		
while(true) {
	count=count+1;
	snail=snail+3.0;		//낮에 3cm 올라감
	if(snail>=13) {			//13cm 도달했나요?
		break;	//무한루프 빠져나옴
	}else {
		snail=snail-2.5;	//2.5cm 내려옴
	}//if end		
}//while end
System.out.println(count+"일");

 

 

 

문제3)

 

내 답안

 

int n=0;
double sum=0.0;
while(n<=99) {
	if(n%2==0) {
		sum=sum-n/(double)(n+1);
		n=n+1;
	}else {
		sum=sum+n/(double)(n+1);
		n=n+1;
	}//if end
}//while end
System.out.println(sum);		
        
//0.6881721793101957