넷째 날

정혅·2024년 2월 8일

더 조은 아카데미

목록 보기
5/76

Switch case문 - break/default;

switch case문 예시

import java.util.Scanner;
class SwitchT1{
    public static void main(String[]args){
        int lunch = 0;
        Scanner sc = new Scanner(System.in);

        System.out.println("lunch");
        System.out.println("1. 햄버거");
        System.out.println("2. 피자");
        System.out.println("3. 잔치국수");
        System.out.println("4. 국밥");
        System.out.println("음식을 고르세요: ");
        lunch = sc.nextInt();

        switch(lunch){

        case 1:
            System.out.println("당신은 햄버거를 선택하셨습니다.");
            break;
        case 2:
            System.out.println("당신은 피자를 선택하셨습니다.");
            break;
        case 3:
            System.out.println("당신은 잔치국수를 선택하셨습니다.");
            break;
        case 4:
            System.out.println("당신은 국밥을 선택하셨습니다.");
            break;
        default:
            System.out.println("당신은 잘못 선택하셨습니다.");
            //break; - default의 위치는 마지막이기때문에 굳이 break쓸 필
        }    
    }
}
  • break문은 문장 사이사이마다 꼭 있어야 하는것은 아니다.

    • case 1 과 2를 함께 출력하고 싶다면 break;를 넣지않으면 된다.

    • break;문이 없으면 지정된 case 밑으로 쭉 이어져 출력된다.

switch case문 > if

import java.util.Scanner;
class SwitchT1{
    public static void main(String[]args){
        int lunch = 0;
        Scanner sc = new Scanner(System.in);

        System.out.println("lunch");
        System.out.println("1. 햄버거");
        System.out.println("2. 피자");
        System.out.println("3. 잔치국수");
        System.out.println("4. 국밥");
        System.out.println("음식을 고르세요: ");
        lunch = sc.nextInt();
        // 하나만 선택하라 > else if, 모두 선택하라 > if
        if(lunch == 1){
            System.out.println("당신은 햄버거를 선택하셨습니다.");
        }else if(lunch == 2){ 
            System.out.println("당신은 피자를 선택하셨습니다.");
        }else if(lunch == 3){
            System.out.println("당신은 잔치국수를 선택하셨습니다.");
        }else if(lunch == 4){
            System.out.println("당신은 국밥을 선택하셨습니다.");
        }else 
            System.out.println("당신은 잘못 선택하셨습니다.");
    }
}    

형변환

byte > short > int > long > float > double

실수가 정수보다 크기 때문에

정수

short num 1 = 4;
short num 2 = 3;
short result = num1 + num2; //error
  • short 자료형인 result에 int인 num1 + num2 를 대입하려해서 오류가 난다. > 일반적으로 int로 변수 선언함
int num1 = 5;
short num2 = 3;
int result = num1 + num2;    //자동형변환 
result = num1 + (int)num2; //강제형변환 
  • 작은 자료형에서 큰 자료형으로 옮기는것(short > int)이 자료 손실 x > 이런경우 자동형변환이 된다.

  • 자동보다는 강제형변환이 더 좋다 > 개발자가 인지하고 넘어가도록

실수

정수 > 실수는 무조건 강제 형변환 시켜야한다. 실수가 정수보다 크기때문이다.

int num = (int)4.5; 
int num2 = 10000000000; //> 백억*에러 
float num3 = 3.14; //에러  
  • 정수형도 기본적으로 int로 저장하기 때문에

    • num2 = 10000000000L; 이렇게 "L"을 붙여줘야한다.
  • 실수형 상수는 기본적으로 double로 저장

    • num3 = 3.14F; 이렇게 "F"를 붙여줘야한다.

비트연산자

왼쪽 쉬프트 Left Shift - <<

  • 밀나가지는 값은 버리고 비어있는 곳은 0으로 채워준다.

오른쪽 쉬프트 Right Shift - >>

  • 왼쪽 시프트와 유사하나 채워질때 다르다.

    • 채워질때 양수는 0으로 채워지고, 음수는 1로 채워진다는 차이점이 있다.

>>> 연산자

  • >> 기본원리는 같다.

  • 빈자리는 무조건 0으로 채워진다.


비트 연산자 (AND) - &

  • 두 비트 모두 1 이여야 1이다. (하나라도 다르면 0)

    • 1 > 0 과 1 = 0. 1과 1= 1

비트 연산자 (OR) - |

  • 두 비트 중 하나의 비트가 1이면 1이다.(두 비트가 0일때만 0)

비트 연산자 (XOR) - ^

  • 두비트가 다르면 1, 같으면 0

비트 연산자(NOT) - 단항 연산 - ~

  • 1 > 0, 0 > 1로 반전시킨다.

퀴즈 - 비트연산자

Q. int형 정수 15678의 오른쪽 세 번째 비트와 다섯 번째 비트가 각각 어떻게 되는지 확인하여 출력하는 프로그램.

package com.test.blog;

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


        System.out.println("15678의 오른쪽 끝에서 3번째 비트는" + (15678 >> 2 & 1));
        System.out.println("15678의 오른쪽 끝에서 5번째 비트는" + (15678 >> 4 & 1));    

        }
    }
  • 2로 시프트 시키면 마지막 비트가 1이거나 0일텐데 여기서 비트 &(and 연산자)를 이용해 1로 and연산 시키면 값이나온다

  • 꼭 1로 비교해야한다.

    • &연산자를 사용하는데 0으로 비교하면 0 과 0의 비교는 0이기 때문이다. 1 과 0 이면 0이고, 1과 1이면 1이므로 0을 기준으로 비교하면 그 위치의 비트가 1이여도 0이 나온다. > 그래서 무조건 1을 기준으로 비교해야한다.
    • and 연산자를 쓰는 이유는 비교하는 값이 그대로 내려오기 때문이다. (비트마스크 기법)

    • 숫자 그대로 입력한 후 시프트 연산자 해도 가능한 이유는 컴퓨터는 이진법을 이용해 숫자를 받아들이기 때문이다.


삼항 연산자

 class SwitchT1{
    public static void main(String[]args){
        int i = 0;
        int num1 = 5, num2 = 3;
        i = num1 > num2 ? num1 : num2;
        System.out.println(i);
}    

퀴즈 - 삼항 연산자

Q 1. 임의의 숫자를 입력받아 절대값 구하기. 삼항연산자를 이용

int abs = 0, num1 = 0;
Scanner sc = new Scanner(System.in);
System.out.println("숫자를 입력하세요");
num1 = sc.nextInt();


abs = num1 > 0 ? num1 : - num1;
System.out.println(num1 + "의 절대값은 " + abs)

&& / || 연산자 법칙 - 꼭 기억하기

ex1.

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

            int num1 = 0, num2 = 0;

            if((num1 = num1 + 10) > 10 && (num2 = num2 + 10) > 10)  
                System.out.println("Good");
            if((num1 = num1 + 10) > 10 || (num2 = num2 + 10)> 10) 
                System.out.println("Nice");

            System.out.println("num1 = " + num1 + " num2 = " + num2);

            }

        }
  • 첫번째 if 문은

    • 10이 10보다 크지 x false/ 자바는 &&연산할때 앞에가 거짓이면 뒤에 수식은 실행 x
  • 두번째 if 문은

    • 자바 컴파일러는 설계될때부터 || 연산 할때 앞에 수식이 참이면 뒤에 수식은 실행 x

ex2.

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

        int i = 0, j = 0;
        while(i++ < 10 || j++ < 10) {}

        System.out.println("i = " + i + " j = " + j);
            }
        }
  • 연산자와 함께 사용됐기 때문에 후치증가라는것 인지하기

  • 0부터 시작해서 참이기 때문에 j는 실행되지 x

  • 계속 i만 증가 되면서 10까지 증가. i가 11이 되었을때 거짓이 되므로 j가 실행된다.


연산자 우선순위


메소드 정의(선언 및 호출)

어떠한 문제를 처리하기 위한 방법을 소스 코드로 묶어놓고 필요(호출)에 따라 동작하는 기능 정도로 생각할 수 있다.

(다른 언어에서는 함수(function)으로 불린다.)

메소드 선언

  • 클래스를 생성할 때마다 main이라는 메소드public static void main(String[] args) { } 를 사용하고 있다.

    • public static은 사용자 메소드를 정의할 때 써야한다고 일단 알아두자
main 메소드
  • 프로그램의 시작점 역할을 하는 JAVA의 약속된 내용이다.

    • main 메소드가 없는 프로그램은 별도로 동작 x

    • 무조건 JAVA를 실행할 때 main 메소드가 실행된다.

  • 필요에 따라 정의한 메서드를 호출

메소드 리턴 타입
  • 자료형 또는 void가 올 수 있다.

  • 자료형이 리턴 타입으로 오변 return 해주는 값이 반드시 있어야 하고, 이 return해주는 값은 메소드 자료형과 동일해야 한다.

class MethodTest{ //클래스 이름은 대문자 
    public static void main(String[]args){
        hello(); //메소드 호출
    }                    
    public static void hello(){ //메소드 이름은 소문자, 뒤 괄호는 파라미 
                  // void 를 사용하면 반환하는 값 x , 호출만 당하
        System.out.println("Hello");
}
  • 호출문을 만나 hello가 메소드인곳으로 내려가서 출력, 출력이 끝나면 다시 돌아와서 jvm에 의해 실행되었으므로 종료된다.
메소드 매개변수 - parameter

외부로부터 입력 값을 받기 위해 메소드의 괄호 안에 선언하는 변수

class MethodTest{
    public static void main(String[]args){
        hello(3); 
    }
    public static void hello(int max){
        for(int i = 0; i < max; i++){

        System.out.println("Hello");
}
  • int max > 파라미터

  • hello(3); 으로 호출했기 때문에 max의 지역변수(매개변수) 의 값이 3이 된다.

  • hello(3) 의 3은 인수로 arguments라고 한다.

class MethodTest{
    public static void main(String[]args){
        int max = 3;
        hello(max); 
        //사실 이렇게 작성할 필요없이 hello(3); 이렇게 호출하면 hello메소드 max값 안에 3이 들어가 실행된다.
    }
    public static void hello(int max){
        for(int i = 0; i < max; i++){

        System.out.println("Hello");
}
  • main메소드와 hello 메소드는 다른 지역이기때문에 변수가 같아도 상관 x (but 헷갈리지 않게 조심)

  • main메소드에서 hello변수를 호출하고 싶다면 hello(변수명), 위와 같이 hello(max)로 호출해야한다.

class MethodTest{
    public static void main(String[]args){
        int result = 0;
        result = hello(3);
        //이렇게 작성안하고 syso괄호 안에 hello(3) 넣어도 결과는 같음 
        System.out.println(result);
    }
    public static int hello(int max){
        for(int i = 0; i < max; i++){
            System.out.println("Hello");
        }
        return 100;
      //return을 만나면 호출한 곳으로 이동하고, return이 값을 가지고 있으면 값을 가지고 이동한다.
    }
}//Hello 세번 출력 후 100출력 
  • 사용자 정의 메소드의 void는 return값을 받지않고 호출만 할때 사용하고, return값을 받을때 이에 맞는 자료형을 넣어줘야한다.

  • boolean을 넣어준다면 return값은 반드시 boolean 이여야한다.

class MethodTest{
    public static void main(String[]args){
       
        System.out.println(hello(max);//호출하고 반환값을 받아 출력하는 문장 
    }
    public static double hello(int max){ //void는 반환하는 값을 적는것이기 때문에 자료형에 맞게 적어줘한다. return하는 값이 없으면 void, return은 없는데 반환받으려하는 값이 main에 있으면 오류나기때문에 반환하는 값이 없으면 호출만 해야한다.
        for(int i = 0; i < max; i++){
            System.out.println("Hello");
        }
        return 3.5;
    }
}//hello 3번 출력 후 3.5 출력 
  • void 위치는 반환하는 값을 적는것이기 때문에 자료형에 맞게 적어줘한다.
  • 소수점을 반환할 것이기 때문에 double, 정수형은 int(int와 double이 컴퓨터가 자동으로 변환하는 자료형)
class MethodTest{
    public static void main(String[]args){
        int result = add(5, 10);
        System.out.println(result);
    }
    public static int add(int num1, int num2){ 
        int result = num1 + num2;
        return result;

    }
}class MethodTest{
    public static void main(String[]args){
        int result = add(5, 10);
        System.out.println(result);
    }
    public static double hello(int num1, int num2){ //각각 선언
        int result = num1 + num2;
        return num1 + num2;

    }
}
  • 매개변수는 선언할때 자료형이 같아도 무조건 각각 선언해줘야 한다.
  • 위 문장과 아래 문장은 같은 문장인데 어떻게 쓸지는 취향차이 둘다 가능
class Add {
    public static void main(String[] args) {

            addition(10);
        }
        public static void addition(int add){
            for( int i = 1; i < add; i++){
                for( int j = 1; j < add; j++){
                    System.out.println(i + "+" + j + "=" + (i+j));
                }
            }
        }
    }
  • 출력은 addition메소드에서 시키도록 작성했기 때문에 메인메소드에서 출력 할 필요 없이 호출만 하면 출력까지 수행된다.

퀴즈 - 메소드 정의

Q1.사칙연산을 각각 메소드로 사칙연산의 결과 값을 리턴한다.

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

        System.out.println("덧셈 1 + 2 = " + add(1,2));
        System.out.println("뺄셈 5 - 1 = " + sub(5,1));
        System.out.println("곱셈 1 * 2 = " + add(1,2));
        System.out.println("나눗셈 1 / 2 = " +add(1,2));

    }
        public static int add(int num, int num1){
                    return num + num1;
        }
        public static int sub(int num, int num1){
                    return num - num1;
        }
        public static int multi(int num, int num1){
                    return num * num1;
        }
        public static int div(int num, int num1){
                    return num / num1;
        }
    }


Q2.정수값 하나를 넘겨주면 그 정수에 해당하는 구구단을 출력하는 메소드
(예 정수 3을 넘겨주면 3단을 출력). 리턴값 없음

class Q2 {
    public static void main(String[] args) {
            timesTable2(2,9); //start = 2, end = 9
    }
    public static void timesTable2(int start, int end) {
            for(int i = start; i <= end; i++) {
                for(int j = 1; j <= 9; j++) {
                    System.out.println(i + " * " + j + " = " + i * j);
                }
            System.out.println();
        }
    }
}

Q3.정수값 두개를 넘겨주면 첫 번째 매개변수 시작단부터 두번째 매개변수
끝단까지 출력하는 메소드 (ex 3과 5를 넘겨주면 3단부터 5단까지 출력)

> 리턴값 없음

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

//    System.out.print(dan(2,5))
        dan(2,5); //2~5단까지 출력
    }
    public static void dan(int num1, int num2) {
        int i = 0, j = 0;
        for(; num1 <= num2; num1++) 
        {
            for(i = 1; i < 10; i++) 
            {
                System.out.println(num1 + " * " + i + " = " + (num1 * i) + "\t");
            }
        }
    }
}
  • 리턴값 없는데 void에 int 사용

  • 리턴값 없는데, 메인 메소드에서 출력하려고 함.. 난 바보야...

Q4.숫자하나를 넘겨주면 1부터 그 숫자까지 더해서 그 값을 리턴하는 메소드
(예 5를 넘겨주면 1부터 5까지 순차적으로 더해서 그 값을 리턴)

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

        System.out.println(plus(5)); 
        //출력문에 사용자메소드를 넣어도 호출로 인정, 호출되었다가 출력된다.
    }
    public static int plus(int num) {
        int i = 0, cnt = 0;
        for( i = 1; i <= num; i++) {
             cnt = cnt + i;
        }
        return cnt;     
    }
}

Q5. 정수값 두개를 넘겨주면 첫 번째 매개변수가 시작값부터 두 번째 매개
변수가 끝값까지 더해서 리턴
(5와 10을 넘겨주면 5부터 10까지 순차적으로 더해서 그 값을 리턴)

class Q5{
    public static void main(String[] args) {
         //5가 시작값, 10이 끝값
        System.out.println(plus(5,10));
    }
    public static int plus(int num, int num2) {
        int i = 0, cnt = 0;
        for( i = num; i <= num2; i++) {
             cnt = cnt + i;
        }
        return cnt;     
    }
}

Q6 정수값 하나를 넘겨주면 그 정수값에 대한 팩토리얼 값을 리턴

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

        System.out.println(plus(5));
}
    public static int plus(int num) {
        int i = 0, fac = 1;
        for( i = 1; i <= num; i++) {
             fac *= i;
        }
        return fac;     
    }
}

Q7. 숫자하나를 넘겨주면 그 숫자가 소수이면 true를 리턴 소수가 아니면 false를 리턴하는 메소드

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

        System.out.println(isPrimtNumber(5));
    }
    public static boolean isPrimtNumber(int num) {

        if(num <= 1) return false; //굳이 else문 쓸 필요 x
        for(int i = 2; i < num; i++) {//조건이 만족하면 for문 벗어나서 true 리턴

            if(num % i == 0) return false;
        }
        return true;
    }
}
Q7.내가 작성한 문장

스캐너를 이용해 값을 받아 그 수가 소수인지 아닌지를 확인하는..

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

        Scanner sc = new Scanner(System.in);

        System.out.println("소수인지 확인할 값을 입력하세요.");
        int result = sc.nextInt();

        System.out.println(minority(result));
    }    
    public static boolean minority(int result) {
        int i = 0;
        boolean flag = true;

        if(result <= 1) 
        {
             flag = false;
        }
        for(i = 2; i < result; i++) 
        {
            if(result % i == 0); // 세미콜론때문에 출력이 안되는것이였
            {
                flag = false;
            }
        }
        return flag;
    }
}
Q7. 정답..> 근데 뭐가 다른지 진짜 몰겠음> 세미콜론때문에
public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            //boolean num = true; // 값을 boolean에 가져오는거라 굳이 선어 안해도 됌
            System.out.println("소수인지 확인할 값을 입력하세요.");

            int result = sc.nextInt();

            //num = minority(result); //리턴값을 받는 곳, 따로 설정안하고 출력하면서 호출 가능
            System.out.println(minority(result));
        }    
        public static boolean minority(int result) {
            int i = 0;
            boolean flag = true;

            if(result <= 1) 
            {
                flag = false;
            }
            for(i = 2; i < result; i++) 
            {
                if(result % i == 0) 
                {
                    flag = false; //return이 아니라 return할 변수 안에 값을 넣는것.

                }

            }
            return flag; 
        }
    }

Q8.7번 메소드를 이용하여 1부터 100사이의 모든 소수 출력. 7번메소드는 변경하면 안된다.

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

        for(int i =1; i <= 100; i++) { //1~100 사이 숫자 출력
            if(isPrimtNumber(i)); //위에서 출력된 숫자가 소수인지 아닌지 확인하기 위해 호출
            System.out.println(i + " ");
        }
    }
    public static boolean isPrimtNumber(int num) {

        if(num <= 1) return false;
        for(int i = 2; i < num; i++) { //조건이 만족하면 for문 벗어나서 true 리턴

            if(num % i == 0) return false;
        }
        return true;
    }
}

0개의 댓글