본문 바로가기

Skill Tree🌲/coding_package

Java 웹개발자 과정 3일차 - 비교연산자, 논리연산자, 삼항연산자, if문, 변수의 스코프, 내포된 if문과 빠른 종료

우리가 지금까지 수행문 1에서 수행문 4까지 순서대로 작동하는 코드를 작성했다.

public static void main(String[] args){
     수행문1;
     수행문2;
     수행문3;
     수행문4;
}

 하지만 우리가 원하는 것은

이렇게 조금 더 복잡한 코드를 실행시키고 싶다. 이러한 복잡한 코드를 실행하기 위해 비교연산자와 논리 연산자를 많이 사용하게 된다.


비교 연산자
>  >=  <  <=  ==  !=

연산결과는 항상 boolean타입의 값이다.

비교연산자는 제시된 조건 하나를 검사(판정)할 수 있다.
비교연산자가 논리연산자보다 우선순위가 높다.

느낌표는 항상 부정, not의 의미이다.

!=  일치하지 않으면 true

== 일치하면 true


논리 연산자
&&  논리곱, and (둘 다 true일 때, true)
||     논리합, or (둘 중 하나여도 true, "~하거나")
    논리 부정

연산결과는 항상 boolean 타입의 값이다.
피연산자(연산대상자)도 boolean 타입의 값이어야 한다. 혹은 피연산자는 연산결과가 boolean형인 표현식이어야한다.

논리연산자는 제시된 여러 개의 조건을 조합해서 검사(판정)할 수 있다.
비교연산자가 논리연산자보다 우선순위가 높다.

&는 엔퍼센트 라고 읽고, |는 파이프라고 읽는다.

표현식1 && 표현식2
: 표현식1이 false로 판정되면, 표현식2를 확인하지 않고 최종 연산결과를 false로 판정한다.

표현식1 || 표현식2
: 표현식1이 true로 판정되면, 표현식2를 확인하지 않고 최종 연산결과를 true로 판정한다.

 

표현식1 & 표현식2
: 표현식1과 표현식2를 확인하고 최종 연산결과를 제공한다.

표현식1 | 표현식2
: 표현식1과 표현식2를 확인하고 최종 연산결과를 제공한다.

&&가 &보다 성능이 좋아서 수행작업이 크게 줄어든다. 그래서 &나 |는 사용하지 않는다.


삼항 연산자 또는 조건 연산자
조건식 ? 표현식1 : 표현식2

조건식의 연산결과는 boolean형의 값이어야 한다.
표현식1과 표현식2는 같은 타입의 값이거나, 같은 타입의 값이 연산결과로 제공되는 표현식이어야 한다.
조건식이 true로 판정되면 표현식1이, 조건식이 false로 판정되면 표현식2가 이 연산의 최종결과가 된다.

(EX)

http://sports.daum.net/                                홈     String type = "";
http://sports.daum.net/soccer                  축구     String type = "soccer";
http://sports.daum.net/worldsoccer   해외축구     String type = "worldsoccer";
http://sports.daum.net/baseball                야구     String type = "baseball";
http://sports.daum.net/worldbaseball 해외야구     String type = "worldbaseball";


menu 하이라이트 하기

홈  type == "" ? "active" : ""
축구 type == "soccer" ? "active" : ""
...

<연산자 우선순위 높은 순부터 내림차순>

++  --
*  /  &
+  -
>  >=  <  <=  ==  !=
&&  ||  !
=  +=  -=

제어문과 반복문
  • 특정 조건을 만족할 때 (표현식이 true로 판정될 때) 수행문의 실행 흐름을 변경하거나, 수행문을 반복 실행하는 것
  • 제어문 : if문, swith문
  • 반복문 : for문, while문, do~while문

for문과 while문을 사용하는 경우가 엄격하게 구분되어 있고, switch문 do~while문은 잘 사용하지 않는다.


if문

if문은 true인 경우에만 결과값이 있는 경우에 쓴다.

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

조건식은 연산결과가 boolean형의 값을 제공하는 표현식이다.
조건식의 최종 연산결과가 true로 판정될 때만 블록안에 위치한 수행문들이 실행된다.

if문은 실행문의 수행 흐름을 바꿀 때 쓴다. 수행문을 실행되게 하거나, 실행되지 않게 할 수 있는데, 이걸 결정지을 조건식이 필요하다.


if ~ else문

if ~ else문은 true인 경우에 결과값이 있고, false인 경우에도 결과값이 있다.

if (조건식) {
         수행문1;
         수행문2;
         수행문3;
} else {
         수행문4;
         수행문5;
}

조건식이 true로 판정되면 수행문1, 수행문2, 수행문3이 실행된다.
조건식이 false로 판정되면 수행문4, 수행문5가 실행된다.

if ~ else if ~ else if ~ else문 

여러 개를(한 등급 안에 플래티넘, 다이아, 골드 등급 등등) 검토해야할 때 사용한다.

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

판정할 조건이 여러 개 일 때 사용한다.
조건식1이 true로 판정되면 수행문1을 실행하고, 나머지 부분은 전부 skip한다.
조건식1이 false로 판정되면 조건식2을 검사하고, true로 판정되면 수행문2를 실행하고, 나머지 부분은 전부 skip한다.
수행문4는 조건식1, 조건식2, 조건식3 전부 false로 판정났을 때 실행하게 된다.
조건식들은 전부 같은 값을 대상으로 검사를 수행하는 표현식이어야 한다.

다른 여러 조건들을 비교하는거는 아님 그러려면 하나의 조건식으로 추합해야 한다. else블록은 생략할 수 있다.

 

코드는 경제적이어야 한다.


변수의 스코프
  • 스코프는 변수의 사용범위(생존범위)를 말한다.
  • 자바에서 변수의 스코프는 그 변수가 선언된 블록이다. (생존 범위 / 그 밖을 나가면 사라진다. 4번째 목록과 이어짐)
  • 같은 스코프 내에 이름이 같은 변수를 선언할 수 없다.
  • 메소드 안에서 선언한 모든 변수는 그 변수가 선언된 블록의 닫는 괄호를 만나서 즉시 사라진다.

변수의 스코프를 벗어난 곳에서는 사용할 수 없다

변수를 어디에 선언해야 경제적일까 생각하며 코딩해야한다. 변수는 좁게 선언해야 한다. 넓은 범위에서 선언하면 한편으론 편리하긴 하지만, 조합할 다른 부속 조각프로그램에서 그 변수 이름을 쓸 수 없게 된다. 적당하게 선언하는 것이 중요. 

 

변수를 정할 때는 미리 변수 값을 담아두는게 좋다. 초기화하지 못하는 경우가 생길 수도 있기 때문에 적절한 초기값을 적어두는게 좋다.

 

정수일 때는 0, 실수일 때는 0.0, boolean값일 땐 false

 

근데 항상 이 초기값이 맞는 것은 아니다.

 

// 배열 안에서 지정된 이름이 저장된 위치를 찾아서 position 변수에 대입한다.
// 이름이 발견되면 저장된 위치를 출력하고, 이름을 발견하지 못한 경우 "찾을 수 없습니다."를 출력한다.

/*    [0]      [1]      [2]      [3]      [4]
*  "홍길동" "김유신" "류관순" "강감찬" "이순신"
*/

// 배열의 0번째부터 4번째까지 순회하면서 "안중근" 찾기
// 발견되면 position에 그 위치를 저장하기

/* int position = 0;
*0에는 값이 있기 때문에 0으로 초기화할 수 없다.
*/

int position = -1;

if(position == -1) {
		System.out.println("찾을 수 없습니다");
} else {
        System.out.println("저장 위치는  " + position + "번째 입니다.");
}

변수의 범위, 변수의 초기값, 초기화 될 기회를 꼭 생각하며 코딩을 해야한다.


디버깅 하는 방법

왼쪽 세로줄에 더블클릭하면 사진처럼 브레이크 포인트가 잡힌다. 그래야 디버깅이 가능해진다. 디버깅을 잘 해야 오류를 빨리 찾을 수 있다.


내포된 if문

잘 사용하면 코드가 경제적일 수 있다. 하지만 프로그램의 복잡도가 증가된다. 즉 코드 해석이 힘들어진다.

내포된 if가 많아질 수록 가독성이 떨어지고 복잡도를 증가시키기 때문에, 안 좋은 코드가 된다.

 

내포된 if문을 배제하면서 대신할 수 있는게 있다. 

 

빠른종료
public static void main(String[] args) {
// 국어, 영어, 수학 점수를 입력받아서 평군을 계산하고, "합격"/"불합격"을 화면에 출력한다.
// 평균 점수가 60점 이상이면 합격이다.
// 한 과목이라도 40점 미만이면 과락 불합격이다.

    int kor = 20;
    int eng = 100;
    int math = 100;
    
    if (kor < 40 || eng < 40 || math < 40) {
    	System.out.println("과락 불합격");
        return; // 빠른종료, return 키워드는 현재 실행중인 메소드를 즉시 종료시킨다.
    }
    int average = (kor + eng + math)/3;
    System.out.println("평균: " + average);
        
    if(average < 60) {
    	System.out.println("불합격");
        return;
    }
    
    System.out.println("합격");
    
}

코드들이 들여쓰기 없이 수평적이다. 그래서 해석도 쉽고, 복잡도도 낮아진다.

실제로 return은 예외와 관련된 코드를 쓴다. 맞고 죽으라는 의미로 throw 이걸 쓴다. 잡는건 catch. 

하지만 지금 사용하는 return의 기능도 꼭 기억하자.

 

나쁜 조건을 먼저 따져서 프로그램을 빨리 종료시킬 생각을 해야한다. 아닌거, 나쁜건 빨리 걸러서 없애버리는 사고를 가지자.