2. METHOD AND CONDITION _04 TYPE, CONVERSION

jaegeunsong97·2022년 11월 17일
0

[Inflearn] 홍팍 자바

목록 보기
4/15

Type and conversion of shape

타입 에러는 왜 나는 걸까? 타입 관련 주의점을 알아보자!

Caution divide operator

int와 int의 연산 결과는 int이다. double과 int의 연산은 double이다. 숫자간 연산은 더 큰 타입을 따른다.

double a = 5.0 / 2.0; // 2.5
int b = 4 / 2;        // 2
int c = 5 / 2;        // 2.5 (X) => 2 (O)

Caution of mismatch type

변수에 값 대입 시, 그 값이 변수의 타입과 일치해야 한다.

// 타입 불일치 에러
int score = "100";
// 해결 방법
int score = 100;      // int로 일치
String score = "100"; // String으로 일치
int score = Integer.parseInt("100"); // "100" => 100

Type conversion caution

타입 불일치의 문제는 타입 변환을 통해 해결가능하다. 타입변환은 자동 변환과 직접 변환이 있다.
auto conversion >> int는 double로 대입될 수 있다. 2를 2.0으로 보아도 무방하다. 이러한 자동 변환은 더 큰 타입으로 대입 시 발생한다. (byte(1) < short(2) < int(4) < long(8))

// 자동 변환 (더 큰 타입으로 대입될 때)
double p = 2;  // 2 => 2.0
int n = 5 / 2; // 2
double q = n;  // 2 => 2.0

direct conversion >> 거꾸로 double은 int로 대입될 수 없다. 10.4를 10이라고 볼 수 없기때문. 강제로 소수점을 버리고 정수로 만들 순 있다. 이러한 문법을 타입 캐스팅(casting)이라 한다.

// 에러 발생
int r = 10.4; // ERROR
// 실수를 정수로 강제 캐스팅
int r = (int) 10.4; // 10.4 => 10

1) printf() integer

println() method >> 우리는 앞서 println()을 통해 문자열 출력을 배웠습니다.

// 변수 생성
int age = 34;
// A - 결과 출력
System.out.println("홍팍이의 나이는 " + age + "세입니다.");

printf() method >> 이번에는 printf() 메소드의 사용법을 알아봅시다.

// B - 결과 출력
System.out.printf("홍팍이의 나이는 %d세입니다.", age);

printf() 메소드는, 출력을 위한 문자열에 값을 삽입시켜 출력합니다. 위 코드의 경우, 변수 age의 값이 %d의 위치로 삽입되어 출력됩니다. 여기서 %d는 정수 타입으로 삽입하라는 뜻입니다.
CODE

public class StringInterpolation {
  public static void main (String[] args) {
    // 변수 생성
    int result = 7 / 2; // 정수를 정수로 연산한 결과는 정수
    // 결과 출력
    System.out.printf("7 / 2는 %d입니다.", result);
  }
}

2) printf() two integers

output after input variable value >> 우리는 앞서 printf() 메소드를 사용한 문자열 출력을 배웠습니다. 이를 통해 출력 문자열에, 변수 값을 삽입할 수 있었습니다.

// 변수 생성
int age = 34;
// 결과 출력 => "열혈 청년 홍팍, 34세"
System.out.printf("열혈 청년 홍팍, %d세", age);

output after input two variable value >> 두 개 이상의 변수를 삽입하는 것 또한 가능합니다. 아래 코드는 정수형 변수 month와 day는, 문자열 속 %d에 차례로 삽입돼 출력됩니다.

// 변수 생성
int month = 10;
int day = 4;
// 결과 출력 => "제 생일은 10월 4일입니다."
System.out.printf("제 생일은 %d월 %d일입니다.", month, day);

CODE

public class StringInterpolation2 {
  public static void main (String[] args) {
    // 변수 생성
    int a = 6 / 2;
    int b = 7 / 2;
    // 결과 출력
    System.out.printf("a = %d, b = %d", a, b);
  }
}

3) printf() float

input integer value >> printf() 메소드에서, 정수의 삽입 형식은 %d입니다.

// 변수 생성
int mathScore = 68;
// 결과 출력 => "수학 점수는 68점 입니다."
System.out.printf("수학 점수: %d점 입니다.", mathScore);

input float value >> 그렇다면 실수 값은 어떻게 삽입할까요? %f를 사용하면 됩니다.

// 변수 생성
double pi = 3.14;
// 결과 출력 => "파이의 값은 3.140000 입니다."
System.out.printf("파이의 값은 %f 입니다.", pi);

CODE

public class StringInterpolation3 {
  public static void main (String[] args) {
    // 변수 생성
    double x = 7.0 / 2.0; // 3.5
    double y = 7 / 2; // 3 => (자동 변환) => 3.0
    // 결과 출력
    System.out.printf("x = %f, y = %f", x, y);
  }
}

4) printf() string

input string >> printf() 메소드로 문자열 또한 삽입 가능합니다. 이경우 %s 사용합니다.

// 변수 생성
String name = "홍팍";
String hobby = "산책하기";
// 결과 출력 => "이름: 홍팍 취미: 산책하기"
System.out.printf("이름: %s ", name);
System.out.printf("취미: %s", hobby);

\n >> 추가로 줄 내림. 엔터 효과가 필요할 땐, \n을 추가합니다.

System.out.printf("이름: %s\n", name);
System.out.printf("취미: %s", hobby);

demicla point >> 덧붙여 실수값 출력 시, 소수점 이하 자리수를 제한할 수 있습니다.

// 소수점 이하 2자리까지 출력 => 3.14
double pi = 3.14159265;
System.out.printf("%.2f\n", pi);
// 소수점 이하 5자리까지 출력 => 3.14159
double pi = 3.14159265;
System.out.printf("%.5f\n", pi);

CODE

public class TypeMismatch {
  public static void main (String[] args) {
    // 변수 생성
    String title = "로미오와 줄리엣";
    String author = "윌리엄 셰익스피어";
    double price = 5.94;
    // 결과 출력
    System.out.printf("제목: %s\n", title);
    System.out.printf("저자: %s\n", author);
    System.out.printf("가격: $%.2f\n", price);
  }
}

5) printf() casting float to integer

printf() structure >> printf() 메소드의 출력형식을 정리하면 아래와 같습니다.
%d - 정수(int)
%f - 실수(double)
%s - 문자열(String)
other case of output >> 삽입하려는 값과 출력 형식의 타입이 불일치하는 경우, 에러가 발생합니다.

// 변수 생성
double pi = 3.14;
// ERROR: pi의 값은 실수인 3.14, 그런데 정수 형식 %d로 출력하려 함!
System.out.printf("%d", pi);

how to fix >> 위 코드를 정상 동작하기 위해서는 어떻게 해야할까요? 삽입 값과 출력 형식을 같게 맞추면 됩니다.

// A - 출력 형식을 변경!
System.out.printf("%f", pi);
// B - 변수 값을 캐스팅,
System.out.printf("%d", (int) pi);
// = System.out.printf("%d", (int) 3.14);
// = System.out.printf("%d", 3);

casting >> 캐스팅이란, 타입을 강제 변환하는 문법입니다. 실수는 정수로 캐스팅 가능합니다.

// 실수 10.4를 정수(int)로 캐스팅, 소수점 이하 값이 버려짐.
int a = (int) 10.4; // a = 10;

CODE

public class Casting {
  public static void main(String[] args) {
    // 변수 생성
    double tall = 176.4;
    double weight = 82.34;
    /* 1. 실수형 변수를 정수로 캐스팅하여 출력하시오. */
    System.out.printf("신장: %dcm\n", (int) tall);
    System.out.printf("체중: %dkg\n", (int) weight);
  }
}

6) conversion sting to integer

connect string each other >> 우리는 앞서, 문자열간 덧셈은 문자열 연결임 배웠습니다.

// 변수 생성
String three = "3";
String seven = "7";
// 결과 출력 => "37"
System.out.println(three + seven);

stirng to integer >> 위 코드의 결과가 문자열 “37”이 아닌 정수 10이 되게 하려면, 형변환이 필요합니다.

// 형변환: 문자열(String) => 정수(int)
int a = Integer.parseInt(three); // "3" => 3
int b = Integer.parseInt(seven); // "7" => 7
// 결과 출력 => 10
System.out.println(a + b);

string to float >> 문자열은 실수형으로 또한 변경 가능합니다.

// 변수 생성
String pi = "3.14";
// 형변환: 문자열(String) => 실수(int)
double c = Double.parseDouble(pi); // "3.14" => 3.14

CODE

public class StringToNumber {
  public static void main(String[] args) {
    // 변수 생성
    String strSeven = "7";
    String strPi = "3.14";
    // 형변환: 문자열 => 숫자
    int a = Integer.parseInt(strSeven);
    double b = Double.parseDouble(strPi);
    // 숫자 계산
    double c = a + b;
    // 결과 출력
    System.out.printf("%d + %.2f = %.2f", a, b, c);
  }
}

7) review: area of circle

math class >> Math 클래스는 수학에서 사용되는 변수 및 함수들을 제공합니다. 아래는 그 활용 예입니다.

// 원주율 - Math.PI
double pi = Math.PI; // 3.14159265..
// 절대값 - Math.abs();
double x = Math.abs(-9.81); // 9.81
// 반올림 - Math.round();
long n = Math.round(10.6); // 11

CODE

public class CircleAreaCalculator {
  public static void main(String[] args) {
    /* 1. 입력값 받기 */ 
    int r = Integer.parseInt(args[0]);
       /* 2. 원의 넓이 계산 */
    double S = Math.PI * r * r;
    /* 3. 결과 출력 */
    System.out.printf("반지름이 %d인 원의 넓이 => %.3f", r,  S);
  }
}
profile
블로그 이전 : https://medium.com/@jaegeunsong97

0개의 댓글