-
TIL #2 - Java 기초 등프로그래밍/TIL(국비과정) 2020. 3. 26. 23:49
# 비트 연산자
잘 쓰이는 연산자는 아니라고 한다.
- &, |, ^, ~, <<, >>, >>>
- & (AND) : 두 비트의 같은 자리수가 1이면 1, 그 외에는 0
- | (OR) : 두 비트의 같은 자리수가 하나라도 1이면 1, 둘 다 0 일 때만 0
- ^ (XOR) : 두 비트의 같은 자리수가 다르면 1 같으면 0
- ~ : 한 비트에 대해 해당 자리수의 값을 반대값으로 바꿔준다 ( 1 -> 0, 0 -> 1)
- << : 오른쪽에 나온 숫자만큼 비트를 왼쪽이동
- >> : 오른쪽에 나온 숫자만큼 비트를 오른쪽이동
- >>> : 오른쪽에 나온 숫자만큼 비트를 오른쪽으로 이동하고 왼쪽에는 무조건 0을 붙인다.
int number1 = 10; // 0x0000 1010 int number2 = 21; // 0x0000 0101
차례로 연산을 해본다.
1. AND 연산
0000 1010
0001 0101
------------
0000 0000
2. OR 연산
0000 1010
0001 0101
-----------
0001 1111
3. XOR 연산
0000 1010
0001 0101
------------
0001 1111
4. ~연산 ( 다 반대로 바꿔준다)
0000 1010
-----------
1111 0101
5. << 연산 (나온 숫자만큼 왼쪽으로 이동 : 오른쪽으로 00을 붙인다)
0000 1010 << 2
00 1010 00 ( 오른쪽에 붙여준 만큼 왼쪽은 지운다)
= 0010 1000
왼쪽 시프트연산은 생각해보면 사실 결과값 예상이 쉽다.
10진법으로 생각해보면,
숫자 6을 왼쪽으로 2자리 옮기고 뒤에 0을 붙이면?
6*10*10 -> 600
2진법의 경우에는 옮기는 자리수만큼 2를 곱해주면 된다.
6. >> 연산
0000 1010 >> 2
000000 1010 (왼쪽에 0을 붙여준다)
= 0000 0010
오른쪽 이동의 경우에는 특징이 있다.
>> 의 경우 부호유지가 된다.
1000 1000 -> -128 + 8 -> -120
1000 1000 >> 2 의 경우
맨 앞자리가 1, 즉 - 라는 의미이므로
오른쪽 이동을 할 때 0 대신 1이 붙는다.
11 1000 1000
= 11 1000 10
= 1110 0010 -> -128 + 64 + 32 + 2 : -30
7. >>>연산
>>>의 경우에는 부호를 무시하고 무조건 0을 붙인다.
1000 1000 >>> 2
00 1000 1000
= 0010 0010 -> 1073741794
# 입력과 출력
사실 입력과 출력은 키보드와 화면 뿐 아니라 다른 곳에도 적용이 가능하다
입력 자체를 본다면 우린 지금 키보드 입력만 사용하고 있지만
나중에는 어딘가 파일에서 입력을 받아올 수도, 어딘가에서 데이터를 읽어올 수도 있다.
- 화면에 출력하는 방법 3가지
print, printf, println
아래는 사용 예시이다.
public class Ex02 { // 과목수 private final static int NUMBER_OF_SUBJECT = 5; public static void main(String[] args) { /* * 자바에서 기본적으로 콘솔에 메세지를 출력하는 방법은 크게 3가지 * 1. print * 괄호 안의 내용을 출력한다. * 2. printf * print in format의 줄임말 * 괄호 안의 내용을 '형식에 맞추어' 출력 * 3. println * print a line의 줄임말 * 괄호 안의 내용을 한줄에 출력 * */ System.out.print("abc"); // print()는 커서(다음 출력위치)를 옮기지 않는다. // 즉 괄호 안의 내용 출력이 끝나면 그 다음 출력할 것은 무조건 바로 뒤다 (줄바꿈 없음) System.out.println("abc"); // println()의 경우에는 커서를 무조건 다음 줄의 맨 처음으로 옮긴다 (줄바꿈 함) // 즉 다음 출력 내용은 다음 줄의 바로 맨 처음이 된다. System.out.printf("abc"); // printf의 경우에는 사실 이렇게 쓰는 것이 아니지만 // printf도 print 처럼 커서를 무조건 바로 다음칸으로 옮긴다 (줄바꿈 없음) System.out.println("출력 끝"); /* * printf()에 대해 좀 더 공부해 보자 * printf의 경우에는 사실 우리의 메시지를 우리가 원하는 형식으로 출력을 하게 할당해주는 개념이다. * * * 공백 문자 * 만약 우리가 print나 printf를 써야만 하고 * 만약 커서의 위치를 다음 줄이나 탭을 하나 넣어야할 땐? * 특수한 문자인 \n(줄바꿈, new line), \t(탭)를 통해서 공백을 넣어주게 된다. */ System.out.print("abc\t"); System.out.print("bcd\n"); int number = 41; // 1. 10진법 ('d'ecimal) : 대쉬가 들어가면 10과 관련된 무엇이겠구나 하고 생각 // -A. 10진법 그대로 표시하라 System.out.printf("1-A. %d\n", number); // -B. 10진법을 오른쪽 정렬한 6자리로 표시해라 System.out.printf("1-B. %6d\n", number); // 단, 모든 자리수 설정은 만약 할당 받은 메세지가 더 길면 무시된다. //System.out.printf("1-B. %6d\n", 1234567); // -B. 10진법을 왼쪽 정렬한 6자리로 표시해라 System.out.printf("1-C. %-6d\n", number); // -D. 10진법을 오른쪽 정렬한 6자리로 표시하고 왼쪽에 빈공간이 있으면 0으로 채워라 System.out.printf("1-D. %06d\n", number); // -E. ERROR // 000041 : 이건 결국 41 // 410000 : 이건 41이라고 할 수가 없다. 전혀 다른 숫자가 되기 때문에 에러가 난다. // 뒤에 0이 붙는 것은 안된다. //System.out.printf("1-E. %-06d\n", number); // 2. 16진법 (he'x'adecimal) // -A. 16진법으로 숫자를 그대로 표시하라 number = 43; System.out.printf("2-A. %x\n", number); // -B. 16진법으로 숫자를 그대로 표시하되 알파벳이 있으면 대문자로 System.out.printf("2-B. %X\n", number); // -C. 16진법으로 오른쪽 정렬해서 6자리로 표시하고 소문자로 표시 System.out.printf("2-C. %6x\n", number); // -D. 16진법으로 오른쪽 정렬한 8자리로 표시하고 왼쪽에 빈자리는 0으로 채우기 대문자로 표시 System.out.printf("2-D. %08X\n", number); // 3. 논리형 ('b'oolean) // -A. 소문자로 true/ false 출력 System.out.printf("3-A, %b\n", true); System.out.printf("3-A, %b\n", false); System.out.printf("3-A, %b\n", number); // 값이 존재하냐 하지 않냐 이기 때문에 true System.out.printf("3-A, %b\n", null); // null인 경우 값이 존재하지 않는 것이기 때문에 false // -B. 대문자로 출력 System.out.printf("3-B, %B\n", true); System.out.printf("3-B, %B\n", false); // 4. 문자열('S'tring) // -A. 스트링의 내용을 그대로 출력하라 String str = "abCd"; System.out.printf("4-A, %s\n", str); // -B. 스트링의 내용을 소문자를 대문자로 바꿔서 출력 System.out.printf("4-B, %S\n", str); double d = 3.141592; // 5. 실수('f'loat) // -A. 실수를 그대로 출력하라 System.out.printf("5-A, %f\n", d); // 소수점까지 포함하기 때문에 8자리 숫자이다 // -B. 실수를 소숫점 3번째 자리까지 출력 System.out.printf("5-B, %.3f\n", d); // -C. 실수를 5자리로 출력 System.out.printf("5-C, %5f\n", d); // 출력하고자 하는 것에 비해 d의 자리수가 더 많기 때문에 무시하고 다 출력한다. // -D. 실수를 10자리로 출력 System.out.printf("5-D, %10f\n", d); // -E. 실수를 5자리로 출력하는데 그 중 소수점은 2자리까지만 출력 System.out.printf("5-E, %5.2f\n", d); // 이러한 %문자는 우리가 여러개를 섞어줄 수 있다. String name = "양아무개"; int age = 15; int korean = 89; int math = 93; int english = 78; int history = 80; int programming = 90; int sum = korean + math + english + history + programming; double avg = sum/(NUMBER_OF_SUBJECT*1.0); // 현재상태에서 ERROR // 현재 NUMBER_OF_SUBJECT가 static 밖에 있기 때문이다. 고로 static을 붙여준다 System.out.println("===점수표==="); System.out.printf("이름: %s, 나이:%02d세 " + "\n국어:%02d점, 영어 :%02d점, 수학:%02d점, 역사: %02d점, 프로그래밍: %02d점 " + "\n총점: %03d점, 평균:%05.2f점", name, age, korean, english, math, history, programming, sum, avg, args); } }
1. print
괄호 안의 내용을 출력한다.
줄바꿈이 없다.
2. printf
print in format의 줄임말
괄호 안의 내용을 '형식에 맞추어' 출력한다.
줄바꿈이 없다.
3. println
print a line의 줄임말
괄호 안의 내용을 한 줄에 출력한다.
줄바꿈이 있다.
- printf() 에 대해
printf의 경우에는 사실 우리의 메세지를 우리가 원하는 형식으로 출력을 하게 할당해주는 개념이다.
위의 코드에서 다시 보자
int number = 41; // 1. 10진법 ('d'ecimal) : 대쉬가 들어가면 10과 관련된 무엇이겠구나 하고 생각 // -A. 10진법 그대로 표시하라 System.out.printf("1-A. %d\n", number); // -B. 10진법을 오른쪽 정렬한 6자리로 표시해라 System.out.printf("1-B. %6d\n", number); // 단, 모든 자리수 설정은 만약 할당 받은 메세지가 더 길면 무시된다. //System.out.printf("1-B. %6d\n", 1234567); // -B. 10진법을 왼쪽 정렬한 6자리로 표시해라 System.out.printf("1-C. %-6d\n", number); // -D. 10진법을 오른쪽 정렬한 6자리로 표시하고 왼쪽에 빈공간이 있으면 0으로 채워라 System.out.printf("1-D. %06d\n", number); // -E. ERROR // 000041 : 이건 결국 41 // 410000 : 이건 41이라고 할 수가 없다. 전혀 다른 숫자가 되기 때문에 에러가 난다. // 뒤에 0이 붙는 것은 안된다. //System.out.printf("1-E. %-06d\n", number); // 2. 16진법 (he'x'adecimal) // -A. 16진법으로 숫자를 그대로 표시하라 number = 43; System.out.printf("2-A. %x\n", number); // -B. 16진법으로 숫자를 그대로 표시하되 알파벳이 있으면 대문자로 System.out.printf("2-B. %X\n", number); // -C. 16진법으로 오른쪽 정렬해서 6자리로 표시하고 소문자로 표시 System.out.printf("2-C. %6x\n", number); // -D. 16진법으로 오른쪽 정렬한 8자리로 표시하고 왼쪽에 빈자리는 0으로 채우기 대문자로 표시 System.out.printf("2-D. %08X\n", number); // 3. 논리형 ('b'oolean) // -A. 소문자로 true/ false 출력 System.out.printf("3-A, %b\n", true); System.out.printf("3-A, %b\n", false); System.out.printf("3-A, %b\n", number); // 값이 존재하냐 하지 않냐 이기 때문에 true System.out.printf("3-A, %b\n", null); // null인 경우 값이 존재하지 않는 것이기 때문에 false // -B. 대문자로 출력 System.out.printf("3-B, %B\n", true); System.out.printf("3-B, %B\n", false); // 4. 문자열('S'tring) // -A. 스트링의 내용을 그대로 출력하라 String str = "abCd"; System.out.printf("4-A, %s\n", str); // -B. 스트링의 내용을 소문자를 대문자로 바꿔서 출력 System.out.printf("4-B, %S\n", str); double d = 3.141592; // 5. 실수('f'loat) // -A. 실수를 그대로 출력하라 System.out.printf("5-A, %f\n", d); // 소수점까지 포함하기 때문에 8자리 숫자이다 // -B. 실수를 소숫점 3번째 자리까지 출력 System.out.printf("5-B, %.3f\n", d); // -C. 실수를 5자리로 출력 System.out.printf("5-C, %5f\n", d); // 출력하고자 하는 것에 비해 d의 자리수가 더 많기 때문에 무시하고 다 출력한다. // -D. 실수를 10자리로 출력 System.out.printf("5-D, %10f\n", d); // -E. 실수를 5자리로 출력하는데 그 중 소수점은 2자리까지만 출력 System.out.printf("5-E, %5.2f\n", d);
# 키보드 입력받기
Scanner 클래스를 이용해 키보드의 입력을 받을 수 있다.
그런데 Scanner 클래스를 사용해 입력을 받다보면 그 입력받은 값들은 각각 버퍼메모리에 저장이 되게 된다.
버퍼메모리에 일단 데이터를 넣고 거기서 차례대로 읽어와 저장을 하는데,
앞서 데이터를 받고 받다 보면 \n이 남아서 줄바꿈이 이상하게 되는 등 원하지 않는 동작들이 일어나는 수가 있다.
그런 경우에는 단독으로 scanner를 한 번 더 사용해서 버퍼메모리를 비워준 후 다시 입력을 받는다.
import java.util.Scanner; public class Ex03 { public static void main(String[] args) { // 스캐너 객체 선언 Scanner scan = new Scanner(System.in); System.out.print("숫자를 입력해주세요 : "); int number = scan.nextInt(); System.out.println("사용자가 입력한 숫자는 " + number + " 입니다"); System.out.println("실수를 입력해주세요 : "); double d = scan.nextDouble(); System.out.println("사용자가 입력한 실수는 " + d + " 입니다"); System.out.print("이름을 입력해 주세요 : "); scan.nextLine(); // 버퍼메모리 한 번 비워주기 작업 String name = scan.nextLine(); // 그 다음 다시 입력받기 System.out.println("사용자가 입력한 이름은 " + name + " 입니다"); } }
# 조건문
조건문은 조건이 맞으면 실행되는 코드이다.
조건문은 true/ false가 나오는 논리형 값에 대해서
true 면 실행, false면 실행하지 않는다.
조건문은 크게 3가지 종류가 있다.
1. if문
2. switch 문
3. 조건연산자
2, 3 번은 좀 제한적인 조건에서 쓰이게 되지만 무언가 조건에 따라 실행을 해야한다면 주로 if문이 사용된다.
더보기if(조건){
참일 때 실행할 코드
}
if 문 조건식은 최종 결과값이 true 혹은 false가 나오기만 하면 된다.
즉, 여러 조건식을 묶어서 논리연산자를 넣어 그 최종값에 따라 실행 여부를 정하게 만들 수도 있다.
아래와 같이 0보다 크고 10보다 작은 숫자를 판정하는 if문을 만들 수 있다.
import java.util.Scanner; public class Ex07 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("0부터 10사이의 숫자를 입력해주세요 : "); int number = scan.nextInt(); if(number >= 0 && number <= 10) { System.out.println("올바른 숫자를 입력하셨습니다."); }else { System.out.println("범위를 벗어난 숫자입니다."); } scan.close(); } }
#if-else
처음 if 문의 조건식이 false가 나오면 무조건 else의 코드 블락이 실행된다.
public class Ex09 { public static void main(String[] args) { int number = 15; if(number % 2 == 0) { System.out.println("짝수"); }else { System.out.println("홀수"); } } }
위의 코드는 number가 2로 나눴을 때 나머지가 0이 되면 짝수, 그렇지 않으면 홀수가 출력되는 코드이다.
#if-else if
else if의 경우엔 조건이 여러개인 경우 사용할 수 있다.
public class Ex10 { public static void main(String[] args) { int number = 4; if(number == 1) { System.out.println("1 입니다"); }else if(number == 2) { System.out.println("2 입니다"); }else if(number == 3) { System.out.println("3입니다"); }else if(number == 4) { System.out.println("4입니다"); }else { System.out.println("그 외의 숫자입니다. "); } } }
'프로그래밍 > TIL(국비과정)' 카테고리의 다른 글
TIL #6 - 배열 활용 (1) (0) 2020.04.01 TIL #5 - 배열 (0) 2020.03.31 TIL #4 - 메소드, 배열 등 (0) 2020.03.30 TIL #3 - Java 기초 등 (0) 2020.03.28 TIL #1 - Java 설치 및 기초 등 (0) 2020.03.26