티스토리 뷰
1. 단항 연산자란?
- 피연산자가 1개인 연산자이다.
- (1) 부호 연산자 : + , - [ 논리타입인 boolean과 char타입은 사용이 불가능하다. ]
- * 부호연산자의 산출타입은 int이다.
- (2) 증감 연산자 : ++ , -- [ 전위와 후위가 구분되게 된다. ]
- * 연산식에서 사용될 때, 후위연산자는 연산이 모두 끝난 후에 1증감을 시킨다.
- (3) 논리부정 연산자 : ! [ Boolean 타입에만 사용이 가능하다. ]
- * !피연산자 식으로 사용이 되며, 피연산자가 true면 false로 false면 true로 바꾸게 해준다.
2. 이항 연산자란?
- (1) 산술 연산자 : + , - , * , / , %
- (2) 문자열 연산자 : + [ 연산자 중 1개의 연산자가 String 타입일 경우 다른 연산자도 String으로 변환한다. ]
- 피연산자 중 문자열이 있으면 결과가 문자열타입으로 산출이 된다.
- (3) 대입 연산자 : = , += , -= , *= , /= , %= , &= , ^= , ㅣ= , <<= , >>=
- * += : 두개의 항을 더한 다음에 대입하라
- (4) 비교 연산자 : < , <= , > , >= , == , !=
- * !=는 ‘같지 않다.’라는 의미이다.
- * 대소 또는 동등을 비교해 Boolean 타입인 true/false을 산출한다.
- * 동등비교 연산자는 모든 타입에 사용된다.
- * 비교 연산자는 Boolean 타입을 제외한 모든 기본 타입에 사용된다.
- * 흐름 제어문인 조건문(if), 반복문(for, while)에서 주로 이용된다. ( 실행흐름 제어에 사용된다. )
- (5) 논리 연산자 : &&(논리곱) , ll(논리합) , & , l , ^(배타적 논리합) , !(논리부정)
- * &&와 &의 의미는 ‘그리고(AND)’라는 의미이다. &의 두개의 피연산자는 true와 false를 나타나는 boolean타입이 오게 된다.
- * l 과 ll는 ‘또는(OR)’이라는 의미이다.
- * 피연산자는 Boolean 타입만 사용이 가능하다.
- * AND는 피연산자가 모두 true일때만 연산결과가 true로 산출된다.
- * OR는 피연산자 중 하나만 true이면 연산결과가 true로 산출된다.
3. IP주소와 Port번호
- 프로그램의 “실행흐름”을 제어(control)를 하는 실행문장이다.
- 공유 폴더에 접근하는 방법 : Target pc의 ip주소를 알아야 한다.
- 인터넷에 연결된 모든 pc는 자신의 IP주소를 가지게 된다.
- IP주소 è 비유하면 ㅇㅇㅇㅇ아파트의 몇 동이라고 할 수 있다.
- ㅇㅇ호를 알 수 있는 것은 Port번호를 통해 알 수 있다.
- -> IP와 Port번호를 모두 알아야, 두 PC가 서로 간의 접속이 가능해진다
- -> IP 주소 ( 00아파트 000동 ) : 운영체제까지는 도달(접속) 가능
- -> Port 번호 ( 0000호 ) : 운영체제 위에서 구동되는 특정 프로그램까지 도달이 가능하다!
- IP주소를 알아보는 방법 : 파워쉘에 Ipconfig를 치면 IPv4에 나온다.
4. 코드 실행 흐름 제어
- 정상적인 코드 실행 흐름 : main 메소드의 시작인 중괄호인 { 에서 끝 중괄호인 }까지 위에서 아래의 방향으로 실행된다.
- 제어문은 코드 실행 흐름을 개발자가 원하는 방향으로 변경할 수 있게 해준다.
- 반복되면서 실행하는 것을 ‘루핑’이라고 한다.
5. 제어문
- 제어문은 중첩이 가능하다. ( 제어문의 중괄호’{}’ 내부에 다른 제어문 작성이 가능 )
- Depth가 3이상이면 코드에 오류가 있을 수 있으니, 확인해봐야 한다.
6. 조건식
- True 또는 false 값을 산출할 수 있는 연산식
- Boolean 변수
- 조선식이 true이면 블록을 실행하고 false이면 블록을 실행하지 않는다.
- 실행문이 1개 이하면 중괄호{}를 생략할 수는 있지만 코드의 구분이 어려우니 생략하지 않는 것이 좋다.
- If-else 구문 : 조건식 결과에 따라 실행 블록 선택
- ---à 조건이 참(true)일 때는 if블록을 실행하고, 거짓(false)일때는 else블록을 실행한다.
- IF – else if – else 구문 : 복수의 조건식을 두어 조건식을 만족하는 블록만 실행
- 당연히 기대했던 조건과 실행흐름을 Happy path(정상흐름)라고 부른다.
- 예상하지 못했던 조건과 실행흐름을 Alternative path(대체흐름)라고 부른다.
01. 문자열 연결 연산자
public class Sample30 {
public static void main (String[] args) {
// 문자열 연결 연산자(string concatenation) : +
String str1 = "JDK" + 6.0;
String str2 = str1 + "특징";
System.out.println(str1); // -----> 'JDK6.0'으로 출력이 된다.
System.out.println(str2); // -----> 'JDK6.0특징'이라고 산출된다.
// Why : str1을 보면 1개가 문자열("JDK")로 이루어져있는 것을 알 수 있는데, 그때에는 +가 문자열 연결 연산자로 바뀌게 되면서
// 6.0도 String(문자열) 타입으로 자동형 변환되게 된다. 그래서 6.0을 더하는 것이 아니라 두개의 문자열을 연결하여 출력되게 된 것이다.
// 문자열은 ""으로 표현해야 한다.
// 표현식(expression ==> 연산식)이 아무리 많은 연산자와 피연산자로 구성되어 있더라도,
// 그 실행결과는 단 1개의 값(= 스킬라)이 생성
// 표현식의 구성이 아무리 복잡해도, 단 한개의 항이라도 문자열이 있으면, 실행결과는 문자열!
String str3 = "JDK" + 3 + 3.0;
String str4 = 3 + 3.0 + "JDK";
System.out.println(str3); // -----> 'JDK33.0'으로 출력된다.
System.out.println(str4); // -----> '6.0JDK'로 출력이 된다.
// Why : 대부분 연산식(표현식)은 왼쪽에서 오른쪽으로 진행되게 되는데, str3의 경우 첫 연산부터가 String으로 자동변환하게 되면서 3개가 다 문자열로 연결되는 반면,
// str4의 경우 1번째와 2번째가 먼저 실수타입으로 연산되게 된 후에, String 타입으로 변환되기에 결과에 그렇게 나왔다.
} // main
} // end class
02. 동등비교 연산자
public class Sample31 {
public static void main (String[] args) {
int num1 = 10;
int num2 = 10;
boolean result1 = ( num1 == num2 ); // (동등비교 연산자) num1과 num2가 같냐는 의미이다.
boolean result2 = ( num1 != num2 ); // (동등비교 연산자) num1과 num2가 같지 않냐는 의미이다.
boolean result3 = ( num1 <= num2 ); // num1가 num2 이하냐는 의미이다. [ 왼쪽을 기준으로 생각해야 한다. ]
// '()'를 사용하여 연산의 우선순위를 정해줄 수 있다. ()를 친 연산부터 먼저 실행하게 된다.
// boolean의 경우 true와 false의 논리타입의 결과값이 나오게 된다.
// '()'사용해야 대입연산자인 = 과 구분할 수 있기에 잘 사용해야 한다.
System.out.println("result1 : " + result1); // ---> result1 : true로 출력된다.
System.out.println("result2 : " + result2); // ---> result2 : false로 출력된다.
System.out.println("result3 : " + result3); // ---> result3 : true로 출력된다.
} // main
} // end class
03. IF문의 활용 - ' & (AND) ' 과 ' | (OR) '
public class Sample32 {
public static void main (String [] args) {
int charcode = 'A'; // 65 정수타입으로 대입
if((charcode>=65) & (charcode<=90)) {
System.out.println("대문자이군요!"); // 참이면 대문자이군요를 출력해라.
} // if1 - 대문자인지 파악하는 if구문
// AND와 OR을 이용하여 어떻게 범위를 설정해야 하는지 잘 구분해야 한다.(**)
if((charcode>=97) & (charcode<=122)) {
System.out.println("소문자이군요!"); // 참이라면 소문자를 출력해라.
// AND(&)는 두개의 조건 모두 true이어야 연산결과가 true가 나온다.
//'()' 꼭 사용해야 한다!!!
// &&는 두 조건 중 하나가 false일 경우에는 2번째 조건은 보지도 않는 쇼트버전이고
// &는 첫번째가 false가 나올지라도 2번째 조건도 살펴보는 것이다.(*)
// 실무에서는 속도측면에서는 &&가 유리하지만, 가독성과 버그를 줄이기 위해서 &를 더 많이 사용한다. (****)
} // if2 - 소문자인지 파악하는 if구문
if (!(charcode<48) && !(charcode>57)) {
// 단항연산자(!)가 이항연산자보다 먼저 연산되어 버리기에 꼭 ()를 사용해야 한다.
// !() 와 !()를 계산한 후에 &&(AND)를 연산한다.
System.out.println("0-9 사이의 숫자이군요!");
// 어? 근데 우리는 charcode에 'A'의 키코드값인 65를 저장하였는데 어떻게 0-9 사이의 숫자임을 알 수 있을가?
// ---> 0-9에 해당되는 숫자 또한 키코드값이 따로 지정되어 있다.
// 48은 숫자 0에 해당되는 코드값이고 57은 9에 해당되는 코드값이다.
} // if3 - 0에서 9 사이의 숫자인지 파악하는 if구문
int value = 6;
if((value % 2 == 0) | (value % 3 == 0)) {
// |는 원화표시 (\)를 시프트하면 나온다. (***)
// |는 또는(OR)이라는 의미를 가지고 있다.
// ||보다 |를 더 많이 사용해라
System.out.println("2 또는 3의 배수 이군요!");
} // if4 - int value가 2또는 3의 배수인지 확인하는 if구문
if((value%2 == 0 ) || (value%3 == 0 )) {
System.out.println("2 또는 3의 배수 이군요!!");
} //if5
} // main
} // end class
04. IF문의 활용2
public class Sample33 {
public static void main(String[] args) {
int value = 100;
// 문제 : value의 숫자는 50보다 크고 90보다 작은가?
if ((value > 50) & (value <90)) {
System.out.println("50보다 크고 90보다 작다!(참!)");
} else {System.out.println("50보다 크지 않고 90보다 작지 않다.(거짓!)");}
// ================================================================== 아니면 //
if (!((value>50) & (value < 90))) {
System.out.println("거짓입니다!");
}
} // main
} // end class
05. IF문의 활용3 - ' % (나머지) '
public class Sample34 {
public static void main (String[] args) {
// 문제 : 이 value의 변수값이 소수인지 판단하라!
// 1고 자신의 숫자로만 나누어서 판단하라!
int value = 100;
if((value%value == 0 ) & (value%1 == 0)) {
System.out.println("소수입니다!");
} // if
} // main
} // end class
06. 대입 연산자
public class Sample35 {
public static void main (String[] args) {
int result = 0;
result += 10;
// ----> result = result + 10;
System.out.println("1.result:"+result); // 1. result : 10로 출력
result -= 5;
// -----> result = result 5;
System.out.println("2.result:"+result); // 2. result :5로 출력
result *= 3;
// ------> result = result*3;
System.out.println("3.result:"+result); // 3. result : 15로 출력
result /= 5;
// -----> result = result/5;
System.out.println("4.result:"+result); // 4. result : 3로 출력
result %= 3;
// -----> result = result&3;
System.out.println("5.result:"+result); // 5. result : 0로 출력
// 대입 연산자는 가장 마지막에 이루어진다.
} // main
} // end class
07. 복합대입 연산자
public class Sample36 { // 복합대입연산자로 변환시키기!
public static void main (String[] args) {
// 문제 : 복합대입연산자로, result 변수 값을 1증가시키는 코드를 만들어라!
int result = 100;
// result = result + 1;
result +=1;
System.out.println("result:"+result);
} // main
} // end class
08. IF문 활용4 -1
public class sample37 {
public static void main(String[] atgs) {
int score = 93;
if(score >= 90) {
System.out.println("점수가 90점보다 큽니다!");
System.out.println("등급은 A입니다!!");
// 이 경우에는 실행문이 2개이기에 {} 생략이 불가능 하다.
// 실행문이 1개의 경우 생략은 가능하지만 if구분이 어려우니 생략하지 않는 것이 좋다.
// 실행문이 전혀 없을 때는 {}를 생략하고 ;를 붙여서 완성시킬 수 있다.
// ;; 는 pass의 의미이다. 아직 완성하지 못했거나 고민중이라는 의미이다.
// 아직 완성시키지 못했다면 차라리 {}를 생략하기 보다는 { ;; }으로 작성하는 것이 좋다.
} // if1
if(score < 90) {
System.out.println("점수가 90점보다 작습니다!");
System.out.println("등급은 B입니다!!");
} // if2
} // main
} // end class
09. IF문 활용4 - 2
public class Sample38 {
public static void main(String[] args) {
int score = 85;
// if - else 문 예제
if(score >= 90) { // 조건식이 true 이면...
System.out.println("점수가 90보다 큽니다!");
System.out.println("등급은 A입니다!");
} else { // 조건식이 false 이면...
System.out.println("점수가 90보다 작습니다!");
System.out.println("등급은 B입니다!");
} // if - else
} // main
} // end class
10. IF문 활용4 - 3
public class Sample39 {
public static void main (String[] args) {
int score = 75;
if(score >= 90) { // 90점 이상인 것들만 true로 걸러진다.
System.out.println("점수가 100-90점 사이입니다.");
System.out.println("등급은 A입니다.");
} else if(score >= 80){ // 나머지 중 80점 이상인 것들만 true로 걸러진다.
System.out.println("점수가 80-89점 사이입니다.");
System.out.println("등급은 B입니다.");
} else if(score >= 70) { // 나머지 중 70점 이상인 것들만 true로 걸러진다.
System.out.println("점수가 70-79점 사이입니다.");
System.out.println("등급은 C입니다.");
} else { // 마지막으로 남은것들을 실행시켜준다.
System.out.println("점수가 70점 미만입니다.");
System.out.println("등급은 D입니다.");
// 범위형성을 이렇게 자연스럽게 결정할 수 있게하여, 간단하게 구성해야 한다.
} // if - else if - else
} // main
} // end class
11. 무작위 난수 생성기
public class Sample40 { // 무작위 난수 생성하기 (****************)
public static void main (String[] args) {
// 주사위 놀이 : 무작위로 1~6까지의 주사위 눈의 숫자를 생성하여 조건문으로 판단. (*****)
int num1 = (int)(Math.random()*6)+1; // (*****)
// --> 무작위 난수 생성 : 1(offset), 6개(length) 정수 추출
// 난수(random number) : 무작위 수
// Math.random() : 0.0이상 1.0미만의 수를 생성한다.
// 0.0 <= Math.random() < 1.0
// 위의 범위를 이렇게 [0.0, 1.0) 표현하기도 한다.
// =====> 이러한 범위를 Half-Open이라고 부른다.
// (0.0)*6 <= Math.random()*6 < (1.0)*6
// 0.0 <= Math.random()*6 < 6.0
// 5.99999와 같이 실수가 나올 수 있으므로 강제형변환이 필요하다.
// (int)0.0 <= (int) (Math.random()*6) < (int)6.0
// (int)0 <= (int) (Math.random()*6) < (int)6
// (int)0+1 <= (int) (Math.random()*6)+1 < (int)6+1
// (int) 1 <= (int) (Math.random()*6)+1 < (int) 7
// (int) (Math.random()*6)+1에서 6은 length이고 1은 offset을 의미한다.
// 여기서 offset은 처음시작 값이고, length는 offset에서 가져오는 수의 갯수이다.
//로또번호 : 1(from) ~ 45(to)를 나올 수 있게 할 수 있을까? (*****)
int from = 1;
int to = 45;
int num = (int)(Math.random()*(to-from+1))+from;
// 이렇게 하면 length와 offset을 자동으로 나오게 할 수 있다!(***)
// * 뒤에는 length, 맨 끝의 +뒤에는 offset이라고 생각하면 편할것 같다.
System.out.println(num + "번이 나왔습니다!");
if(num1 ==1) {
System.out.println("1번이 나왔습니다.");
} else if(num1 == 2) {
System.out.println("2번이 나왔습니다.");
} else if(num1 == 3) {
System.out.println("3번이 나왔습니다.");
} else if(num1 == 4) {
System.out.println("4번이 나왔습니다.");
} else if (num1 == 5) {
System.out.println("5번이 나왔습니다.");
} else if (num1 == 6) {
System.out.println("6번이 나왔습니다.");
} // if - else if - else문
// else 대신 else if를 활용해도 괜찮다.
} // main
} // end class
12. 무작위 난수 생성기 2
public class Sample41 {
public static void main(String[] args) {
// 81-100 사이의 숫자
int to = 100;
int from = 81;
int score = (int)(Math.random()*(to-from+1)) + from; // 꼭 외워야 한다!!(*****)
System.out.println("점수는 " + score);
String grade;
if(score>=90) {
if(score>=95) {
grade = "A+";
} else {
grade = "A"; }
} else {
if(score >= 85) {
grade = "B+";
} else {
grade = "B";
}
} // if - else 안에 if-else가 중첩되어 있음을 볼 수 있다.
// else는 단 한번만 사용할 수 있다.
// if만 필수로 작성해야 하고 else는 필수가 아니다.
// 조건문은 중첩사용이 가능하다.
System.out.println("학점 : " + grade);
} // main
} // end class
13. 무작위 난수 응용 - 과제 (My.ver)
public class Sample42 {
public static void main(String[] args) { // 01. 과제 - 내가 코딩한 버젼
// 문제 : 로또 범위 내에서, 무작위 정수를 6개를 추출하고,
// 이 추출된 6개 번호가 아래 번호들과 일치해서, 1등인지 아닌지 판단하여
// 1등이면 1등, 아니면 꽝이라고 출력하시오!
// 1등 당첨번호 : 12 , 3 , 7 , 17 , 23 , 44
// 1) 과연 변수는 몇개가 필요하고 그 타입은 무엇으로 할까?
// 2) 추출된 6개의 번호를 어떻게 1등 번호와 비교할까?
// 만일 이전에 추출된 무작위 정수가 다시 나올 수도 있다.
// 이를, "복원추출"이라고 한다. 원래 로또는 같은 숫자가 2번 이상 나올 수 없다.
// 이를 "비복원 추출"이라고 한다. 그럼 어떻게 해결해야 될까?
int to = 45;
int from = 1;
int num1 = (int)(Math.random()*((to-from)+1)) + from;
int num2 = (int)(Math.random()*((to-from)+1)) + from;
if (num1 == num2) {
num2 = (int)(Math.random()*((to-from)+1)) + from; // if - num2 복원추출 해결
}
int num3 = (int)(Math.random()*((to-from)+1)) + from; // num1과 num2가 같지 않은 상태에서 3을 구한다.
if ( (num3 == num1) | (num3 == num2) ) {
num3 = (int)(Math.random()*((to-from)+1)) + from; // if - num3 복원추출 해결
}
int num4 = (int)(Math.random()*((to-from)+1))+ from; // 그 상태에서 num4를 구한다.
if ((num4 == num3) | (num4 == num2) | (num4 == num1)) {
num4 = (int)(Math.random()*((to-from)+1)) + from;
} // if - num4 복원추출 해결
int num5 = (int)(Math.random()*((to - from)+1)) + from; // 그 상태에서 num5를 구한다.
if ((num5 == num4) | (num5 == num3) | (num5 == num2) | (num5 ==num1)) {
num5 = (int)(Math.random()*((to-from)+1)) + from;
} // if - num5 복원추출 해결
int num6 = (int)(Math.random()*((to-from)+1)) + from; // 그 상태에서 num6를 구한다.
if ((num6 == num5) | (num6 == num4) | (num6 == num3) | (num6 == num2) | (num6 == num1)) {
num6 = (int)(Math.random()*((to-from)+1)) +from;
} // if - num6 복원추출 해결
// ===> 복원 추출 모두 헤결!
System.out.println("나의 번호는 " + num1 + ", " + num2 + ", " + num3 + ", " + num4 + ", " + num5 + ", " + num6);
// 나의 번호 확인해보기 -> 이제 1등인지 아닌지 확인해 보는 작업으로 넘어가 보자
//로또 1등 번호는 12 , 3 , 7 , 17 , 23 , 44다.
if(( (num1 == 12) | (num1 == 3) | (num1 == 7) | (num1 == 17) | (num1 == 23) | (num1 ==44) ) &
( (num2 == 12) | (num2 == 3) | (num2 == 7) | (num2 == 17) | (num2 == 23) | (num2 ==44) ) &
( (num3 == 12) | (num3 == 3) | (num3 == 7) | (num3 == 17) | (num3 == 23) | (num3 ==44) ) &
( (num4 == 12) | (num4 == 3) | (num4 == 7) | (num4 == 17) | (num4 == 23) | (num4 ==44) ) &
( (num5 == 12) | (num5 == 3) | (num5 == 7) | (num5 == 17) | (num5 == 23) | (num5 ==44) ) &
( (num6 == 12) | (num6 == 3) | (num6 == 7) | (num6 == 17) | (num6 == 23) | (num6 ==44) )
){
System.out.println("축하합니다!! 1등입니다!");
} else {
System.out.println("꽝입니다ㅠㅠ");
} // if-else구문으로
} // main
} // end class
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 07일차 - 참조타입 (0) | 2022.03.04 |
---|---|
KH 06일차 - 조건문과 반복문 (0) | 2022.03.03 |
KH 04일차 - 타입변환 및 연산 (0) | 2022.02.28 |
KH 03일차 - 변수 (0) | 2022.02.25 |
KH 01 - 02 일차 (0) | 2022.02.24 |