주니 개발 도서관

자바(JAVA)

(2) 연산자와 조건문

주니홍 2022. 6. 8. 20:36

 

0608 정리및 풀이

 

비교 연산자

 

 > < >= <= == !=
크다 작다 크거나 같다 작거나 같다 같다 다르다

예외**

String 타입의 문자열은 연산자로 비교할 수 없다

 

어째서 String 타입은 불가능 할까?

연산자들의 대상은 기본적으로
ㅡ> 변수 즉, 원시타입이다

* 원시타입 : boolean, byte, char, int, long ..

 

String은 클래스로 이루어져 있기때문에

변수가 아닌 객체이다
ㅡ> 객체  !=  변수

 

하지만 == 와 != 를 표현하는 함수가 존재한다

== 와 같은 역할인 .equals(); 이다

String 값.equals(String 값);

일치하다면 true

불일치하다면 false

 

=! 와 같은 역할인 앞에 ! 표를 붙여

! String 값.equals(String 값);

일치하다면 false

불일치하다면 true

로 사용한다.

 

 

 논리 연산자

 

%% - and 둘다 같아야한다 true
|| - or 둘중 하나만 맞아도 true
!  - not 부정

 

 

수도코드(pseudocode)

 

수도코드 또는 의사코드로 불리는 이 방법은

실제로 코딩으로 들어가기 전 우리의 언어로 만들어질 코딩의 흐름을 정리해보는 것이다.


코드순서를 생각해본다

1. 나이가 15세 이상이라면 영화를 볼수있다

2. 15이상 20미만이면 청소년가격 1500원

2-1. 20세 이상이라면 성인가격 3000원

2-2. 80세 이상이면 무료로 볼수있다.

3. 끝

 

이후 한글을 코드화 하여 바꾸면서 코드를 짜보도록 한다

 

 

조건 연산자 (삼항 연산자)

 

조건식  ?  T  :  F

 

조건식이 참이라면 T위치의 값 거짓이라면 F의 값을 가져온다.

** 변수의 담아내기 위해선 T와 F의 값담아낼수 있는 자료형을 가져와야한다

 

ex) a 와 b를 비교하여 뭐가 큰수인지 알려줘라

int a = 10;

int b = 15;

int target = a > b  ?  a  :  b

target은 a가 크기 때문에 true 값인 a의 int값을 담고있다.

 

3가지 정수를 비교하여 가장 작은수를 가져오자

int a = 3;

int b = 7;

int c = 5;

 

int target =  ( a < b     ?    ( a < c  ?  a  :  c )     :   ( b  <  c  ?  b  :  c )   ) ;

** 괄호는 없어도 가능하다 (묶음을 표현하기위해 사용함)

조건 연산자 안에 조건연산자도 사용가능하다

 

조건식이 ture 라면

1. a 가 b 보다 작니?

1-1 a가 c보다 작니?

1-2 결과값

 

조건식이 false 라면

2. a가 b보다 작니? (false)

2-1 b가 c보다 작니?

2-2 결과값

 

 

입력 (Scanner)

 

사용자에게 입력값을 받기위한 객체

Scanner scanner = new Scanner(System.in);

scanner = 식별자 이므로 scanner 자리에 sc를 사용해서 줄여서 편하게 사용가능하다

 

Scanner를 사용하기 위해선 import를 해야하는데

import java.util.Scanner;

Ctrl + Shift + o 로 자동 ipmport를 할 수 있다

Scanner 뒤에 Ctrl + space bar를 눌러 할 수도 있다 

 

입력받는 방법

 

sc. nextLine(); 문자 또는 문장 한라인을 받아온다
sc. next(); 공백을 기준으로 한 단어만 입력을 받는다
sc. nextInt(); 정수를 받아온다
sc. nextDouble(); 실수를 받아온다

** nextLine은 한줄 단위로 입력을 받기 때문에 개행문자(Enter) ** 도 포함

좀 더 직관적으로 설명하자면 nextLine()에 1234를 입력하고 Enter를 쳤다면 버퍼(저장공간)에 1234\n이 존재한다.

 

** System.out.pirnt("정수를 입력해주세요 : " ); // 사용자의 편의성을 고려하여 무슨값을 넣어야할지 제시해 주자

int num = sc.nextInt();

 

** 버퍼 로 인한 nextLine(); 오류

버퍼란 Scanner를 사용하는 사용자를 위한 중간공간이라고 할수있다

사용자공간  <ㅡ    버퍼     ㅡ>  메모리공간

 

Scanner를 사용하며 사용자에 Enter값에 반응하여 버퍼로 들어간다

Enter값까지 합쳐진 상태로 버퍼에 넘어가고, 버퍼에서 Enter값을 떼어 메모리공간에 넘겨준다

이 상태에서 nextLine()을 사용하게 되면 nextLine은 Enter값을 가져갈수있기때문에

버퍼에 있는 Enter값을 그대로 가져가 자동입력되어 사용자가 사용할수 없게된다

그런상황을 방지하고자 next(), nextInt(), nextDouble() 바로 이후에 nextLine을 사용하고싶다면

아래와 같이 사용해야 할 것이다

 

ex)

int num = sc.nextInt(); // 사용자에게 int값을 받아옴 ㅡ> 이후 엔터값이 남아있음

sc.nextLine();  // 버퍼공간에 남아있는 엔터값을 제거하는 용도

String name = sc.nextLine();

 

 

Scanner의 유효성 검사 *** (유지보수에 중요)

 

제일 먼저해야하는 일은 매개변수의 값이 적절한 것인지 확인하는 것이다.
'호출하는 쪽에서 알아서 적절한 값은 념겨주겠지'라는 생각을 절대 하면 안된다.

따라서 가능한 모든 경우의 수에 대해 고민하고 그에 대비한 코드를 작성해야한다.

 

 

변수와 객체 비교이해

 

변수 원시타입으로 만든다
객체 클래스로 만든다

* 원시타입 : boolean, byte, char, int, long ..

 

int a = 10 ;
변수를 초기화 했다
int a;
변수를 선언했다

 

String str = new String("apple");

객체 str을 생성했다
String a = new String("kiwi");

객체 a를 생성했다

 

 

제어문

 

제어문에는 조건문과 반복문이 존재한다

 

1. 조건문

 

할때도 있고, 안할때도 있을때 사용

if문, switch문이 있다.

그중 if문에 중점을 두고 공부하겠습니다.

 

if 문의 기본식

 

if (조건식){

조건식이 ture일때 실행되는공간

}

 

else if + else를 이용한 식

 

if ( 조건식 a ) {

- 조건식이 ture일때 실행되는 공간

} else if  ( 조건식 b) {

- 조석식a가 false 이고

- 조건식b가 ture일때 실행되는 공간

} ...{

} ...{

} else {

- 위의 모든 조건식이 false일때 실행되는 공간

}

로 표현할 수 있다.

 

 

기술 Tip

교환 알고리즘**

예제문제 - 두 수중 작은 숫자를 큰 숫자에 나눠 약수인지, 약수가 아닌지 판별하여라

 

System.out.print("정수1 입력 : ");

int num1 = sc.nextInt();

System.out.print("정수2 입력 : ");

int num2 = sc.nextInt();

 

if (num1 > num2) {    // 숫자 크기비교 조건문 (num1 이 컷을 경우)
       

           if(num1%num2 == 0) {   // num1이 컷을때 나머지가 없다면
                   System.out.println(num2+"는 "+num1+"의 약수입니다");
           }else { // 나머지가 있다면
                   System.out.println(num2+"는 "+num1+"의 약수가 아닙니다");
           }   // 내부 if문 끝

}else if (num1 < num2) {   // 숫자 크기비교 조건문 (num2 가 컷을 경우)

              if(num2%num1 == 0) {   // num2가 컷을때 나머지가 없다면

                       System.out.println(num1+"는 "+num2+"의 약수입니다");
              }else {   // 나머지가 있다면
                       System.out.println(num1+"는 "+num2+"의 약수가 아닙니다");
              }   // 내부 if문 끝

 

}  // if문 끝

 

이때 두 수의 비교해 보자

사용자에게 받은 정수를 살펴보면

num1 = 50 or num1 = 100
num2 = 100 num2 = 50
동일한 결과값 = 50은 100의 약수입니다

결국엔 50이란 작은값이 큰값인 100을 나눠 확인을 한다

그렇기에 교환알고리즘 기술을 이용하여 코딩해 보자

 

 

 

교환알고리즘**

- 임시저장변수( tmp )를 이용하여 사용하는 기술

 

System.out.print("정수1 입력 : ");

int num1 = sc.nextInt();

System.out.print("정수2 입력 : ");

int num2 = sc.nextInt();

 

if ( num1 > num2 ) {    // num2가 num1보다 크다면 자동적으로 num1은 작은 수기 때문에 if문 안으로 들어오지 않는다

             int tmp = a ;

             a = b ;

             b = tmp ;

} // 이 코드를 통해 무조건 두 정수중 작은수가 num1에 저장된다

String msg  =  num2   %   num1(무조건 작은수)  ==   0    ?    "약수입니다"     :    "약수가 아닙니다" ;

System.out.println( num1 + "은 " + num2 + "의 " + msg ) ;

 

더욱 간결하게 만들 수 있다.

 

 

교환 알고리즘의 움직임

num1 = 100, num2 = 50이란 숫자를 대입이후 위의 교환알고리즘 코드의 움직임을 살펴보자

디버깅표
num1 num2 tmp
100 50 100 (1번)
50 (2번) 100 (3번)  

 

 

 

 

 

'자바(JAVA)' 카테고리의 다른 글

(주말) 영상과제  (0) 2022.06.13
0607~0610 Exception(오류) 정리  (0) 2022.06.11
(4) 중첩 반복문, 배열  (0) 2022.06.10
(3) 반복문  (0) 2022.06.09
(1) 자료형, 변수, 연산자 (기초)  (0) 2022.06.07