본문 바로가기
Language/Java

[명품 JAVA Programming] 2장 자바 기본 프로그래밍

by DEV Lee 2020. 7. 8.

명품 자바 프로그래밍 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문에는 변수나 식을 사용할 수 없다.

 

 

 

 

 

댓글