정리 노트/쌍용 KDT_(자바 Spring)

23.02.03(금): 조건 연산자, 윤년/평년, 조건문 if

우주바다 2023. 2. 16. 23:50
728x90

오늘 배운 내용
01. 삼항 연산자 
02. 윤년과 평년   
03. 조건문 if



01. 삼항 연산자 

 

실습 028

정수를 사용자 입력받고, 양수인지 음수인지 0인지 판별 후 출력하는 프로그램. 
입력은 BufferedReader 로, 기능은 조건 연산자로 구현한다. 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test028{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		System.out.print("임의의 정수 입력: ");
		int num = Integer.parseInt(br.readLine());
       
		String strResult;
		strResult = (num == 0) ?  "0" : ((num > 0) ?  " 양수" : "음수") ;	
		System.out.printf("%d → %s\n\n", num, strResult);
	}
}

실습 029 ~ 029_2

임의의 문자를 사용자 입력 받는다. 
대문자면 소문자로, 소문자면 대문자로, 알파벳이 아니면 그대로 출력한다.
참고)  문자 'A' -'Z'의 아스키 코드는 (65 ~ 90) , 'a' - 'z' 는 (97 ~ 122)

 

①  메소드로 변환하는 방식 :  .isUpperCase() .toLowerCase() .toUpperCase()

더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test029{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("한 문자 입력: ");
		char ch;
		ch = (char)System.in.read();  // 앞 한 글자만 가져온다.(형변환)
	    	int temp = (int)ch;           // 가져온 값의 아스키 코드 담는 임시 변수 
		char result;

		result = ( 64 < temp && temp < 91) ? ( Character.isUpperCase(ch) ? Character.toLowerCase(ch) : Character.toUpperCase(ch) ): ch;
		System.out.printf("%c → %c\n", ch , result);		
		/*
		한 문자 입력: A
		A → a
		계속하려면 아무 키나 누르십시오 . . .
		*/		
	}
}

 

② 아스키 코드 값으로 변환하는 방식 (대소문자 차이만큼 빼기)

더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test029_1{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("한 문자 입력: ");
		int temp = System.in.read();	// 아스키 값을 담고 연산에 사용할 임시 변수.
		boolean isAlpha = (65 <= temp && temp <= 90) || (97 <= temp && temp <= 122) ?  true : false; // 알파벳 판별 결과 (불리언)
		char result;                 // 최종 결과 값 

	    	result = (isAlpha == true) ? ((65 <= temp && temp <= 90) ? (char)(temp + 32) : (char)(temp - 32)) : (char)temp ;
		System.out.printf("%c → %c\n", (char)temp , result);
		
		// ★ 강사님 코드 
		// result = (ch >= 'A' && ch <= 'Z') ? (char)(ch + 32) : ((ch >= 'a' && ch <= 'z') ? (char)(ch - 32) : (ch));
		//			------------------------   ----------------   -------------------------------------------------- 
		//            ch는 대문자인가?          맞으면 소문자로   틀리면서, 소문자인가?      맞으면 대문자로.  그것도 아니면 원본. 
		// 아스키가 숫자라서 숫자로만 연산했는데, ch 자체로 비교 및 연산이 가능하다. 
	}
}

 

③ 아스키 코드 (대소문자 차이(32) 빼기) + 강사님 코드 참고 리팩토링 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test029_2{ //최종 
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("한 문자 입력: ");	
		char ch = (char)System.in.read();	 // 아스키로 들어오는 값의 원본 char
		char result;                             // 결과 값 
		result = (ch >= 'A' && ch <= 'Z') ? (char)(ch + 32) : ((ch >= 'a' && ch <= 'z') ? (char)(ch - 32) : (ch));
		System.out.printf("%c → %c\n", ch , result);
	}
}

 



02. 윤년과 평년

 

+) 윤년과 평년은 꼭 알아두자!

더보기

회사에서 기본으로 보는 게시판 짜기, 일정관리 등에 꼭 필요한 개념.
2월이 28일까지 있는 해 : 평년
2월이 29일까지 있는 해 : 윤년

1년은 정확하게는 365일이 아니다. 
지구가 태양을 돌아 제자리로 돌아오는데 대략 365일이 걸린다.
약간씩 늦어지길래 ..
그래서 4년주기로 하루를 더하자! (366일) 2월을 29일까지 !
>> 이러니 또 빨라지길래..
그럼 100년 주기로는 더하기를 하지 말자. (스킵)
>> 미묘하게 느림 
>> 그러다가 400년 마다 한 번 더하자. (여기까지가 윤년과 평년의 규칙.)

 

실습 030 


임의의 '연도'를 사용자 입력 받는다.
윤년인지 평년인지 판별하고 출력하는 프로그램 구현. 
조건 :  BufferedReader 와 조건 연산자를 활용한다.

더보기

2월이 28일까지 있는 해 : 평년  common year
2월이 29일까지 있는 해 : 윤년  leap year

윤년의 판별 조건: 

(연도가 4의 배수면서) && (100의 배수가 아니면서)  || (400의 배수일 때.)
    ---------------- 논리 and --------------------           400의 배수면 무조건 true! 별개로 처리. 
평년 : 그 외 모두 평년.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test030 { // ① 내 코드
	public static void main(String[] args) throws IOException{	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		System.out.print("임의의 연도 입력: ");
		int year = Integer.parseInt(br.readLine());	
		boolean isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
		String strResult;  //   결과값
	    
		strResult = isLeap ?  "윤년" :  "평년";	
		System.out.printf("%d년 → %s\n", year ,strResult);
		/*결과
			임의의 연도 입력: 2000
			2000년 → 평년
			계속하려면 아무 키나 누르십시오 . . .
		*/
	}
}
더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test030_1 { //  ② 강사님 코드
	public static void main(String[] args) throws IOException{	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		int year;
		String strResult; 
		System.out.print("임의의 연도 입력: ");
		year = Integer.parseInt(br.readLine());
		
		strResult = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ? "윤년" : "평년";	
	    	System.out.printf("%d년 → %s\n", year ,strResult);	
	}
}

 

+) 2월 16일. 거의 2주 지나서 다시 보니..요즘은

변수, 연산, 결과 순서대로 클래스를 설계하고 있지만 이 때는 생각 흐름대로 작성했던 게 잘 보인다.

그리고 파이썬으로 알고리즘했던 경험 때문인지 자연스럽게 불리언 변수를 따로 선언 짧게 구성한 점도 눈에 띈다.

며칠만 지나도 내 코드가 새롭게 보여서 신기하고 즐겁다!


03. 조건문 if

 

제어문은 실행 흐름을 컨트롤하며  조건에 따른 프로그램 분기를 만든다.

if문, 조건 연산자, 복합 if문 (중첩 if) , switch 가 있다.

조건문(==제어문, 분기문) 이라고 한다.


① if (boolean) { ... }
조건식은 항상 불리언 값이어야한다. true면 실행, false면 건너뛴다.

② if ~ else
   if ~ else if ~ else  :

 (else내부에 다시 if로 시작하는 중첩 문을 축약한 else if. 수 제한 없이 사용가능) 
   
  if문은 종류와 상관없이 무조건 한 블럭만 실행한다.
  if부터 else에 이르기까지 상단 조건에 맞지 않을 때 계속 아래로 내려가며 조건을 확인한다.
  모든 블럭에 해당하지 않으면 마지막의 else 부분을 실행한다.

③ 조건문에서 중괄호는 (하나의 문장일 때)는 생략가능. 

(== 중첩이 아닐때) 

  //  ex. 단일 if, if ~ else, if ~ else if ~ else 모두 한 문장. 
if() 
	System.print();
else if()
	System.print();
else 
	System.print();

 

 +)  switch (조건문, 제어문, 분기문) / 가볍게 언급만.
: else처럼 default 키워드도 문법적으로 필수는 아니다.

차이점은 '케이스 위치를 아무데나 둬도 상관 없다' 지만 보통 최하단에 배치한다.


실습 031  

이름, 국어점수, 영어점수, 수학점수를 사용자 입력 받고 출력한다.

 - 등급은 평균 점수를 기준으로 처리한다. 
 - 입출력 구현은 BufferedReader , printf() 를 사용한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test031{
	public static void main(String[] args) throws IOException{   
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("당신의 이름은?: ");
		String strName = br.readLine();
		System.out.print("당신의 국어 점수는?: ");
		int nKor = Integer.parseInt(br.readLine());
		System.out.print("당신의 영어 점수는?: ");
		int nEng = Integer.parseInt(br.readLine());
		System.out.print("당신의 수학 점수는?: ");
		int nMat = Integer.parseInt(br.readLine());
		 
		int nTot = nKor + nEng + nMat;
		double fAvg = (nTot / 3.0);// nTot/3 에서 수정. 
		char cGrade;//(연산 후 담으면 의미 X)우항부터 생각!
		
		if(fAvg >= 90){
			cGrade = 'A';
		}else if( fAvg >= 80){ //( fAvg >= 80 && fAvg < 90 ) 비효율적. 
			cGrade = 'B'; //if를 지나서 이미 90미만 조건 포함하고 있음
		}else if( fAvg >= 70 ){
			cGrade = 'C';
		}else if( fAvg >= 60 ){
			cGrade = 'D';
		}else                   
			cGrade = 'F';								
		// (조건에 맞는 게 없으면 아무것도 실행하지 않고 스킵, 종료.) 						
		System.out.printf("\n>> 당신의 이름은: %s 입니다.\n", strName);
		System.out.printf(">> 국어 점수는 %d,\n>> 영어 점수는 %d,\n>> 수학 점수는 %d,\n", nKor , nEng, nMat);
		System.out.printf(">> 총점은 %d이고, 평균은 %.2f 입니다.\n", nTot, fAvg);
		System.out.printf(">> 등급은 %c 입니다.\n\n", cGrade);	
	}
}// end class Test031     ---> 친절한 컨벤션 
		/* ----------------------------------
		>> 당신의 이름은: 우주 입니다.
		>> 국어 점수는 90,
		>> 영어 점수는 80,
		>> 수학 점수는 70,
		>> 총점은 240이고, 평균은 80.00 입니다.
		>> 등급은 B 입니다.

		계속하려면 아무 키나 누르십시오 . . .
		------------------------------------*/
        // else 구문을 쓰지 않고  double fAvg = 'F' 로 초기화(할당) 하면 오류없이 실행된다.
        // 만약 그냥 else 블럭이 없다면 오류.(지역변수는 꼭 초기화 해야한다. 담긴 값이 없으면 안 된다.)
        // + 만약 각 분기마다 값 할당이 아니라 출력문만 적는다면 else가 없어도 괜찮다.

 

실습  032

임의의 정수를 사용자 입력 받아 홀수/짝수 판별 및 출력.
- 단일 if 구문을 사용한다  
- 입출력 구현은 BufferedReader , printf() 를 사용한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test032{
	public static void main(String[] args) throws IOException{   
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("- 임의의 정수 입력: ");
		int num = Integer.parseInt(br.readLine());
		String strResult = "홀수"; // 디폴트 값을 홀수로 초기화 
		
		if(num % 2 == 0)
			strResult = "짝수";
		System.out.printf("\n>> %d은(는) %s 입니다.\n", num, strResult);
	}
}	  /* ----------------------------------
		- 임의의 정수 입력: 26

		>> 26은(는) 짝수 입니다.
		계속하려면 아무 키나 누르십시오 . . .
	 ------------------------------------*/
// if를 2개 사용해서 홀/짝을 나눌 수 있지만 논리적으로 좋지 않음.
// 둘 다 들여다보는 시간 낭비 + 값 간섭, 중복 가능성 
// 물론 단일 if를 여러개 써야하는 상황도 있을 수 있지만, (조건 체크 필요 시)
// 논리적으로 하나의 구조라면 분기라는 기능에 맞게 한 문장으로 구성하는 게 좋다.

+) 번외

더보기

잘 모르는 코드( 새로 배웠거나, 다른 사람 풀이 등) 공부할 때 

보면서 베끼지 말기. 공부 안 됨. 외워서 쳐보고 모를때만 보기.
+ 어차피 연차 찰 수록 코딩 잘 안 하게 됨
(내가 이미 썼던 코드 모아두고 라이브러리처럼 쓰게 됨)

오늘 느낀 점 

삼항연산자 문법을 대충 알고는 있었지만 실제로 써 본적은 없었다.

눈으로만 봤을 때는 살짝 복잡해보였는데 생각보다 간단하고 재밌었다.

윤년, 평년에 대해 자세히 배운 것도 좋았다. 그 동안 윤달은 하루 더 있다! 정도만 알고 있었는데

어떻게 정해졌는 지 비하인드가 재밌어서 기억에 잘 남았다.

예전에 앱개발 강의를 들으며 일정 관리 어플을 만들어보고 싶다는 생각을 했었는데 

잊고 있었다.. 마침 필요한 개념을 배워서 반가웠다. 잘 기억해뒀다가 적용해보고 싶다.

728x90
반응형