아홉 번째 수업

정혅·2024년 2월 20일

더 조은 아카데미

목록 보기
14/76

복습

String - 클래스

String은 new 없이 객체 생성이 가능하다.

객체를 생성하면 문자열과 String API도 함께 객체에 들어간다.

String str2 = "good"; > 객체가 생성된것

  • str2.length(); : 문자열 개수

  • str2.toLowerCase(); : 문자열을 소문자로 변환

  • str2.toUpperCase(); : 문자열을 대문자로 변


퀴즈 - String API 이용해서

  1. 사용자로 부터 영숫자를 입력받아 대문자이면 '대문자', 소문자이면 '소문자', 숫자이면 '숫자'라고 출력.
    예시)
    영숫자 입력
    A
    A는 대문자
    영숫자 입력
    b
    b는 소문자
    영숫자 입력
    3
    3은 숫자
    영숫자 입력
    %
    입력한 값은 영숫자가 아닙니다.

내가 한 코드 - 그러나 숫자 출력에서 오류

import java.util.Scanner;
class Output{
    public static void main(String[]args){

        Scanner sc = new Scanner(System.in);

        System.out.print("영어 및 숫자를 입력하세요 : ");
        String ans1 = sc.next();

        if(ans1 == ans1.toUpperCase())
            System.out.print(ans1 + "는 대문자 입니다.");
        else
            System.out.print(ans1 + "는 대문자가 아닙니다.");

        System.out.println();

        System.out.print("영어 및 숫자를 입력하세요 : ");
        String ans2 = sc.next();    

        if(ans2 == ans2.toLowerCase())
            System.out.print(ans2 + "는 소문자 입니다.");
        else
            System.out.print(ans2 + "는 소문자가 아닙니다.");


        System.out.println();

        System.out.print("영어 및 숫자를 입력하세요 : ");        
        String ans3 = sc.next();
        int num = Integer.parseInt(ans3);
            if((num >= 0 && num <= 9))
                System.out.print(num + "는 숫자입니다.");    
            else
                System.out.print(num + "는 숫자가 아닙니다.");

    }
}
  • 숫자 출력할때 숫자 입력하면 맞게 나오는데 다른 문자 입력하면 오류

다시 시도 - try~catch이용

import java.util.Scanner;
class Output{
    public static void main(String[]args){

        Scanner sc = new Scanner(System.in);

        System.out.print("영어 및 숫자를 입력하세요 : ");
        String ans1 = sc.next();

        if(ans1 == ans1.toUpperCase())
            System.out.print(ans1 + "는 대문자 입니다.");
        else
            System.out.print(ans1 + "는 대문자가 아닙니다.");

        System.out.println();

        System.out.print("영어 및 숫자를 입력하세요 : ");
        String ans2 = sc.next();    

        if(ans2 == ans2.toLowerCase())
            System.out.print(ans2 + "는 소문자 입니다.");
        else
            System.out.print(ans2 + "는 소문자가 아닙니다.");


        System.out.println();

        System.out.print("영어 및 숫자를 입력하세요 : ");        
        String ans3 = sc.next();


        try{
             Integer.parseInt(ans3);
            System.out.print(ans3 + "는 숫자입니다.");    
        }catch(NumberFormatException e){
                System.out.print(ans3 + "는 숫자가 아닙니다.");
        }    
        sc.close();
    }
}

정답

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        String str;
        char ch;
        int diff = 'a' - 'A';
        System.out.println("문자입력");
        Scanner sc = new Scanner(System.in);
        str = sc.nextLine();
        ch = str.charAt(0);
        if(ch >= 'A' && ch <= 'Z') System.out.println("대문자 입니다.");
        else if(ch >= 'a' && ch <= 'z') System.out.println("소문자 입니다.");
        else if(ch >= '0' && ch <= '9') System.out.println("숫자 입니다.");
        else System.out.println("입력값은 영숫자가 아닙니다.");
        sc.close();
    }
}

  1. 영문자하나를 입력받아, 소문자는 대문자로, 대문자는 소문자로 출력하시오.

정답

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        String str;
        char ch;
        int diff = 'a' - 'A';
        System.out.println("문자입력");
        Scanner sc = new Scanner(System.in);
        str = sc.nextLine();
        ch = str.charAt(0);
        if(ch >='A' && ch <='Z') System.out.println((char)(ch+diff));
        else if(ch>='a' && ch <= 'z') System.out.println((char)(ch-diff));
        else System.out.println("입력값은 알파벳이 아닙니다.");
        sc.close();
    }
}

내가 한것

import java.util.Scanner;
class Output{
    public static void main(String[]args){

        Scanner sc = new Scanner(System.in);

        System.out.print("영어 및 숫자를 입력하세요 : ");
        String ans1 = sc.next();

        if(ans1 == ans1.toLowerCase())
            System.out.print(ans1.toUpperCase());

        sc.close();
    }
}

-API이용해서 비교해서 변환하는 방법을 택했는데 선생님이 해주신것은 너무 어렵다..


String 클래스를 이용한 2진수 변환

Integer.toBinaryString(10); 을 출력하면 1010 > 정수로 받아서 2진수로 변환

String변수명.substring(3) >변수에 들어있는 문자열을 3번째 이후 문자부터 출력한다.

퀴즈 - String을 이용한 2진수 변환

십진 정수를 입력받아 4바이트의 이진수로 출력하시오.
예시
숫자 입력
10
00000000000000000000000000001010

내가 한것(1번은 했지만, 2번은 실패)

import java.util.Scanner;
class Binary{
    public static void main(String[]args){

    Scanner sc = new Scanner(System.in);
    System.out.print("2진수로 출력할 정수를 입력하세요 : ");
    int num = sc.nextInt();

    System.out.println(Integer.toBinaryString(num)); //1번 문제 

    }
}
  • 2번 문제 ) 4비트의 2진수를 어떻게 출력해야할지 몰랐는데 그냥 애초에 32개의 0을 만들고 입력받은 2진수를 더해서 그 더한 자리 수 만큼 빼서 출력하는거였다..

    • 생각의 방향이 잘못됐다.

정답

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = "00000000000000000000000000000000";
        System.out.println("숫자 입력");
        int temp = sc.nextInt();
        String binStr = Integer.toBinaryString(temp);
//        String strNum = sc.nextLine(); > 
//        String binStr = Integer.toBinaryString(Integer.parseInt(strNum));
        String tmp = s1 + binStr;
        System.out.println(tmp.substring(binStr.length()));
    }
}

// String strNum = "5";
// int num = Integer.parseInt(strNum);
// 문자열을 "5"를 int 5로 바꿔서 반환한다.

Integer.parsInt() > 문자열을 정수로 변경

Integer.toBinaryString() > 정수를 이진수로 변 경

  • 만약 사용자 입력을 정수가 아닌, 문자열로 입력받는다면(주석)

    • 정수형일때 2진수로 변환할 수 있으므로, 문자열 > 정수형 변환하고

      • 정수형 > 2진수로 다시 변환한 후 해당 값을 문자형에 저장한다.
  • 이렇게 문자형으로 받으면 값을 총 3번 변환해야하기 때문에 정수형으로 입력받는게 더 좋다.


자바의 정석 기본 개념 문제풀이 오답

1-1번


x가 2일때

  • 1 + X << 33 은 x의 값이 2이므로 1 + 2 << 33 이 된다. 덧셈연산자가 시프트 연산자보다 우선순위가 높으므로 3 << 33이 된다.
  • int는 4byte로 32bit이므로 33번 쉬프트 하지 않고, 1번만 쉬프트 한다.

    • 3 << 1은 3에 '2의 1제곱' 인 2를 곱하는 것과 같은 의미므로 3 * 2가 되어 6이 된다.

1-2번

  • 이항 연산자는 피연산자가 int보다 작은 타입(byte, short, char)인 경우 int로 변환 후 연산을 수행한다.

    • c의 값이 'A'이므로 최종 결과는 2가 된다
  • c가 소문자 c인줄 생각했다.. 문제를 제대로 읽지 않아 생긴 이슈

2번

  • 그냥 나누기만 수행하고 +1 을 했다

    • 나머지가 생기면 1을 더하고, 생기지 않으면 더하지 않는 문장을 빼먹었다

      • %연산자와 삼항 연산자를 이용해 구할 수 있는 문제였다.

3번

  • 삼항연산자 안에 삼항연산자를 포함시킬 수 있는지 몰랐어서 두개로 나누어서 삼항연산자 생성..
  • 문자열로 삼항연산자 결과값을 만들어야 출력된다. 아니면 에러

4번

  • 둘이 나누어 나머지가 발생한 값을 0으로 주고 싶었는데, 방법을 몰라 실패

  • 100으로 나누면 100의자리 숫자는 4가 남고 그대로 100을 곱하면 나머지 숫자들은 자동으로 버려지게 된다.

5번

  • num/10 > 33 계산 후 10을 곱하면 330+1 의 흐름

6번

  • 나머지 연산자가 빼기보다 우선순위가 더 높기 때문에 먼저 수행된다,

    • 24 % 10 은 4이다.
  • 결국 10의 자리는 10의 배수이기때문에 나머지를 구해서 10으로 빼면 되는 문제였다.

7번

5/9 는 0 이다 > 정수 / 정수 = 정수

  • 소수점이 나오게끔 해야하기 때문에 float으로 형변환 시켜주고(5/9f)

    • 이렇게 5/9f * (fahrenheit - 32) 가 화씨를 섭씨로 바꾸는 공식이고 여기서 소수점 둘째까지니까

      • 공식에 *100 을 해주고(소수점 둘째까지니) 에 +0.5를 더해서 지금 현재 나온 소수점이 5이상이면 5를 더해 반올림이 되게 해주고

      • (int)로 형변환을 해서 소수점 밑에를 다 없애주고 100f로 나눠서 본래 소수점 자리로 돌아오고 소수점 뒤는 반올림한 수로 출력되는것이다.

8번

integer보다 작은 타입들이 연산을 하면 int로 자동형변환이 일어난다.

float. long형은 리터럴 뒤에 F,L을 붙이지 않으면 int

    1. byte에 int가 들어갈 수 없으므로 강제형변환 시킨다

    2. char와 int는 더하기x(자료형 다름) > 연산하면 int로 자동형변환

      • 형변환 된 int가 char로 들어가지 못하기 때문에(작은형에 큰형x) 강제형변환 시킨다.
    3. 하나만 형변환해도, int이기 때문에 자동으로 형변환 된다. 3f/2f도 가능하긴 하다

    4. int에 저 곱한값들을 넣을 수 없기 때문에 리터럴에 L을 넣어서 형변환

    5. double과 float도 형변환 없이 연산이 일어날 수 없기 때문에 float으로 강제형변환 시킨다.

10번

  • 대문자에 해당하지 않으면 그냥 ch출력하고 해당한다면 그 자리에 32를더하면 소문자로 출력된다.

오버플로우

최대 범위보다 큰 수를 발생시키는 경우 발생하는 현상

public class Test {

    public static void main(String[] args) {
        byte num = 127;        // -128 ~ 127
//        num = (byte)(num + 1);        
//        System.out.println(num);    // -128
        num++;
        System.out.println(num);
    }
}
  • 연산하면 int로 자동 형변환 되니까 byte로 형변환 해주고
  • num이 127이라고 하고, num++하면 -128로 돌아온다

언더 플로우

최소 범위보다 작은 수를 발생시키는 경우 발생하는 현상

public class Test {

    public static void main(String[] args) {
        byte num = -128;
        num--;
        System.out.println(num);    // 127
//        num-=2;
//        System.out.println(num);    // 126
//        num-=3;
//        System.out.println(num);    // 125
    }
}
  • 오버 플로우와 반대로 -128일때 num--;하면 127로 돌아온다.

Math.round(숫자) - java.lang.Math

반올림하는 메소드

class Test {
    public static void main(String[] args) {
        System.out.println(Math.round(5.3));  //5
        System.out.println(Math.round(5.6));  //6 > 반올림 되어서 
    }
}

//Math.round 반올림
  • static

Math.random() - java.lang.Math

0이상 1미만의 실수 값을 랜덤(난수)으로 발생시키는 메소드

초기값은 실수이나, 정수로 형변환 시킨 후 원하는 값 사이에서 랜덤으로 정수를 리턴하도록 설정 가능

범위 설정 방법
  1. 끝내고 싶은 숫자에서 시작하고 싶은 숫자를 뺸 뒤 + 1해서 곱해주고, 시작하고 싶은 숫자만큼 더해주기
  • (int)(Math.random()*100+1) > 1 ~ 100 사이의 값을 랜덤해 리턴

  • (int)(Math.random()*6)+ 3) > 3 ~ 8사이의 값을 랜덤 리턴

  • (int)(Math.random()*29+17) > 17~ 45사이의 값을 랜덤 리턴

public class Test2 {

    public static void main(String[] args) {

        for(int i=0;i<10;i++)
        {
            System.out.println((int)(Math.random()*3)); 
        }
    }
}
  • math.random()*3 을 int로 형변환해서 0이상 3미만의 정수 난수 발생

    • 1부터 10까지 난수 발생시키고 싶다면 Math.random()*10 + 1

메소드 오버로딩(OverLoading)

하나의 메소드 이름으로 여러 개의 메소드를 만들 수 있게 해주는 기법

오버로딩의 조건

  1. 메소드 이름이 같아야한다.

  2. 매개 변수의 개수와 자료형은 달라야 한다.

  3. 리턴타입이 달라도 매개변수가 같으면 오버로딩 x

    • 리턴 타입은 오버로딩의 조건에 포함되지 않는다.

c언어에서는 문법적 오류가 나지만 java는 가능하다.

  • 메인 메소드에서 객체 생성 후 호출해서, 값을 넣으면 그 값과 맞는 매개변수에 들어간다.(매개변수의 개수, 자료형에 따라)

  • 주의할점 : 메소드의 반환형이 다른것은 문법적으로 오류난다. > 메소드의 자료형 구별 x

    class Cal
    {
      public void add(int num)
      {
          System.out.println(num + num);
      }
      public double add(int num1);
      //메소드 반환 자료형이 다르고, 매개변수가 같은 경우는 문법적으로 에러난다.
      {
          System.out.println(num1 + num2);
      }
      public void add(double num1, double num2)
      {
          System.out.println(num1 + num2);
      }        
    }
    class CalMain
    {
      public static void main(String[] args)
      {
          Cal cal = new Cal();
          cal.add(5);
          cal.add(5, 10);
          cal.add(1.1, 2.2);
          cal.add('A', 'B');
      }
    }    

퀴즈 - 오버로딩과 지금까지의 문자열 <> 정수 형변환을 이용

  1. 아스키 코드를 입력받으면 알파벳을 출력하는 프로그램.
  2. 알파벳을 입력하면 아스키 코드를 출력하는 프로그램
import java.util.Scanner;
class Turn{
	public void ascci(int num1){
	
		char a = (char)num1;
		System.out.println(a);
		//return;	
	}
	public void ascci(String num2){
		"A"
		int a = Integer.parseInt(num2);
		
		System.out.print(a);
	}
}
class TurnMain{
	public static void main(String[]args){

	Turn tur = new Turn();
	Scanner sc = new Scanner(System.in);

	System.out.print("아스키 코드를 입력하세요 : ");
	int num1 = sc.nextInt();
	tur.ascci(num1);

	sc.nextLine();
	System.out.print("알파벳을 입력하세요 : " );
	String num2 = sc.nextLine();
	tur.ascci(num2);

	}
}
  • 아래 오류는 아스키코드를 입력받아서 알파벳 변환은 잘 되는데, 알파벳을 입력받아서 아스키 코드로 변환이 오류가 난다.

    • String A를 보내서 int로 변환시켜주는 과정에서 변환이 제대로 이루어지지 않고있다는 오류다.

정답 - 내가 한거 완성

import java.util.Scanner;
class Turn{
	public void ascci(int num1){
	
		char a = (char)num1;
		System.out.println(a);	
	
	}
	public void ascci(String num2){
		
		char alpha = num2.charAt(0);
		int num3 = (int)alpha
		System.out.print(num3);
	}
}
class TurnMain{
	public static void main(String[]args){

	Turn tur = new Turn();
	Scanner sc = new Scanner(System.in);

	System.out.print("아스키 코드를 입력하세요 : ");
	int num1 = sc.nextInt();
	tur.ascci(num1);

	sc.nextLine();//주의내용

	System.out.print("알파벳을 입력하세요 : " );
	String num2 = sc.nextLine();
	tur.ascci(num2);

	}
}
  1. 메서드 이름을 같게하여 메소드 오버로딩 해서 코드 작성해주었다

  2. 아스키코드 > 알파벳

    • int로 값을 입력받고, 오버로딩 메소드 위치로 넘겨준다(매개변수 자료형이 다름)

    • int num1을 char로 강제 형변환해준다. > 출력

  3. 알파벳 > 아스키코드

    • String으로 알파벳을 받고, 오버로딩 메소드 위치로 넘겨준다.(매개변수 자료형 다름)

    • String > int로 형변환할 때 Integer.parseInt 를 사용하는데, 이는 예외처리가 발생한다.

      • 그래서 String > char로 1차 변환해주고, char > int로 2차 강제 형변환 해서 출력해준다.
  4. sc.nextLint(); 만 써놓은이유

    • nextInt();입력 받을 때 입력 후 엔터를 치는데, 이때 엔터 전값은 다른 변수에 저장되고, 버퍼에는 엔터의 값이 남아있다.

    • nextInt();이후 바로 nextLint();을 사용한다면, 버퍼에 남아있던 엔터 값이 입력되어 바로 종료된다.

    • 그래서 nextInt();nextLint();사용할 때 사이에 nextLint();을 하나 둬서, 버퍼에 남아있던 엔터값을 소모시키는것이다.


아스키코드 / String api 복습 / String 변환(int,char)

아스키 코드

  • 'A' (65) ~ 'Z'(90)

  • 'a' (97) ~ 'z'(122)

  • '0' (48) ~ '9'(89)


String + 다른 api 복습

-char ch = 변수.charAt(원하는 리턴값의 위치) > 특정 위치의 문자 리턴(char 반환)

  • int a = 변수.length() > 문자열의 개수(int로 반환)

  • int a = 변수.indexOf("찾고싶은 문자") > 찾고싶은 문자가 몇번째 자리에 있는지 알려준다.(int 반환)

  • boolean b = 변수.isEmpty() > 공백인지 아닌지 확인 (boolean 반환)
    -String s = 변수.trim() > 문자열에 공백이 있다면 해당 공백들을 다 제거하고 출력 (String 반환)
    -String s = 변수.replace('o', 'a') > 문자열 속 o였던 문자를 a로 변환해서 출력(String 반환)

  • String s = 변수.toLowerCase() > 문자열을 소문자로 변환(String 반환)

  • String s = 변수.toUpperCase() > 문자열을 대문자로 변환(String 반환)

  • String s = 변수.substring(0부터 삽입한 위치 자리까지 잘라내고 리턴) > 0부터 ()안 삽입한 수까지 잘라내고 그 이후 나머지 String 반환


String 변환(int, char)

String > int(문자열을 숫자로)

java.lang.Integer 클래스의 parseInt()와 valueOf()메소드 사용.

- Integer.parseInt(변경할 문자열 변수)

static int parseInt(String s)

  • 파라미터로 숫자로 변환할 문자열을 입력받고, 입력받은 문자열을 integer로 변환한 int값을 리턴한다.

  • 그러나 예외처리가 발생할 수 있으므로 주의한다.

    • String > char로 변환(charAt())하고, char > int로 변환(강제형 변환)해서도 가능하다.
- Integer.valueOf()

static int calueOf(String s)

  • parseInt()와의 차이점

    • valueOf()메소드는 문자열을 변환하여 Integer Object를 리턴한다.

    • parseInt()메소드는 primitive type인 int를 리턴한다.


String > Binary (문자열을 2진수로)

- Integer.toBinaryString(값)
  • 매개변수에 int를 넣으면 문자열로 이진 표현해주는 메소드다.

int > String(숫자를 문자열로)

java.lang.Integer클래스의 Integer.toString()과 String.valueOf()메소드 사용

- Integer.toString()
  • int를 문자열로 바꿀 수 있다.
- String.valueOf()
  • int를 String으로 변경 가능
- int + " "
  • int에 쌍따옴표 사이 공백 을 + 하면 문자열로 자동 형변환 된다.

0개의 댓글