- [Java 기본]자료형, 연산자 우선순위, I/O기본 구성
=================================================================================================
본 내용은 2002년 Java 강의를 수강하며 정리 했던 내용을 근간으로 하여 정리하였습니다.
- 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
-------------------------------------------------------------------------------------------------
<목차>
1. 자료 형
2. 연산자
3. I/O 기본 구성
-------------------------------------------------------------------------------------------------
1. 자료형(공에 비유하여 설명)
1) 개념적인 설명
1.1) 상수 : 성질이 변하지 않고 그 상태 그대로를 유지하는것(예: 야구공).
- 한번 지정되면 변하지 않는 것들.
1.2) 변수 : 상수를 담을 수 있는 통(야구공을 특수한 통에 보관 할수 있다).
1.3) 변수명 : 통에 라벨을 달아 놓은 것
1.4) 탁구공, 야구공, 축구공과 같이 다른 형태의 공이 존재
1.5) 각자 크기에 맞는 상자에 넣어 두면 적절히 보관 할수 있다.
1.6) 통들의 크기를 8개의 규약으로 만들었음. : Java의 8가지 자료형
2) 자료형
a) 입.출력 범위 : (-2^(비트수-1) ~ 2^(비트수-1)-1)
2.1) boolean : 논리 자료형 - 1byte로 배정
a) 형식 : boolean bb == ?(true/false);
b) 메모리의 한 바이트 자료를 담을 수 있는 공간으로 사용할 수 있다.
c) 표현할 수 있는 데이터 값(입출력 범위) : true, false 두 가지만 사용 가능.
2.2) byte
a) 1 byte 로 배정
b) 입출력 범위 : -2^7 ~ 2^7-1 = (-128 ~ 127)
2.3) short
a) 2 byte
b) 입출력 범위 : -2^15 ~ 2^15-1 = (-32768~32767)
2.4) char
a) 2 byte
b) 입출력 범위 : 0~2^16-1 = (0 ~ 65535)
2.5) int : 현재 시스템에서 사용하고 있는 기본 자료형과 동일 하며,...
a) 4 byte
b) 입출력 범위 : -2^31 ~ 2^31-1 = (-2147483648 ~ 2147483647)
** 여기까지의 입출력 범위는 기억을 해야 한다. **
2.6) long
a) 8 byte
b) 입출력 범위 : -2^64 ~ 2^63-1
c) 변수 선언시 : long lo = 12L or l
- 대문자 L을 뒤에 붙여 주는 것을 원칙으로 한다.
** 위의 다섯개(2.2) ~ 2.6))를 정수형 자료형이라고 이야기 한다. **
** 여기서 부터는 실수형(default 는 더블형이다.) **
2.7) float 9자리.7자리 까지 표시가능
2.8) double 17자리. 15자리 까지 표시가능
3) 자료형과 관련하여 기억해야 할 사항
3.1) 자바에서는 변수를 초기화 시키지 않으면 에러로 표시 된다.
3.2) 초기화 or 대입 시에 입출력 범위를 벗어날 수 없다.
예) C언어 : short s = 128; -> s 출력하면 -128 이 출력 됨. 128을 -128로 인식
java : byte b = 128; -> 컴파일 에러 발생
예외) byte b = 127; b++; <- b는 -128로 정상적으로 동작함.(java)
3.3) Java에서는 signed 와 unsigned를 구분하지 않는다.
- 유일하게 char만 구분이 가능하다.
3.4) 자바의 문자 처리는 Unicode(한글 100% 지원 가능) 자료 처리 이다.
- 변수명, 함수명을 한글로 사용 가능하다.
3.5 char의 초기화 형태 3가지
a) char ch = 'A';
b) char ch = 65;
c) char ch = '\u0041' <- 유니코드로 처리하는 체계(16비트) : 각나라의 언어를 표시하기 위해서 나타난 체계
16진수가 나타낼수 있는 비트수 4비트(4x4 = 16비트 가 됨)
3.6) ASCII 코트에서 기억할 것.
a) 0 null or '\0'
b) 8 '\b'
c) 9 '\t'
d) 10 '\n' <-
e) 13 '\r' <-
f) 27 ESC
g) 48~57 '0' ~ '9'
i) 65~90 'A' ~ 'Z'
j) 97~122 'a' ~ 'z'
** \r\n <- 의 순서로 리턴 처리를 해야 한다.(순서도 중요하다.)
- \r : 앞으로만 이동
- \n : 한칸 아래로만 이동
4) promotion 과 Casting
4.1) 개념 돌출 :
a) 탁구공을 넣어 놓은 박스가 젖었다면.. 다른 박스를 찾아야 한다. 그런데.. 큰 박스(축구공 상자) 밖에 없다.
이때 발생하는 문제를 두가지 형태로 처리하고 있다.(그것이 promotion 과 casting이다.
4.2) Promotion
a) 작은 공을 큰박스에 넣을 경우 공의 원형은 변하지 않는다.
b) 상수의 값이 변하지 않은 상태에서 그대로 옮길수 있는 경우를 promotion 이라고 한다.
4.3) Casting
a) 위와 반대의 경우.
b) 축구공을 탁구공 상자에 넣기 위해서 축구공 바람을 빼서 접어서 작은 상자에 넣는다.
c) 자료의 형태가 변해서 옮겨지는 형태를 Casting 이라고 하고, 이것을 자바의 형변환이라고 한다.
4.4) Promotion 과 Casting의 구분
a) 사각형의 면적과 삼각형의 면적이 동일 할때. 내용물을 옮겨도 데이타의 손실이 일어난다.(Casting)
- signed 와 unsigned의 형변환에서도 데이타의 손실이 일어난다.
b) byte -> short로 대입 할 경우. 1byte -> 2byte로 변환
byte b = 12;
short s = b; (promotion 이다.)
c) byte -> char로 대입하는 경우(삼각형 사각형의 경우 : byte는 signed이고, char은 unsigned 이다.)
-> casting 이다.
d) char -> int로 대입 될때는 promotion이다.(데이터를 충분히 포함하고 있으므로).
e) long -> float 로 대입은 promotion이다.(* 실수는 무조건 정수형보다 바이트 수에 상관 없이 큰 자료형이라고 생각한다.)
4.5) 캐스팅 방법
a) 캐스팅은 연산자 우선순위 2번째 이다.
b) 예 : 좌측편의 자료형의 형태로 변형해 주면 된다.
int i = 10;
byte k = (byte)i;
4.6) 주의 사항
a) 자바는 캐스팅을 정상적으로 안해주면 무조건 에러
b) boolean은 형변환이 불가능한 자료형이다.
c) 실수를 정수로 캐스팅 하면 소수점 아래는 무조건 버린다.
5) Wrapper 클래스
a) oop(캡슐화, 다형성, 상속성의 특징을 가짐)를 기반으로 해서 나온 언어가 자바이다.
b) 은닉화를 할수 없는 형태 : 자료형
- 자료형은 완벽한 캡슐화가 불가능하다. 이것을 보완하기 위해 나온 개념이 Wrapper Class 이다.
c) Wrapper 클래스를 만들고 사용하므로서 자료형을 완벽하게 은닉화 시켜줄 수 있다.
d) 아래의 Wrapper Class들은 java.lang 에 포함하고 있다.
Boolean
Byte
Short
Character
Integer
Long
Float
Double
String => C언어의 char* 형태와 동일
- String은 엄밀히 자료형은 아니지만 문자열 자료를 저장할 수 있다.(자료형 처럼 사용 가능)
6) 수업 중 연습 문제: Boolean와 Character를 제외한 나머지 여섯개의 Class는 MIN_VALUE와 MAX_VALUE(static형)을 가지고 있다.
Byte : -128(Byte.MIN_VALUE) ~ 127(Byte.MAX_VALUE)
의 특성을 이용하여 각 변수의 범위를 출력 하는 프로그램을 작성하시오.
a) 예제 관리 요령: classes -> 1231 폴더 만들고, 파일명을 Ex1231_01 로 만들것.
b) 자바에서 변수 출력하는 형식
- 출력 서식 자리에 데이터를 바로 집어 넣는다.
- System.out.println("Byte :" + i + " " ~ " + j);
* static field 는 객체 생성 없이 클래스 명으로 접근해야 한다.(객체로 접근이 불 가능 하다.)
-------------------------------------------------------------------------------------------------
2. 연산자 우선 순위 12 가지
a) 순서가 중요
b) 숫자 : 우선 순위 - 무엇을 먼저 처리할 것인가?
1) 최우선 순위 연산자 : . [] ()
a) . : 특정 객체 속에 멤버를 지정하는 연산자 이다.(참조 연산자:Java에서는 직접 간접으로 나누지 않는다.)
예) import java.lang.---
System.out.---
b) [] : 배열과 관련된 연산자
c) () : 괄호
2) 단항 연산자 : ! ~ +/- ++/--(전위형) (cast)
a) ! : 논리를 부정하는 연산자. (숫자 자체는 절대 논리가 될 수 없다. - C언어와 다른점)
- 숫자 앞에 쓰일수 없다.
- boolean 변수의 값이나, ture/false 로의 형태가 가능한 경우에만 사용 가능.
- 예) !(5>3)
boolean b = false;
System.out.println(!b); -> true
b) ~
- 계산식 : 원본데이터 * (-1) -1 : 비트단위로 부정을 한다.
- 예) ~(5) = 5 * -1 -1 = -6
~(-6) = (-6) * -1 -1 = 5
c) +/-
- 예) int i = 1;
int j = -2;
-2 * 2 --3 은 (-2) * 2 - (-3) 와 동일
d) ++/-- (전위형)
- 예) int i = 10;
int j = ++i; <- 전위형 j는 11가 됨, i도 물론 11
int i = 10;
int j = i++; <- 후위형 j = 10, i = 11이 됨.
3) 산술 연산자 : * / % + -
a) 주의 사항
- 4/3 = 1 이 됨 : 정수와 정수 연산에서 나오는 수는 정수가 된다.
- 실수와 정수의 연산에서 나오는 수는 실수
- 정수와 실수의 연산에서 나오는 수는 실수
b) 연산된 연후에는 큰수의 자료형을 따라 간다.
- short 와 int의 연산은 int가 된다.
3.1) 문자열 연산의 경우들
a) "ABC" + 12 => "ABC12" 가 된다.
- 문자열은 어떠한 데이타 타입 보다도 크다고 인식한다.
b) 12 + 34 + "ABC" => "46ABC" 가 된다.
- + 연산은 앞에서 부터 차례로 된다.
c) char ch =65;
char ch1 = 'B';
"ABC" + ch + ch1 => "ABCAB"
- 강한것은 정수이지만 문자가 먼저 표시 된다.
d) ch + ch1 + "ABC" => "131ABC"
- 정수가 강하기 때문에 먼저 연산 된다.
e) int i = 50;
char ch = '-'; //43
int j = 60;
50-60=-10 을 출력 하는 프로그램을 만드시오..
-> System.out.println( i + ch + j + "=" (i-j)); => 153 = -10 이렇게 출력됨.
"="을 만난 다음부터 문자열로 인식됨.
-> System.out.println("" + i + ch + j + "=" (i-j)); => 제대로 출력됨.
"" 부터 문자로 인식함.
3.2) (float)((int)3.7) / (float)2)
- 제일먼저 : ()연산자 수행
- 두번째 : 3 / 2.0F => 실수형을 따라감
- 세번째 : (float)1.5
4) 쉬프트 연산자 : >> << >>> - 32비트 체계로 일어난다.
a) <<
- 공식 : 원본데이터 * 2^이동변수
- 예) 1 << 3 = 1 * 2^3 = 8
b) >>
- 공식 : 원본데이터 * 1/2^이동변수
- 예) 8 >> 3 = 1
-8 >> 3 = -1
- 기본적으로 부호를 유지 시켜준다.
- 이동시 왼쪽 추가되는 양수는 부분에 0을 채우고, 음수는 1을 채운다.
c) >>> : unsigned right 쉬프트 연산자.
- +/- 어떠한 경우에도 +값을가지는 경우가 필요하다.(char형의 경우)
- 양수 이동시 0을 채우고, 음수 이동시도 0으로 채운다.
- 예) 100111110111 ... 10
>>> 8 이동 시키면.
000000001001 <- 8칸 0을 채우면서 이동한다.
5) 관계 연산자 : - 비교 : > < >= <=
- 항등 : == !=
a) 서로 비교해서 결과 값을 true와 false 로 나타낸다.
- 5 != 3 => true
- 5 == 3 => false
6). 비트 연산자 : & | ^ - 모두 비트로 바꿔 놓고 연산
a) & : 비트 별로 AND연산을 한다.(양쪽 모두 참이면 참)
b) | : (양쪽 모두 거짓일 경우만 거짓)
c) ^ : XOR (서로 다를경우만 참)
7) 논리 연산자 : && ||
a) && : 논리에서 양쪽의 논리가 참이면 참.
b) || : 논리에서 둘중 하나가 참이면 참.
c) 예) 5>3 && 4<3 => false
d) 자바의 단락회로
5 < 3 && 4 > 3
- 왼쪽에서 오른쪽으로 프로그램을 실행하다보면. && 에서 거짓임이 판명됨. 뒷부분을 수행하지 않고 실행됨.
- 그런데 아래와 같은 경우
boolean aaa() {
cout <<"AAA";
return false;
}
boolean bbb() {
cout << "BBB";
return true;
}
if(aaa() && bbb()) {
-> aaa()만 실행되고, 뒤에 것은 실행 되지 않는다.
e) &, | 를 통해서 강제로 논리 연산을 할수 있도록 Java에서 배려를 해 놓았다.
if(aaa() & bbb()) {
- 비트연산자도 논리 연산자로 사용할 수 있다.
8) 삼항 연산자 : (조건) ? 항1 : 항2
a) 조건이 참이면 앞에 항을 실행하고, 조건이 거짓이면 항2를 실행한다.
b) C언어는 i == 0 ? printf("i=0입니다.") : printf("i=0이 아닙니다."); 로 실행 가능하다.
그러나 자바는 반복문구를 허용하지 않는다.
그러므로 printf("%s", i==0 ? "i____" : "i___"); 형식으로 처리해야 한다.
c) Java에서는 ; 이 달려있는 하나의 문장에서 동일한 문장이 들어가 있으면 파악하지 못한다.
System.out.println(i==0? "i==0" : "i !=0");
9) 배정 연산자 : += -= *= /= %= <<= >>= ^= &= |=
a) 피연산자 자체에 다른 값이 산술 연산될 때 배정연산자를 사용.
i = i + 5; 보다는
i += 5; 의 형태를 사용.
10) 대입 연산자 : =
11) 후위 연산자 : ++/--(후위형) => 앞에서 설명
12) 순차 연산자 : ,
- 차례차례 연산 된다.
C언어와 차이점과 우선순위를 기억해야 한다.
-------------------------------------------------------------------------------------------------
3. Java의 기본 I/O
1) 입력
a) ASCII 입력 : System.in.read();
b) 문자 입력 : (char)System.in.read();
c) 숫자 입력 : System.in.read() - '0' or 48;
2) 문자열 숫자열
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
a) 문자열 입력
String str = br.readLine();
b) 숫자열 입력
String imsi = br.readLine();
int i = Integer.parseInt(imsi);
3) 필요 Package
java.io.*
4) 예외 처리(입력 부분은 예외처리를 해주는 메소드가 없기 때문에 무조건 해야 한다.)
a) throws 예외 처리
- 지금 현재 멈춘 것은 예외다 하고 예외 처리 하는 것.
- 방법 : 어떠한 함수 뒤와 블럭시작 전에 throws IOException 라고 적어주면 그부분이 통과 시켜 달라고 알려주는 것임을 의미한다.
- 예 : public static void main (String [] ar) throws IOException {
}
b) try ~ catch ~ finally
- 예외 전가(바로 바로 처리해주는것.)
5) 자바의 또 다른 특징
JVM이 희한한 기능을 하나 가지고 있다.
프로그램이 진행하다 멈추면 무조건 에러라고 출력함.
이로 인하여 출력시 대기, 입력대기 및 네트웍 접속 전송등의 경우에 에러라고 처리하게됨.
그래서 출력시 원래는
System.out.write("Hello Java"); 작성해야 하지만 다음 문장은
-> 에러로 처리됨.
-> 프로그래머가.이렇게 한것은 예외다 하고 알려 주어야 한다.
println은 내부에서 예외 처리 메소드를 포함하고 있기 때문에
출력시에는
System.out.println('A' + 'B' + "ABC"); => 131ABC 출력
과 같이 사용할 수 있다.
3.1) 보충 설명
* Java의 기본 I/O
1. 입력
입력은 inputStream 속에 있는 read() 밖에 없다.
System(키보드, 화면)
1) ASCII 입력 : System.in.read();
char ch = getchar(); 과 동일
char i = (char)System.in.read();
2) 문자 입력 : (char)System.in.read();
3) 숫자 입력 : System.in.read() - '0' or 48;
2. 문자열 숫자열 입력
자바의 I/O는 30가지가 있고 그 중에 한가지 형식중 하나가 아래껏임.
InputStreamReader is = new InputStreamReader(System.in);
문자열로 변환 키보드(ASCII)로 부터 받은 입력을
BufferedReader br = new BufferedReader(is);
// 클래스 할때 다시 설명.
- 문자열 숫자열 입력시 위의 것을 외워서 void main 아래 두줄로 적을 것.
1) 문자열 입력
String str = br.readLine();
- 키보드에서 엔터키가 있을때 까지 입력 받음.
2) 숫자열 입력(문자열을 가져와서 숫자의 형식으로 변환 시켜주어야한다.)
- 이때 문자열을 숫자로 변환 시켜 주는 과정을.. 파싱이라고 한다.
String imsi = br.readLine();
int i = Integer.parseInt(imsi);
- char 과 boolean을 제외하고는 모두 파싱을 시켜 줄수 있다.(문자열을 숫자로)
-------------------------------------------------------------------------------------------------
문자 및 숫자 입력 예제)
import java.io.*;
public class Ex1231_02{
public static void main(String[] ar) throws IOException{
//System.out.print("아스키 = ");
//int i = System.in.read();
//System.out.print("문자 = ");
//char i = (char)System.in.read();
System.out.print("숫자 = ");
int i = System.in.read() - '0';
System.out.println("입력된 숫자 = " + i);
}
}
문자열 입력 예제)
import java.io.*;
public class Ex1231_03{
public static void main(String[] ar) throws IOException{
//InputStreamReader is = new InputStreamReader(System.in);
//BufferedReader br = new BufferedReader(is);
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String name = null;
int age = 0;
System.out.print("이름 = ");
name = br.readLine();
System.out.println("당신의 이름 = " + name);
System.out.print("나이 = ");
//String imsi = br.readLine();
//age = Integer.parseInt(imsi);
age = Integer.parseInt(br.readLine());
System.out.println("당신은 만 " + (age - 1) + "세 입니다.");
}
}
================================================================================================
자료형과 연산자 우선 순위에 대해 다뤄놓은 문제를 책에서 발취해 왔습니다.
생각이 좀 필요한 문제이니 풀어보시고 답글 달아보세요.. ㅎㅎ..
------------------------------------------------------------------------------------------------
public class PuzzlersChapter2 {
public static void main(String[] args) {
// 참고자료 : 유쾌한 자바퍼즐러(송치형/박준상 공역 - 사이텍미디어)
System.out.println("1. ----------------------------------");
// 1. 무엇이 출력되며? 이유는 무엇인가?(page 7)
System.out.println(2.00 - 1.10);
System.out.println("2. ----------------------------------");
// 2. 무엇이 출력되며? 이유는 무엇인가?(page 9)
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
System.out.println("3. ----------------------------------");
// 3. 무엇이 출력되며? 이유는 무엇인가?(page 15)
System.out.println((int)(char)(byte) -1);
// 4. 무엇이 출력되며? 이유는 무엇인가?(page 15)
System.out.println("4. ----------------------------------");
char x = 'X';
int i = 0;
System.out.print(true ? x : 0);
System.out.print(false ? i : x);
System.out.println();
// 5. 무엇이 출력되며? 이유는 무엇인가?(page 27)
System.out.println("5. ----------------------------------");
System.out.println("H" + "a");
System.out.println('H' + 'a');
// 6. 무엇이 출력되며? 이유는 무엇인가?(page 29)
System.out.println("6. ----------------------------------");
String letters = "ABC";
char [] numbers = { '1', '2', '3' };
System.out.println(letters + " easy as " + numbers);
// 7. 무엇이 출력되며? 이유는 무엇인가?(page 31)
System.out.println("7. ----------------------------------");
final String pig = "length: 10";
final String dog = "length: " + pig.length();
System.out.println("Animals are equal: " + pig == dog);
// 8. 무엇이 출력되며? 이유는 무엇인가?(page 33)
System.out.println("8. ----------------------------------");
// \u0022는 겹따옴표(")에 대한 유니코드 이스케이프이다.
System.out.println("a\u0022.length() + \u0022b".length());
// 9. 무엇이 출력되며? 이유는 무엇인가?(page 45)
System.out.println("9. ----------------------------------");
System.out.println(PuzzlersChapter2.class.getName().replaceAll(".", "/") + ".class");
// 10. 컴파일이 가능한가? 이유는?(page 49)
System.out.println("10. ----------------------------------");
System.out.println("iexplore:");
http://www.google.com;
System.out.println(":maximize");
System.out.println("-------------------------------------");
}
}
------------------------------------------------------------------------------------------------
>>>>> Bit 연산 테스트용(toBinary, toHex)
쉬프트 연산자랑 Bit 관련 연산자를 테스트 하기 위하여, 아래의 프로그램을 만들어 봤습니다.
10진수를 2진수 혹은 16진수 형태로 출력하는 프로그램입니다.
그럼 참조하세요.
작성자 : litwave
----------------------------------------------------------------------------------------
public class Demo {
/**
* 10 진수를 2 진수로 변환한다.
*/
public String toBinary(int number, int bit) {
StringBuffer retSb = new StringBuffer();
int basisNumumber = 0x1;
for(int index=bit-1; index>=0; index--) {
if((number & (basisNumumber << index)) != 0) {
retSb.append("1");
} else {
retSb.append("0");
}
if(index % 4 == 0) retSb.append(" ");
}
return retSb.toString();
}
/**
* 10 진수를 16 진수로 변환한다.
*/
public String toHex(int number, int bit) {
StringBuffer retSb = new StringBuffer();
int basisNumumber = 0xF;
int imsi;
for(int index=bit-4; index>=0; index-=4) {
imsi = ((number >> index) & basisNumumber);
if(imsi < 10) {
retSb.append((char)('0' + imsi));
} else {
retSb.append((char)('A' + imsi - 10));
}
}
return retSb.toString();
}
public static void main(String[] args) {
Demo demo = new Demo();
int input = 0x0FFFFFFF;
int result = input >>> 4;
System.out.println("2진수 테스트");
System.out.println("input [binary] : " + demo.toBinary(input, 32) + ", [value] : " + input);
System.out.println("result[binary] : " + demo.toBinary(result, 32) + ", [value] : " + result);
System.out.println("result[binary] : " + demo.toBinary((0x00F0 & 0x00C0), 32));
System.out.println("\n 16진수 테스트");
input = 0x0A0280F;
System.out.println("input [binary] : " + demo.toHex(input, 32) + ", input [value] : " + input);
System.out.println("result[binary] : " + demo.toHex((0x00F0 & 0x00C0), 32));
}
}
'scrap > Java/JSP' 카테고리의 다른 글
- [Java 기본]메소드, 1차원 배열 (0) | 2011.05.14 |
---|---|
- [Java 기본]제어문 (0) | 2011.05.14 |
- [Java 기본]Java 설치, 개념, 주석 (0) | 2011.05.14 |
- Java 코딩 지침 (0) | 2011.05.14 |
[JAVA] Robot 클래스를 이용한 Screen Capture 코드 (1) | 2011.03.29 |