[JAVA] 기초 문법 Practice2

JAVA 기초이지만 문법을 기억하고 응용하는 것이 어렵다. 아직 많이 헷갈리지만 꾸준히 복습해서 숙달하려고한다.어렵거나 중요한 패턴은 그냥 외우는 것도 좋을 것 같다. 화이팅👍

더보기

기본 자료형 -> 참조 자료형 => new 해당클래스명 -> 객체
             스택 메모리 => 힙 메모리(new 사용 시 힙 메모리에 저장)

비트 연산자의 활용
- XOR과 AND를 조합해 덧셈, 뺄셈으로 활용
- 시프트 연산자를 활용해 곱셈, 나눗셈으로 활용
- 이런식으로 컴퓨터 연산에서 비트연산자가 활용된다는 것 정도만 숙지

⭐제어문
- 프로그래밍의 존재 이유와 목적을 꼽으라고 한다면 사용자의 input에 따라 달라지는 output을 자동화 하기 위함이라 할 수 있다.
    - 이를 위해 필요한 것은 ~한 input인 경우, ~한 output을 만들어 내는 조건문
    - 그것이 반복되는 연산과정을 자동화 하기 위한 반복문
- 조건문과 반복문을 포괄하는 명칭으로 프로그램의 순차적인 흐름을 제어하므로 이때 사용되는 명령문을 제어문이라함
- 제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있다.

⭐제어문 - 조건문
- if 문
- if / else 문
- if / else if / else 문
- Switch 문

⭐삼항연산자
- 문법
    - 결과값 = 조건식 ? 반환값1 : 반환값2
- 물음표(?) 앞에 조건식에 따라 결과값이 참(true)이면 반환값1을 반환하고, 결과값이 거짓(false)이면 반환값2를 반환
- 자바에서는 간단한 if/else 문은 삼항 연산자를 이용하여 간결하게 표현

Switch문
- 기본 문법
    - switch (input) {
        case 값1:
            조건 값이 값1일 때 실행하고자 하는 명령문;
            break; //switch문을 빠져나가는 문구
        case 값2:
            조건 값이 값2일 때 실행하고자 하는 명령문;
            break;
            ...
        default:
            조건 값이 어떠한 case 절에도 해당하지 않을 때 실행하고자 하는 명령문;
            break;
    }
    - if / else if / else를 사용해도 동일하나, 가독성이 졸고 특정한 조건의 경우가 열거형으로 몇가지로 정해져 있을 때 주로 사용
    - 단점 : 범위 지정이 불가하다.
    - 그렇기 때문에 실제적인 값으로 비교 가능한 input에 사용한다.

⭐제어문 - 반복문(loop)
- while 문
- do / while 문
- for 문
- Enhanced for 문

⭐while 문
- while (조건식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}
- while 문은 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복
    - while 문 내부에 조건을 false로 만드는 로직이 존재하지 않을 경우엔 프로그램이 무한 루프(infinite loop)
    - 무한 loop가 default

do / while 문
- do / while 문은 일단 루프를 한 번 실행한 후에 조건식을 검사
- do{
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while (조건식);
- do / while은 초기식 검증을 위해서 사용

⭐for 문
- for 문은 while 문과는 달리 자체적으로 초기식, 조건식, 증감식을 모두 포함
- 반복문이 종료가 될 수 있도록 기본설계가 되어 있다는 점에서 while문과의 차이
- for (초기식; 조건식; 증감식){
}

 break, continue

⭐Enhanced for문
- 배열과 컬렉션에서 매우 많이 사용되는 문법으로서 index로 배열이나 리스트 등을 가져오는 것이 아닌, 배열의 값 그대로를 가져오는 방식
- 기본 문법
    - for(타입 변수이름 : 배열이나 컬렉션이름){
        배열의 길이만큼 반복적으로 실행하고자 하는 명령문
    }
- Enhanced for 문은 명시한 배열이나 컬렉션의 길이만큼 반복되어 실행
- Enhanced for 문은 요소를 참조할 때만 사용하는 것
    - 요소의 값을 변경하는 작업에는 불가
    - 배열 요소는 배열 요소 그 자체가 아닌 배열 요소의 복사본이기 때문

기본형 데이터는 스택메모리에 그 값을 저장
참조형 데이터는 힙메모리에 그 값을 저장하고, 스택메모리에는 힙 메모리의 주소를 저장한다.

⭐Java의 메모리 구조
- 배열 출력시 toString()을 써야하는 이유
    - call by reference, call by value
- 메소드 영역
    - 빌드되어 만들어진 소스코드(클래스 등), 정적변수(static)등이 저장되어 코드 전역에서 사용 가능한 공간
- ⭐스택 영역
    - 지역변수, 매개변수, 기본형 자료, 객체의 주소값 등을 저장
    - 기본형 변수는 스택 영역에 저장
- ⭐힙 영역
    - Heap 메모리는 애플리케이션 실행 동안 생성되는 모든 클래스 인스턴스와 배열을 저장하는 곳
    - 참조형 변수인 객체 변수 등은 스택메모리에는 힙메모리의 주소만 저장해두고 실질적인 값은 힙 메모리에 저장

지역변수, 전역변수
- 자바 변수의 유효범위
    - 자바에서의 if문 블록, for문 블록 등 안에서 선언된 변수는 블록 밖에서 참고할 수가 없고 해당 블록내에서만 유효
- 지역변수 : {}로 구분되는 영역에서만 유효한 변수
    - 현재 단계에서는 {}열고, 닫는 영역까지만 변수의 범위가 유효하다는 것 숙지
- 전역변수 : 클래스 전역에 접근할 수 있는 변수

⭐다중 반복문
- 반복문 안에 반복문

public class C03Operator {
    public static void main(String[] args) {
    
//        0000101       0000110
        int n3 = 5; int n4 = 6;
        
//        비트연산자 : &, 각자리의수가 모두 1일경우에만 1
        System.out.println(n3 & n4); //4 => 0000100
        
//        비트연산자 : |, 각자리의수가 하나라도 1일경우는 1
        System.out.println(n3 | n4); //7 => 0000111
        
//        비트연산자 : ^, 각자리의수가 일치하지 않은 경우에
        System.out.println(n3 ^ n4); //3 => 0000011
        
//        ~ : not연산, 각자리마다 반대의 숫자 반환
        System.out.println(~ n3); //첫째자리가 음/양인데, 음으로 변환
        
//        시프트연산자 : <<, >> = 곱셈과 나눗셈의 효과가 발생
        System.out.println(n3 << 1); //0001010  2의 1승만큼 곱셈
        System.out.println(n3 << 2); //0010100  2의 2승만큼 곱셈


        int a = 13; //00001101
        int b = 9;  //00001001
        while(b!=0) { // b가 0일때 while문 종료
            int same_index = a & b; //and연산으로 구한 carry 생성
            a = a ^ b;  //XOR 연산으로 구한 비트값 a에 할당
            b = same_index << 1;
        }

//        첫번째 반복
//        sameindex : 1001
//        a : 00100
//        b : 10010

//        두번째 반복
//        sameindex : 00000
//        a : 10110 => 22
        System.out.println(a);
    }
}

 

import java.lang.invoke.SwitchPoint;
import java.util.Scanner;
import java.util.SplittableRandom;

public class C04IfStatements {
    public static void main(String[] args) {

//        비밀번호 => 1234
//        스캐너를 써서 사용자의 input int로 받아서 만약에 비밀번호와 사용자의 input 일치하면 문이열렸습니다.
//        일치하지 않으면 비밀번호가 틀렸습니다 출력

//        도어락키 if문 예제
//        0234 -> 00234 = int로 받으면 비밀번호가 맞아버리기 때문에 String으로 받아야 한다.
        String pw = "0234"; //String의 기능을 pw가 가지고 있는 의미(복사본의 의미)
        System.out.println("비밀번호를 입력해주세요.");
        Scanner Scan1 = new Scanner(System.in);
        String input1 = Scan1.nextLine();

        if (pw.equals(input)){  //문자열 비교시 == 사용금지, .equals 사용.
            System.out.println("문이열렸습니다.");
        } else {
            System.out.println("비밀번호가 틀렸습니다.");
        }

//        묵시적 타입변환, 각 문자가 숫자를 가지고 있다.
//        a : 97, A : 65
//        사용자한테 알파벳을 아무거나 입력받고, 그 알파벳이 대문자인지 소문자인지 판별
        Scanner Scan2 = new Scanner(System.in);
        System.out.println("알파벳을 입력해주세요");
        char input2 = Scan2.nextLine().charAt(0);

        if (input >= 'a' && input <= 'z') {
            System.out.println("소문자입니다.");
        }else if (input > 'A' && input < 'Z') {
            System.out.println("대문자입니다.");
        }else {
            System.out.println("알파벳이 아닙니다.");
        }

//        버스카드 예제
//        내 돈이 얼마있는지를 입력
//        버스요금이 1500이다.
//        돈이 더 적으면 탑승불가, 돈이 더 많으면 정상처리 출력.
//        도난여부 boolean 설정(입력X)
        int myMoney = 10000;
        boolean isStolen = false;
        System.out.println("도난카드입니까? 예/아니오로 대답하시오");
        Scanner sc = new Scanner(System.in);
        if(sc.nextLine().equals("예")){
            isStolen = true;
        }

        if (myMoney < 1500 || isStolen == true) {
            System.out.println("탑승불가입니다.");
        } else {
            System.out.println("정상 탑승되었습니다.");
        }

        if (myMoney >= 1500 && isStolen == false) {
            System.out.println("정상 탑승되었습니다.");
        } else {
            System.out.println("탑승불가입니다.");
        }

//        삼항연산자
//        도어락키 if문 예제
        String pw = "0234";
        System.out.println("비밀번호를 입력해주세요.");
        Scanner Scan1 = new Scanner(System.in);
        String input1 = Scan1.nextLine();
        String result = pw.equals(input1) ? "문이 열렸습니다." : "비밀번호가 틀렸습니다."; //결과값 = 조건식 ? 반환값1 : 반환값2
        System.out.println(result);
        if (pw.equals(input1)){  //문자열 비교시 == 사용금지, .equals 사용.
            System.out.println("문이열렸습니다.");
        } else {
            System.out.println("비밀번호가 틀렸습니다.");
        }


//        myMoney = 10000
//        택시요금 : 10000원
//        버스요금 : 3000원
//        킥보드 : 2000원
//        걸어가기 : 0원

        int myMoney = 10000;
        int texyFee = 10000;
        int busFee = 3000;
        int KickBoardFee = 2000;

        if(myMoney >= texyFee) { // if, else if는 서로 의존적
            System.out.println("택시타시는걸 추천드립니다.");
        }else if(myMoney >= busFee) {
            System.out.println("버스타시는걸 추천드립니다.");
        }else if(myMoney >= KickBoardFee) {
            System.out.println("킥보드타시는걸 추천드립니다.");
        }else {
            System.out.println("걸어가세요.");
        }

        if(myMoney >= texyFee) { // if는 독립적이어서 범위를 정확히 명시해주어야 한다.
            System.out.println("택시타시는걸 추천드립니다.");
        }if(myMoney < texyFee && myMoney >= busFee) {
            System.out.println("버스타시는걸 추천드립니다.");
        }if(myMoney < busFee && myMoney >= KickBoardFee) {
            System.out.println("킥보드타시는걸 추천드립니다.");
        }if(myMoney < KickBoardFee) {
            System.out.println("걸어가세요.");
        }

//        Switch 고객센터 출력 예제
//        원하시는 번호를 입력해주세요
//        1. 대출서비스입니다., 2. 예금, 3. 적금
//        0.상담사 연결입니다., 그외 : 잘못누르셨습니다.
        System.out.println("원하시는 번호를 입력해주세요");
        Scanner Scan4 = new Scanner(System.in);
        int input4 = Scan4.nextInt();
        switch (input4) {
            case 1:
                System.out.println("대출서비스 입니다.");
                break;
            case 2:
                System.out.println("예금서비스");
                break;
            case 3:
                System.out.println("적금서비스");
                break;
            case 0:
                System.out.println("상담사 연결입니다.");
                break;
            default:
                System.out.println("잘못누르셨습니다.");
                break;
        }
    }
}

 

import java.util.Arrays;
import java.util.Scanner;

public class C05LoopStatements {
    public static void main(String[] args) {

//        while문 사용해서 2~10까지 출력
        int n = 2;
        while(n < 11) {
            System.out.println(n);
            n ++;
        }

    while(true) { // while문으로 감싸면 무한으로 구구단 출력 가능
        Scanner sc = new Scanner(System.in);
        System.out.println("구구단 단수를 입력해주세요");
        int input = sc.nextInt();
        int n = 1;
        while (n < 10) {
            System.out.println(input + " X " + n + " = " + input * n);
            n++;
        }
    }
//        System.out.println(input + " X " + 1 + " = " + input*1);
//        System.out.println(input + " X " + 2 + " = " + input*2);
//        System.out.println(input + " X " + 3 + " = " + input*3);
//        System.out.println(input + " X " + 4 + " = " + input*4);
//        System.out.println(input + " X " + 5 + " = " + input*5);
//        System.out.println(input + " X " + 6 + " = " + input*6);
//        System.out.println(input + " X " + 7 + " = " + input*7);
//        System.out.println(input + " X " + 8 + " = " + input*8);
//        System.out.println(input + " X " + 9 + " = " + input*9);

//        도어락키 if문 예제 : 비밀번호를 맞추면 반복이 종료되고, 그렇지 않으면 계속적으로 다시 질문
//        최대 5번까지만 비밀번호 입력가능하도록 => 입력횟수를 초과했습니다 라는 문구
        int a = 0;
        while(true) {
            String pw = "0234";
            System.out.println("비밀번호를 입력해주세요.");
            Scanner Scan1 = new Scanner(System.in);
            String input1 = Scan1.nextLine();
            if (pw.equals(input1)) {
                System.out.println("문이 열렸습니다.");
                break;
            } else{
                System.out.println("비밀번호가 틀렸습니다.");
            }
            a++;
            if(a==5) {
                System.out.println("입력횟수를 초과했습니다.");
                break;
            }
        }

//        do while문 사용해서 2~10까지 출력
        int n = 2;
        do {
            n ++;
            System.out.println(n);
        } while(n < 11);

//        for문을 통해 2~10까지 출력
        for(int a = 2; a < 11; a++){
            System.out.println(a);
        }

//        for, continue를 사용해서 홀수만 출력되도록(1~10까지 수 중에)
        for(int a = 1; a < 11; a++){
            if(a%2 == 0){
                continue; //continue를 만나면 위로 올라가서 if문 다시실행
            }
            System.out.println(a);
        }

//        배열과 enhance for문
        int[] myArr = {1,5,7,9,10};
//        일반 for문
        for(int i=0; i<5; i++){
            System.out.println(myArr[i]);
        }

//        enhance for문
        for(int a : myArr){
            System.out.println(a);
        }

//        일반for문을 통해 myArr의 값에 10씩 더한 뒤에 출력.
        for(int i = 0; i< myArr.length; i++){
            myArr[i] += 10;
        }
        System.out.println(Arrays.toString(myArr));

//        enhanced for문을 통해 myArr의 값에 10씩 더한 뒤에 출력.
//        enhanced for문으로는 값 변경이 불가능 하다. 출력 시 값에 10씩 더해지지 않음.
//        배열의 조회 및 합계에 자주 사용
        for(int a : myArr){
            a += 10;
        }
        System.out.println(Arrays.toString(myArr));

//        배열의 합계에 사용시 간단하게 사용가능
        int sum = 0;
        for(int a : myArr){
            sum += a;
        }
        System.out.println(sum);

//        자바 변수의 유효범위 : { }
        int num = 10;
        if(num > 1){
            int abc = 20;
            num = 20;
        }
        System.out.println(num); // if문 밖에서 선언된 변수값을 if안에서 접근하여 변경하는 것은 가능.
        System.out.println(abc); // if문 안에서 정의된 변수는 밖에서 인지 불가

        for(int n = 2; n < 10; n++){
            System.out.println(n + "단입니다.");

            for(int i = 1; i < 10; i++){
                System.out.println(n + " X " + i + " = " + n*i);
            }
        }

//        2중 for문을 통해 배열접근
        int[][] arr = {{1,2,3,4}, {5,6,7,8}};
        for(int i = 0; i< arr.length; i++){
            for(int a = 0; a< arr[i].length; a++){
                System.out.println(arr[i][a]);
            }
        }
    }
}

 

import java.util.Scanner;

public class C05LoopPractice {
    public static void main(String[] args) {
    
//        짝수의 합 계산하기
//        1~20까지 짝수의 합 출력
        int result =0;
        for(int a = 1; a <=20; a ++){
            if(a%2 == 0){
                result += a;
            }
        }
        System.out.println(result);

//        숫자 뒤집기
        int num = 1234;
        int result = 0;
        while(true){
            int temp = num % 10;
            result = result*10 + temp;
            num /= 10;
            if(num==0){
                break;
            }
        }
        System.out.println(result);

//        최대공약수 구하기
        int a = 24; int b = 36;
        int num = a > b ? b : a;
        int maxNum = 0;
        for(int i=1; i<=num; i++){
            if(a % i == 0 && b % i == 0){
                maxNum = i;
            }
        }
        System.out.println(maxNum);

        int minNum = a/maxNum * b/maxNum * maxNum;
        System.out.println(minNum);
    }
}