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
println() method >> 우리는 앞서 println()을 통해 문자열 출력을 배웠습니다.
// 변수 생성 int age = 34; // A - 결과 출력 System.out.println("홍팍이의 나이는 " + age + "세입니다.");
printf() method >> 이번에는 printf() 메소드의 사용법을 알아봅시다.
// B - 결과 출력 System.out.printf("홍팍이의 나이는 %d세입니다.", age);
printf() 메소드는, 출력을 위한 문자열에 값을 삽입시켜 출력합니다. 위 코드의 경우, 변수 age의 값이 %d의 위치로 삽입되어 출력됩니다. 여기서 %d는 정수 타입으로 삽입하라는 뜻입니다.
CODEpublic class StringInterpolation { public static void main (String[] args) { // 변수 생성 int result = 7 / 2; // 정수를 정수로 연산한 결과는 정수 // 결과 출력 System.out.printf("7 / 2는 %d입니다.", result); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }