우리가 지금까지 수행문 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의 기능도 꼭 기억하자.
나쁜 조건을 먼저 따져서 프로그램을 빨리 종료시킬 생각을 해야한다. 아닌거, 나쁜건 빨리 걸러서 없애버리는 사고를 가지자.
'Skill Tree🌲 > coding_package' 카테고리의 다른 글
Java 웹개발자 과정 5일차 - 약간의 메소드, 배열 (0) | 2022.03.12 |
---|---|
Java 웹개발자 과정 4일차 - switch문, for문, 이중for문, Scanner (0) | 2022.03.08 |
Java 웹개발자 과정 2일차 - main메소드, Literal, 변수의 자료형, 변수생성과 초기화, 타입형변환, 연산자 (0) | 2022.03.03 |
Java 웹개발자 과정 1일차 - Java의 기초 문법, 개념 / 단축키 (0) | 2022.03.03 |
자바 cmd(커맨드)로 실행하기 (0) | 2022.01.31 |