[Java] 형변환 연산 입력
이번 시간엔 저번 시간에 했던 형변환 조금 짚고 넘어 가겠습니다.
1
2
3
4
5
6
7
public static void main(String[] args) {
int data = 'A';
System.out.println(data);
System.out.println((char)('A'+5));
}
뒤에 나오겠지만 문자열(“ “) + 정수는 문자열로 나오고 이때 정수는 연산이 아닌 연결입니다. 하지만 문자 + 정수는 정수로 나오면 이때는 연산을 하게됩니다. data라는 정수타입의 변수에 A라는 문자는 넣으면 아스키 코드가 입력됩니다. 그래서 출력을 하면 65라는 숫자가 출력됩니다. 여기에 data +5를 하면 70이 나오겠지요? 근데 이것을 다시 문자로 표현하고 싶으면 ‘A’+5를 괄호로 묶고 그 전체를 char형으로 강제 형변환을 하면 A문자 5개 뒤의 문자 ‘F’가 나오게 됩니다.
1
2
3
4
String data1 = "1";
String data2 = "2";
System.out.println(data1+data2);
이렇게 한다면 출력이 어떻게 될까요? 3? 아닙니다. 아까 말했듯이 문자열이 들어가면 문자열로 나오고 그 사이에 있는 것은 연산이 아닌 연결이라 했습니다. 따라서 1과 2가 연결되서 출력된 12가 나오게 됩니다. 그러면 강제 형변환은 이용해서
(int)data1 이 적용이 될까요? 답은 안 됩니다. data1은 문자열이라는 클래스입니다. 따라서 특별한 문장을 사용합니다.
1
2
Integer.parseInt(data1)
Integer.parseInt(data2)
좀 복잡하죠? Integer는 정수타입의 풀네임이고 대문자로 시작하니 클래스가 맞네요. 자그럼 data1은 원래 문자열이죠. 근데 저런식으로 int타입의 ‘값’으로 되어버렸네요. 그렇다면 그 값을 대입할 저장공간이 필요하겠죠?
1
2
int num1=Integer.parseInt(data1);
int num2=Integer.parseInt(data2);
num1,2라는 변수를 만들어 저것을 형변환 했습니다. 이제
1
System.out.println(num1+num2);
이렇게 하면 3나오겠죠?
*변수의 초기값
정수 0
실수 0.0
문자 ‘ ‘
문자열 “”, null
변수를 사용하는 이유
1. 반복되는 값을 쉽게 관리하기 위해서
2. 의미없는 값에 의미부여를 하기 위해서(하나의 정보로 표시하기 위해)
라고 할 수있습니다. 나중에는 코드가 상상이상으로 길어지면 변수의 변경만으로 쉽게 관리할 수 있겠죠.
*문자열
-연결
문자열 + 값 = 문자열
문자열 + 문자열 = 문자열
-다른 자료형으로 변경
Integer.parseInt(문자열) : 쌍따옴표 안에 있는 정수값
Double.parseDouble(문자열) : 쌍따옴표 안에 있는 실수값
*입력
먼저 간단하게 몇가지를 설명한 다음에 실습을 한번 해보겠습니다.
입력상태
커서가 깜빡이고 있는 상태입니다.
입력 클래스
입력 메소드
Scanner sc = new Scanner(System.in);
sc.next() : 사용자가 입력한 문자열 값
sc.nextLine() : 사용자가 입력한 문자열 값
next()와 nextLine()의 차이점
1. next()
공백 또는 엔터를 구분점으로 사용하기 때문에 담기지 않습니다.
2.nextLine()
공백이나 엔터도 먹는다.
1
2
3
4
5
6
7
8
9
10
11
//두 정수를 입력받고 합 구하기
import java.util.Scanner;
int num1 =0,num2=0;
Scanner sc = new Scanner(System.in);
System.out.print("첫 번째 정수 : ");
num1 = Integer.parseInt(sc.next());
System.out.print("두 번째 정수 : ");
num2 = Integer.parseInt(sc.next());
System.out.println(num1+num2);
Scanner sc = new Scanner(System.in); 이것은 아직 자세히 배우지는 않았습니다. 일단 입력하기 위해선 이 코드를 쓰고 그래도 오류가 날텐데 그럴땐 import java.util.Scanner;이 문장을 써서 예전 개발자들이 만들어놓은 툴을 빌려씁니다. 그리고 입력을 하게 하는 것은 sc.next()라는 것인데 이것은 문자열입니다. 따라서 연산을 위한다면 문자열이 아닌 정수형태로 바꿔야겠죠? 그래서 위에서 말씀드린 문자열 형변환을 이용해서 num1이라는 변수에 넣어줍니다. 마찬가지로 num2 이렇게 한다음에 출력으로 num1+num2으로 하면 되겠네요 ^^
그렇다면 이제 이름과 나이를 입력받아 출력하는 것을 해보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Scanner;
String name ="";
int age =0;
String nameMsg = "이름을 입력해주세요.";
String ageMsg = "나이를 입력해주세요.";
Scanner sc = new Scanner(System.in);
System.out.println(ageMsg);
age = sc.nextInt();
System.out.println(nameMsg);
sc.nextLine();
name = sc.nextLine();
System.out.println(age + "살," +name + "님 환영합니다.");
}
만들어봤습니다. 위쪽부터 내려오면서 하나씩 설명드릴게요~
먼저 문자열과 정수를 넣어줄 변수를 각각 선언하고 초기값을 넣었습니다.
그리고 이름을 입력해주세요, 나이를 입력해주세요라는 문자열을 만들었습니다.
그 다음엔 입력을 할테니 Scanner sc = new Scanner(System.in); 를 넣어줬습니다. 물론 위에 import로 입력툴을 가져왔구요.
다음으로 나이를 먼저 입력하겠습니다 .만들어 놓은 ageMsg를 출력하고 age = sc.nextInt(); 를 넣었습니다. 이것은 age=Integer.parseInt(next()); 를 편하게 쓰기 위해서 줄인겁니닷. 나이를 입력했으니 다음은 이름이겠죠?
준비해둔 이름 문자열출력하고 오잇?sc.nextLine(); 이게 있네요?이것은 입력한건데 왜 넣은 걸까요? 답은 버퍼입니다. C언어에서도 소개드렸죠? 정수를 입력하고 버퍼에 남은 \n(줄바꿈,엔터)가 다음 입력창에 우리가 이름을 입력하기도 전에 입력되어버리는 것을 방지하기 위해 nextLine()을 쓴겁니다. next()와 다른 것은 공백이랑 줄바꿈 또한 입력이 가능합니다. 그래서 버퍼에 남은 줄바꿈을 저기로 입력시켜버리고 우리는 name = sc.nextLine();에서 비로소 원하는 이름을 입력할 수 있습니다. 여기서 또 nextLine()을 쓴 것은 혹시 띄어쓰기가 있으면 그것도 출력하기 위함입니다
*연산자
기능이 있는 특수문자입니다. 우리가 평소에 아는 그런 특수문자랑은 조금 다릅니다!
연산자 우선순위
연산자에 대해선 다 배우지 않았습니다. 배우는 대로 포스팅할게요~ 우선 오늘은 연산자들 사이에서의 우선순위를 적었습니다~
최 우선 연산자
단 항 연산자
산 술 연산자
쉬 프트 연산자
관 계 연산자
논리 연산자(비트연산)
삼 항 연산자
대 입 연산자
의 순서입니다1
결합성
하나의 수식에 동일한 우선순위의 연산자가 있을 때
알맞은 방향으로 결합되어 연산되는 성질입니다. 따라서 동일한 우선순위의 연산자가 있으면 상식대로 왼쪽에서 오른쪽으로 읽습니다.
*비트 연산
논리 연산자
&, and : A & B
둘 다 1이면 1
, or : A | B |
둘 중 하나라도 1이면 1
^, xor : A ^ B
두 비트가 서로 다르면 1
1
2
3
4
5
System.out.println(10&11);
System.out.println(10|11);
System.out.println(10^11);
1010(10)
1011(11) 이 두개로 해보겠습니다. &연산자는 두 2진수를 보고 각 단위 자리수가 둘다 1이면 1을 출력합니다. 따라서 저 두 숫자를 연산하면
어떤 숫자가 나올까요? 네 1010이 나오겠습니다.
다음은 or 연산자 입니다. 둘 중에 하나라도 1이라면 1을 출력합니다. 따라서 저 두 숫자를 연산하면 1011을 출력하겠죠?
마지막으로 ^ 연산자입니다. 두비트가 서로 달라야 1을 출력하니까 0001이 출력되겠네요
잘 출력이 되었습니다~
*단항 연산자
단항 연산자에는 할말이 많습니다.
~, Not : ~A
0을 1로 1을 0으로 반전합니다. 더 정확히 말하자면 더해서 0을 만드려는 숫자를 출력합니다.
예를 들어, 0001을 0000으로 만드려면 어떻게 해야할까요? 우리는 그냥 0001을 빼버리면 되지만 컴퓨터에선 빼기라는 연산은 없습니다. 더해야하죠.. 그렇다면 -1을 더해버리면 됩니다. 그리고 최상위 비트부호도 알아야합니다. 양수는 0 음수는 1인데요. 양수 1은 0 0001 입니다. 그렇다면 -1, 음수 1은? -1을 A로 한다면 1+A =0이 되는 수가 A겠죠? 그렇다면 빼기란 없으니까 1 1111더해버리면 어떨까요? 0 0000 이 되겠죠? 밖으로 벗어난 1은 짤려서 없어지기 때문이죠. 그렇다면 부호비트가 1 인 1111은 =-1이라는 얘기입니다.
그렇다면 다시 단항연산자로 돌아갈게요 ~0001하면 0과 1의 반전이 이루어 지겠죠? 그렇다면 1110이니까 14가 나와야하겠네요?
엥… -2가 나오네요? 왜그럴까요? 2숫자를 봅시다 0010이죠? 이거에 어떤것을 더하면 0이 될까요? 1110이죠? 그렇다면 2에 상응하는 값은 -2 =1110입니다. 이것은 0001을 반전한 값이죠? 따라서 ~1= -2
그래서 식으로 만들면,
~a = -a -1 = -(a+1)가 됩니다.
*쉬프트 연산자
« : 좌로이동
A« B : A를 B만큼 좌로 비트이동
>> : 우로이동
A » : A를 B만큼 우로 비트이동
쉬프트 연산자는 빠른 연산을 위해서 합니다. 비트연산이 우리가 알고있는 사칙연산보다 속도가 훨씬 빠르기 떄문이죠. 이것은 C언어에서 설명했습니다~
이번시간엔 여기까지 하겠습니다!
Comments powered by Disqus.