명품 자바 프로그래밍 2장
2.1 자바 프로그램 구조
public class Hello {
public static int sum(int n,int m) {
return n+m;
}
public static void main(String[]args) {
int i=20;
int s;
char a;
s=sum(i,10);
a='?';
System.out.println(a);
System.out.println("Hello");
System.out.println(s);
}
}
클래스 만들기
public class Hello {
...
}
주석문
//이런게
/*
주석문
이다
*/
main()메소드
public static void main(String[]args) {
...
}
메소드
public static int sum(int n,int m) {//매개변수 n,m
return n+m;//n+m리턴
}
메소드 sum()을 호출하는 코드.
int i=20;
int s;
s=sum(i,10);
변수 선언
int i=20;
int s;
char a;
문장
s=sum(i,
20);
화면 출력
System.out.println(3);//3 출력
System.out.println("Hello");//"Hello"문자열 출력
System.out.println(2*5);//10 출력
2.2 식별자
- 특수문자(%,*,Y,^,@,!,...) 공백(탭, space, ...) 사용 불가. 예외로 '_', '$' 사용 가능
- if, while, class 등 자바 언어 키워드 사용 불가
- 식별자의 첫 번째 문자로 숫자 사용 불가능
- '_', '$' 식별자 첫 번째 문자로 가능은 하지만 잘 안씀
- 대소분자 구별
- 길이 제한 없음
관습
- 클래스 이름의 첫 글자는 주로 대문자로 시작. 여러 단어 모이면 각 단어 첫 번째 글자 대문자.
- 변수, 메소드의 첫 글자 주로 소문자
- 상수는 이름 전체를 대문자
final int ALPHA=30;
2.3 자바의 데이터 타입
기본 타입(basic type) : 8가지
- boolean : 1bit
문자
- char: 2byte(Unicode)
정수형
- byte: 1byte(-128~127)
- short: 2byte(-32768~32767)
- int: 4byte($-2^{31}~2^{31}-1$)
- long: 8byte
실수형
- float: 4byte
- double: 8byte
기본타입에 속하지 않는 문자열(자바 라이브러리에서 제공하는 String 클래스 이용)
- String
자바에서는 문자열과 기본 타입의 + 연산 실행되면 기본 타입 값이 문자열로 바뀌고 두 문자열이 연결된 새로운 문자열 생성
String toolName="JDK"
toolName+1.8 //->JDK1.8
"("+3+","+5+")" //->(3,5)
System.out.println(toolName+"이 출시됨");//"JDK1.8이 출시됨" 출력
레퍼런스 타입(reference type)
c/c++의 포인터와 비슷한 개념. 다만 포인터와 달리 실제 주소값 갖지 않음.
레퍼런스 타입은 한 가지이지만 용도는 세 가지
- 배열에 대한 레퍼런스
- 클래스(class)에 대한 레퍼런스
- 인터페이스(interface)에 대한 레퍼런스
리터럴
리터럴이란 프로그램에 직접 표현한 값.
정수, 실수, 문자, 논리, 문자열 타입 모두 리터럴 존재
34, 42.195, '%', true, "hello"
- 정수 리터럴
- int 타입으로 자동 컴파일 됨. long 타임으로 저장하고 싶으면 L 또는 l 붙이면 된다.
- 실수 리터럴
- 소수점 형태나 지수(exponent)형태
- double형으로 자동 처리됨.
- float으로 저장하기 위해서는 f나 F를 붙이고, d나 D 붙이면 double로 강제 변환 가능
- 문자 리터럴
- 단일 인용 부호(' ')로 문자를 표현하거나 \u 다음에 문자의 유니코드값 사용해서 표현
'w', 'A', \u0041
- 특수문자 리터럴
- 백슬래시(\)다음에 특수기호 붙여 표현
종류 | 의미 | 종류 | 의미 |
\b | 백스페이스 | \r | 캐리지 리턴 |
\t | 탭(tab) | \" | 이중 인용부호 |
\n | 라인피드 | \' | 단일 인용부호 |
\f | 폼피드 | \\ | 백슬래시 |
- 논리 리터럴과 boolean 타입
- 논리 리터럴은 true, false 두 가지. boolean 변수에 직접 치환하거나 조건문에 사용.
상수
변수 선언시 final 키워드 사용
final double PI=3.14;
상수는 변경 불가능
PI=1.5//컴파일 에러
타입 변환
- 자동 타입 변환
치환문(=)이나 수식 내 타입 일치하지 않을 때 작은타입->큰 타입으로 자동형변환
long m=25;//int 리터럴 25가 long타입으로 자동 변환
double d=3.14*10;//실수 연산을 위해 정수 리터럴 10이 10.0으로 자동 변환
- 강제 타입 변환
개발자가 강제로 타입 변환.
int n=100;
byte by=n;//컴파일 에러. int(큰)->byte(작은)으로 자동 변환 안됨.
byte b=(byte)n;
강제 타입 변환을 캐스팅(casting)이라고도 부름
2.4 자바에서 키 입력
System.in
표준 입력 스트림 객체. 사용자로부터 키를 입력 받을 수 있음.
Scanner를 이용한 키 입력
import문 사용
- Scanner 클래스 java.util 패키지에 있음
import java.util.Scanner
Scanner 객체 생성
Scanner scan=new Scanner(System.in);
Scanner 클래스로 키 입력받기
String name=scan.next();
String city=scan.next();
int age=scan.nextInt();
double weight=scan.nextDouble();
boolean isSingle=scan.nextBoolean();
boolean hasNext() | 현재 입력된 토큰이 있으면 true, 아니면 입력 때까지 무한정 대기. 새로운 입력 들어올 때 true 리턴. crtl-z키 입력되면 입력 끝이므로 false 리턴 |
void close() | Scanner 사용 종료 |
String next() | 다음 토큰을 문자열로 리턴 |
byte nextByte() | 다음 토큰을 byte 타입으로 리턴 |
short nextShort() | 다음 토큰을 short 타입으로 리턴 |
int nextInt() | 다음 토큰을 int 타입으로 리턴 |
long nextLong() | 다음 토큰을 long 타입으로 리턴 |
float nextFloat | 다음 토큰을 float 타입으로 리턴 |
double nextDouble | 다음 토큰을 double 타입으로 리턴 |
boolean nextBoolean | 다음 토큰을 boolean 타입으로 리턴 |
String nextLine() | '\n'을 포함하는 한 라인을읽고 '\n'을 버린 나머지 문자열리턴 |
nextLine()과 next()
- "Seoul Korea"처럼 공백이 낀 문자열을 입력받기 위해서는 nextLine()
- 공백을 기준으로 구분하는 next()
.close()
- Scanner 객체 사용 종료. System.in도 사용할 수 없음.
- scanner 닫은 후 다시 scanner로 키 입력받을 수 없음.
- .close()없으면 컴파일 시 경고 발생하지만 문제는 없음. 프로그램 종료시 자동으로 닫힘.
2.5 연산
연산자 우선순위
++(postfix) --(postfix) |
+(양수 부호) -(음수 부호) ++(prefix) --(prefix) ! ~ |
형 변환(type casting) |
* / % |
+(덧셈) -(뺄셈) |
<< >> >>> |
< > <= >= instanceof |
== != |
&(비트 AND) |
^(비트 XOR) |
|(비트 OR) |
&&(논리 AND) |
||(논리 OR) |
? : (조건) |
= += -= *= /= %= &= ^= |= <<= >>= >>>= |
산술연산
더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%)의 5개
증감연산
++, --의 두 가지. 피연산자의 앞 또는 뒤에 붙어 값을 1 증가시키거나 1 감소시킴
a++ | a를 1 증가시키고 증가 전 값 반환 | ++a | a를 1 증가시키고 증가된 값 반환 |
a-- | a를 1 감소시키고 감소 전 값 반환 | --a | a를 1 감소시키고 감소된 값 반환 |
내가 헷갈렸던 부분 : a++, a--가 후위식인데 왜 우선순위는 2순위로 높은 지 이해를 못 했었다. 그런데 후위연산 실행 후 증가/감소 전 값을 반환하는 것 이므로 우선순위는 높지만 값은 이전 값을 반환한다.
대입연산
연산자 오른쪽 식의 결과를 왼쪽에 있는 변수에 대입.
int a=1, b=3;
a=b;//b값을 a에 대입해서 a=3
a+=b;//a=a+b의 연산이 이루어져 a=6
비교연산과 논리연산
비교 연산자: 두 개의 피연산자를 비교해 true 혹은 false의 논리 값을 내는 연산자
논리 연산자: 논리 값을 대상으로 AND, OR, XOR, NOT의 논리 연산을 하여 논리 값을 내는 연산자.
연산자 | 내용 | 예제 | 결과 |
!a | a가 true이면 flase, false이면 true | !(3<5) | false |
a||b | a와 b의 OR 연산. a와 b 모두 false인 경우에만 false | (3>5)||(1==1) | true |
a&&b | a와 b의 AND 연산. a와 b 모두 true인 경우에만 true | (3<5)&&(1==1) | true |
a^b | a와 b의 XOR 연산. a와 b 서로 다를 때 true | (3>5)^(1==1) | true |
비교 연산자와 논리 연산자 복합 사용 가능.
(age>=20) & (age<30) //나이(int age)가 20대인 경우
이 코드를 다음과 같이 쓰면 오류
20<=age<30//오류
조건연산
3개의 피연산자로 구성되어 삼항(ternary) 연산자 라고도 하며 다음과 같은 형식을 가짐.
condition ? opr2 : opr3
위 식에서 조건문(condition)이 true이면 결과 값은 opr2의 값이 되고, false이면 opr3의 값이 된다. opr2나 opr3은 식이 될 수도 있고 값이 될 수도 있다.
int x=5;
int y=3;
int s=(x>y)?1:-1;//x가 y보다 크기 때문에 1이 s에 대입된다.
비트연산
비트 개념
컴퓨터의 모든 정보는 0과 1의 2진수로 다루어지고 저장됨. 2진수 한 자리를 비트(bit)라 부르며, 8개의 비트를 바이트(byte)라 한다.
비트 논리 연산
비연산자의 각 비트들끼리 이루어지는 AND, OR, XOR, NOT의 논리연산.
연산자 | 별칭 | 내용 |
a&b | AND 연산 | 두 비트 모두 1이면 1, 아니면 0 |
a|b | OR 연산 | 두 비트 모두 0이면 0, 아니면 1 |
a^b | XOR 연산 | 두 비트 다르면 1, 같으면 0 |
~a | NOT 연산 | 1을 0으로, 0을 1로 |
비트 시프트 연산
옆으로 한 자리 이동이 시프트(shift). 비트 시프트 연산(shift operator)은 아래 표의 3개 연산자를 이용해 새로운 비트를 오른쪽이나 왼쪽 끝에 삽입하면서 비트의 자리를 이동시키는 연산. 시프트되는 방향에 따라 끝에 있는 비트는 사라지게 된다.
연산자 | 내용 |
a>>b | a의 각 비트를 오른쪽으로 b번 시프트. 최상위 비트의 빈자리는 시프트 전의 최상위 비트로 다시 채운다. |
a>>>b | a의 각 비트를 오른쪽으로 b번 시프트. 최상위 비트의 빈자리는 항상 0으로 채운다. |
a<<b | a의 각 비트를 왼쪽으로 b번 시프트. 최하위 비트의 빈자리는 항상 0으로 채운다. |
시프트 연산자의 피연산자는 byte, short, int, long, char 타입만 가능하고 float, double, boolean은 사용할 수 없다.
2.6 조건문
단순 if 문
if-else 문
다중 if-else 문
중첩 if-else 문
switch문
값에 따라 여러 방향으로 분기하는 경우 if보다 switch를 사용하면 가독성이 높은 좋은 코드를 작성할 수 있다.
- switch문은 먼저 '식'을 계산하고 그 결과 값과 일치하는 case문으로 분기한다.
- case문의 '실행문장'을 실행한 후 break 만나면 switch문 벗어난다.
- 만일 어떤 case문으로 분기하지 못하는경우 default문으로 분기하여 '실행문장 n'을 실행한다
- default문은 생략 가능하며 실행 문장은 {}로 불러싸지 ㅇ낳는다.
switch문 내의 break문
switch문 내의 break문은 중요하다. case문에 break문이 없다면 break문을 만날 때 까지 case문의 '실행문장'으로 계속 실행한다.
즉, case문에서 break가 없으면 break를 만날 때 까지 아래의 '실행문장'을 계속 실행한다.
case문의 값
case문은 식의 결과 값을 case문의 값과 비교한다. case문의 값은 정수 리터럴, 문자열 리터럴만 허용한다.
case문에는 변수나 식을 사용할 수 없다.
'Language > Java' 카테고리의 다른 글
[명품 Java Programming]4장 클래스와 객체 (0) | 2020.07.11 |
---|---|
[명품 Java Programming]3장 연습문제 (0) | 2020.07.11 |
[명품 Java Programming]3장 반복문과 배열 그리고 예외 처리 (0) | 2020.07.11 |
[명품 JAVA Programming]2장 연습문제 (0) | 2020.07.08 |
[명품JAVA Programming] 1장 자바 시작 (0) | 2020.07.07 |
댓글