[Java] 자바 기본 내용 정리 || Java Basic Programming
1. 자바 시작
- 프로그래밍 언어
기계어(Machine Language) : 이진수 명령어들로 구성된 언어
어셈블리어(Assembly Language) : 기계어의 명령을 니모닉 기호로 일대일 대응시킨 언어
컴퓨터가 이해할 수 있도록 기계어 코드로 변환하는 것은 컴파일(Compile) 과정이다.
[ .java → .class ]
< 개발 편의성에 따라 >
저급 언어 : 기계가 이해할 수 있도록 만들어진 언어
고급 언어 : 개발자가 소스 코드를 작성할 때, 쉽게 이해할 수 있도록 만들어진 언어
< 실행하는 방식에 따라 >
명령형 언어 : ( = 절차형 언어) 명령어들이 순차적으로 실행되는 프로그래밍 방식
객체 지향 언어 : 객체 간의 메시지 통신을 이용한 프로그래밍 방식
- 자바 특징
자바 가상 기계(JVM) : 서로 다른 플랫폼에서 자바 프로그램이 실행되도록 동일한 환경 제공
바이트 코드 : 자바 가상 기계에서만 실행되는 기계어
하나의 실행 파일(.exe)로 뭉치는 링크의 과정이 없고, 필요에 따라 클래스 파일을 로딩하고 실행한다.
JDK(Java Development Kit) : 자바 컴파일러 등의 개발 도구 + JRE(Java Run Environment)
JRE : 자바 API + 자바 가상 기계(JVM)
자바 API : 사용하기 위해 이미 만들어둔 자바 클래스 집합
플랫폼 독립성 : 자바 가상 기계(JVM)이 있으면, 어디서나 항상 동일한 실행 결과를 기대할 수 있다. WORA(Write One Run Anywhere)
객체 지향 : 캡슐화, 다형성, 상속을 지원한다.
클래스 파일에는 반드시 하나의 클래스만 들어있고, 오직 한 클래스만 public으로 선언할 수 있다.
서로 관련 있는 클래스를 묶어 패키지로 관리한다.
멀티 스레드 : 다수의 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있다.
가비지 컬렉션 : 메모리를 반환하는 기능이 없지만, 가비지 컬렉션을 통해 자동으로 회수된다.
2. 자바 기본
- 클래스 & main( ) 메소드
클래스 밖에 어떤 것도 작성해서는 안 된다.
main( )은 반드시 public, static, void 타입으로 선언되어야 한다.
한 클래스에 2개 이상의 main( )을 작성하면 안 된다.
- 식별자
목적에 맞는 이름을 붙이는 것이 좋다.
충분히 긴 이름으로 붙여 역할 전달이 쉽도록 한다.
클래스 이름 : 파스칼 표기법 (HelloWorld)
변수, 메서드 이름 : 카멜 표기법 (helloWorld)
상수 이름 : 모두 대문자 (HELLO)
- 데이터 타입
기본 타입 (8개) : boolean, char, byte, short, int, long , float, double
레퍼런스 타입 (1개) : 용도에 따라 배열, 클래스, 인터페이스에 대한 레퍼런스
자바에서는 영어, 한글 상관없이 문자 하나는 2바이트의 유니코드로 저장된다.
문자열은 기본 타입에 속하지 않으며, String 클래스 이용한다.
리터럴(literal) 이란 프로그램에 직접 표현한 값
- 정수 리터럴
( 0으로 시작 X : 10진수 / 0으로 시작 : 8진수 / 0x로 시작 : 16진수 / 0b로 시작 : 2진수 )
- 실수 리터럴 (f나 F : float, d나 D : double)
- 문자 리터럴 (단일 인용부호인 ' ' 혹은 \u유니코드)
- 특수 문자 리터럴 (\b, \t, \n, \f 등)
- 논리 리터럴 (true, false만 있다)
기본 타입 이외의 리터럴
- null 리터럴
- 문자열 리터럴
지역 변수에 var 키워드를 사용하면, 자동으로 변수 타입이 결정된다.
- Scanner
import문 사용
import java.util.Scanner;
객체 생성
Scanner scanner = new Scanner(System.in);
next( ) VS. nextLine( )
공백 없이 문자를 읽을 땐, next( )
공백이 낀 문자열을 읽을 땐, nextLine( ) [ 입력이 없을 경우 "" 빈 문자열 리턴)
객체 닫기
scanner.close();
[ 응용 프로그램 전체에 Scanner 객체 하나만 생성하고 공유하는 것이 바람직하다.]
- 연산자 우선순위
증산시 관비 논삼대
- 조건문
- if ~ else if ~ else
- switch ~ case ~ default (case문의 값은 정수 & 문자 & 문자열 리터럴만 허용, 변수나 식은 X)
실습 문제
import java.util.Scanner;
public class BasicExample {
Scanner sc = new Scanner(System.in);
void Ex01(){
System.out.println("---------[Ex01]---------");
System.out.print("원화를 입력하세요(단위 원)>>");
int won = sc.nextInt();
System.out.println(won + "원은 $" + won/1100.0 + "입니다.");
}
void Ex02(){
System.out.println("---------[Ex02]---------");
System.out.print("2자리수 정수 입력(10~99)>>");
int num = sc.nextInt();
int x = num % 10, y = num / 10;
if (x == y) {
System.out.println("10의 자리와 1의 자리가 같다.");
} else {
System.out.println("10의 자리와 1의 자리가 다르다.");
}
}
void Ex03() {
System.out.println("---------[Ex03]---------");
System.out.print("금액을 입력하시오>>");
int money = sc.nextInt();
System.out.println("오만원권 " + money / 50000 + "매");
money %= 50000;
System.out.println("만원권 " + money / 10000 + "매");
money %= 10000;
System.out.println("천원권 " + money / 1000 + "매");
money %= 1000;
System.out.println("백원 " + money / 100 + "개");
money %= 100;
System.out.println("오십원 " + money / 50 + "개");
money %= 50;
System.out.println("십원 " + money / 10 + "개");
money %= 10;
System.out.println("일원 " + money / 1 + "개");
}
void Ex04() {
System.out.println("---------[Ex04]---------");
System.out.print("정수 3개 입력>>");
int x = sc.nextInt(), y = sc.nextInt(), z = sc.nextInt();
if (x > y && x < z) {
System.out.println("중간 값은 " + x);
} else if (y > x && y < z) {
System.out.println("중간 값은 " + y);
} else {
System.out.println("중간 값은 " + z);
}
}
void Ex05() {
System.out.println("---------[Ex05]---------");
System.out.print("정수 3개 입력>>");
int x = sc.nextInt(), y = sc.nextInt(), z = sc.nextInt();
if ((x + y > z) && (x + z > y) && (y + z > x)) {
System.out.println("삼각형이 가능하다.");
} else {
System.out.println("삼각형이 되지 않는다.");
}
}
void Ex06() {
System.out.println("---------[Ex06]---------");
System.out.print("1~99 사이의 정수를 입력하시오>>");
int x = sc.nextInt();
int a = x / 10;
int b = x % 10;
if (a == 3 || a == 6 || a == 9) {
if (b == 3 || b == 6 || b == 9) {
System.out.println("박수짝짝");
} else {
System.out.println("박수짝");
}
}else if (b == 3 || b == 6 || b == 9) {
System.out.println("박수짝");
} else {
System.out.println("박수를 치지 않는다.");
}
}
void Ex07() {
System.out.println("---------[Ex07]---------");
System.out.print("점 (x,y)의 좌표를 입력하시오>>");
int x = sc.nextInt(), y = sc.nextInt();
if ((x >= 100 && x <= 200) && (y >= 100 && y <= 200)) {
System.out.println("(" + x + "," + y + ")는 사각형 안에 있다.");
} else {
System.out.println("(" + x + "," + y + ")는 사각형 안에 없다.");
}
}
public static boolean inRect(int x, int y) {
if ((x >= 100 && x <= 200) && (y >= 100 && y <= 200)) {
return true;
}
return false;
}
void Ex08() {
System.out.println("---------[Ex08]---------");
System.out.print("점 (x1,y1)의 좌표를 입력하시오>>");
int x1 = sc.nextInt(), y1 = sc.nextInt();
System.out.print("점 (x2,y2)의 좌표를 입력하시오>>");
int x2 = sc.nextInt(), y2 = sc.nextInt();
if (inRect(x1, y1) || inRect(x2, y2)) {
System.out.println("두 직사각형은 충돌한다.");
} else {
System.out.println("두 직사각형은 충동하지 않는다.");
}
}
void Ex09() {
System.out.println("---------[Ex09]---------");
System.out.print("원의 중심과 반지름 입력>>");
double x = sc.nextDouble(), y = sc.nextDouble(), r = sc.nextDouble();
System.out.print("점 입력>>");
double a = sc.nextDouble(), b = sc.nextDouble();
// 원 중심과 입력된 점의 거리
double distance = Math.sqrt((x - a)*(x - a) + (y - b) * (y - b));
if (distance > r) {
System.out.println("(" + a + "," + b + ")는 원 안에 없다.");
} else {
System.out.println("(" + a + "," + b + ")는 원 안에 있다.");
}
}
void Ex10() {
System.out.println("---------[Ex10]---------");
System.out.print("첫번째 원의 중심과 반지름 입력 >>");
double x1 = sc.nextDouble(), y1 = sc.nextDouble(), r1 = sc.nextDouble();
System.out.print("두번째 원의 중심과 반지름 입력 >>");
double x2 = sc.nextDouble(), y2 = sc.nextDouble(), r2 = sc.nextDouble();
double distance = Math.sqrt((x1 - x2) *(x1 - x2) + (y1 - y2) * (y1 - y2));
if (distance > (r1 + r2)) {
System.out.println("두 원은 겹치지 않는다.");
} else {
System.out.println("두 원은 서로 겹친다.");
}
}
void Ex11_1() {
System.out.println("---------[Ex11_1]---------");
System.out.print("달을 입력(1~12)>>");
int x = sc.nextInt();
if (x >= 3 && x <= 5) {
System.out.println("봄");
} else if (x >= 6 && x <= 8) {
System.out.println("여름");
} else if (x >= 9 && x <= 11) {
System.out.println("가을");
} else if (x == 12 || x == 1) {
System.out.println("겨울");
} else {
System.out.println("잘못입력");
}
}
void Ex11_2() {
System.out.println("---------[Ex11_2]---------");
System.out.print("달을 입력(1~12)>>");
int x = sc.nextInt();
switch (x) {
case 3:
case 4:
case 5:
System.out.println("봄");
break;
case 6:
case 7:
case 8:
System.out.println("여름");
break;
case 9:
case 10:
case 11:
System.out.println("가을");
break;
case 12:
case 1:
System.out.println("겨울");
break;
default:
System.out.println("잘못입력");
}
}
void Ex12_1() {
System.out.println("---------[Ex12_1]---------");
System.out.print("연산>>");
double a = sc.nextDouble();
String x = sc.next();
double b = sc.nextDouble();
if (x.equals("+")) {
System.out.println(a + x + b + "의 계산 결과는 " + (a+b));
} else if (x.equals("-")) {
System.out.println(a + x + b + "의 계산 결과는 " + (a-b));
} else if (x.equals("*")) {
System.out.println(a + x + b + "의 계산 결과는 " + (a*b));
} else if (x.equals("/")) {
if (b == 0) {
System.out.println("0으로 나눌 수 없다.");
} else {
System.out.println(a + x + b + "의 계산 결과는 " + (a/b));
}
}
}
void Ex12_2() {
System.out.println("---------[Ex12_2]---------");
System.out.print("연산>>");
double a = sc.nextDouble();
String x = sc.next();
double b = sc.nextDouble();
switch (x) {
case "+":
System.out.println(a + x + b + "의 계산 결과는 " + (a+b));
break;
case "-":
System.out.println(a + x + b + "의 계산 결과는 " + (a-b));
break;
case "*":
System.out.println(a + x + b + "의 계산 결과는 " + (a*b));
break;
case "/":
if (b == 0) {
System.out.println("0으로 나눌 수 없다.");
} else {
System.out.println(a + x + b + "의 계산 결과는 " + (a/b));
}
break;
}
}
public static void main(String[] args) {
BasicExample ex = new BasicExample();
ex.Ex01();
}
}
참고) 명품 자바 프로그래밍 1 ~ 2장 + 실습 문제