ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.