전체적으로 아는 내용 & 기본적인 내용은 생략
프로젝트 생성 (교재에서는 JavaSE-11로 작성)
[File] - [New] - [Java ProJect] - 이후 module Create
module-info.java에서 {} 안에 requires java.se;작성
(다른 모듈에 있는 API를 사용하고 싶다면 등록)
소스파일 생성 & 작성
src 폴더 선택 - 우클릭 - [New] - [Package]
만든 Package 선택 - 우클릭 - [New] - [class](public static void main .. 체크)
명령 프롬포트나 터미널에서 직접 컴파일 & 실행 해야할 때 (교재 33p 참고)
Java 실행과정
[소스 파일 작성(.java)] - [컴파일(javac)] - [바이트 코드(.class)] - [실행(java)]
public class Hello {
}
/*public class: 공개 클래스*/
/*Hello: 클래스 이름(파일명과 동일)*/
public static void main(String args[]) {
}
/*public static void main(String args[]): 메소드 선언부*/
/*괄호 앞의 main: 메소드 이름*/
/*main() 메소드를 실행 진입점이라고 부름*/
/* 내용 */ : 도큐먼트 주석 (주로 javadoc명령어로 API 도큐먼트를 생성할 때 사용)
<변수 선언 작성 규칙>
package sec01.exam01;
public class VariableInitializationExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int value;
int result = value + 10;
System.out.println(result);
// value변수 초기화를 안해서 컴파일 오류 (..initialized)
}
}
package sec01.exam02;
public class VariableUseExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int hour = 3;
int minute = 5;
System.out.println(hour + "시간 " + minute + "분");
int totalMinute = (hour*60) + minute;
System.out.println("총 " + totalMinute + "분");
}
}
/* 실행 결과
3시간 5분
총 185분 */
package sec01.exam03;
public class VariableExchangeExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int x = 3;
int y = 5;
System.out.println("X: " + x + ", y: " + y);
int temp = x;
x = y;
y = temp;
System.out.println("X: " + x + ", y: " + y);
}
}
/* 실행 결과
X: 3, y: 5
X: 5, y: 3 */
package sec01.exam04;
public class VariableScopeExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int v1 = 15;
if(v1>10) {
int v2;
v2 = v1 - 10;
}
int v3 = v1 + v2 + 5; // v2 변수를 사용할 수 없기 때문에 오류 발생
}
}
예제 하나하나 하려고 했지만.. 앞에 기본적으로 아는 내용들은 정리만 하고 넘어가려고 한다..
리터럴(literal): 소스코드에서 프로그래머에 의해 직접 입력된 값
2진수: 0b 또는 0B로 시작하고 0과 1로 구성됨
8진수: 0으로 시작하고 0~7로 구성됨
10진수: 소수점이 없는 0~9 숫자로 구성됨
16진수: 0x 또는 0X로 시작하고 0~9 숫자와 A~F 또는 a~f로 구성됨
long balence = 300000000L;
: 하나의 문자를 작은따옴표(')로 감싼 것 (유니코드로 변환되어 저장됨)
char var1 = 'A'; // 유니코드 65가 저장됨
char c = 65; // 정수 타입에 속하기 때문에 가능
int var2 = 'A' // 유니코드 65가 저장됨
String A = "홍길동동동";
문자열 내부에 이스케이프 문자(\ 역슬래시가 붙은 문자) 사용 가능함
\": "출력
\t: tab만큼 띄움
\n: 줄바꿈
ex)
String B = "나는 \"자바\"를\t좋아\n합니다.";
System.out.println(B);
/*실행결과: 나는 "자바"를 좋아
합니다.*/
float var1 = 3.14F;
boolean stop = true;
if(stop) { // stop이 true면 실행
System.out.println("멈춤");
}
else {
System.out.println("출발");
}
작은 범위 => 큰 범위
기본 타입) byte < short < int < long < float < double
ex) byte -> int, long -> float(실수 값은 정수보다 허용 범위가 크기 때문에 무조건 자동 변환), char -> int
예외적으로 byte타입은 char로 자동변환할 수 없음 (byte타입의 허용범위는 음수를 포함하고 char타입은 음수를 포함하지 않기 때문)
byte x = 10;
byte y = 20;
int result1 = x + y; // byte에 저장하면 컴파일 에러
byte result2 = 10 + 20; // 이때는 int 타입으로 변환하지 않음
int x = 10;
double y = 5.5;
double result1 = x + y; // int가 double 값으로 변환되어 연산 수행
// 만약 꼭 int 타입으로 연산을 해야한다면 double result = x + (int)y;
float result2 = 1.2f + 5.5f; // float 타입으로 하려면 +f, 안하면 에러, 기본적으로는 double 타입
int x = 1;
int y = 2;
double result = x / y;
System.out.println(result);
/* 실행 결과: 0.0 (x /y 연산이 먼저 실행되기 때문)
그러므로 0.5가 나오게 하려면 연산 과정에서 x, y 둘 중 하나 or 둘 다를
강제 형 변환 시켜야 함.
*/
int value = 3 + 7; // 10 덧셈
String str1 = "3" + 7; // "37" 결합
String str2 = 3 + "7"; // "37" 결합
큰 범위 => 작은 범위 (강제적으로)
캐스팅 연산자 () 괄호를 사용
int var1 = 30;
byte var2 = (byte)var1
ex) int -> byte, int -> char, double -> int (String -> char 안됨)
String str = "33";
int x = Integer.parseInt(str);
Double y = Double.parseDouble(str);
String str = String.valueOf(3); // 결과: "3"
System.in.read();
System.out.println();
println(내용); : (ln은 line의 줄임) 괄호 안의 내용을 출력하고 행을 바꿈
print(내용); : 괄호 안의 내용을 출력만
printf("형식 문자열", 값1, 값2); : 괄호 안의 첫 번째 문자열 형식대로 출력
전체 출력 자릿수와 소수 자릿수를 제한할 수 있음
%와 conversion(변환문자)는 필수로 작성하고 나머지는 생략할 수 있음, 쉼표로 나열
ex)
// 정수 %d, 실수 %f, 문자열: %s
System.out.printf("이름: %s", "김자바"); // 이름: 김자바
// 값이 두개 이상일 경우 순번을 알려줘야 함. (1$, 2$)
System.out.printf("이름: %1$s, 나이: %2$d", "김자바", 25); // 이름: 김자바, 나이: 25
자주 사용되는 형식 문자열 (교재 91p 참고)
ex) %6d, %10.3f, %-6s, \t 등
키보드에서 입력된 내용을 변수에 저장하기
package sec04.exam02;
public class KeyCodeExample {
public static void main(String[] args) throws Exception/*예외 처리 코드*/ {
// TODO Auto-generated method stub
int keyCode;
keyCode = System.in.read();
System.out.println("keyCode: " + keyCode);
}
}
/* 실행 결과: A
keyCode: 65 */
-> 키코드를 하나씩 읽음 (단점)
package sec04.exam05;
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String inputData;
while(true) {
inputData = scanner.nextLine();
System.out.println("입력된 문자열: \"" + inputData + "\"");
if(inputData.equals("q")) {
break;
}
}
System.out.println("종료");
}
}
/*
a
입력된 문자열: "a"
abc
입력된 문자열: "abc"
자바는 재미있다.
입력된 문자열: "자바는 재미있다."
q
입력된 문자열: "q"
종료
*/
-> 문자열이 비교할 때는 equals() 메소드 사용
package sec04.verify.exam02;
import java.util.Scanner;
public class Exam02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
System.out.print("첫번째 수: ");
String strNum1 = scanner.nextLine();
System.out.print("두번째 수: ");
String strNum2 = scanner.nextLine();
int num1 = Integer.parseInt(strNum1);
int num2 = Integer.parseInt(strNum2);
int result = num1 + num2;
System.out.println("덧셈 결과: " + result);
}
}
/*
첫번째 수: 2
두번째 수: 4
덧셈 결과: 6
*/
연산자, 조건문, 반복문은 기본적인 내용이므로 +기본내용, 알게 된 내용 정리
if (조건식1) {
true면 실행문 실행;
}
else if (조건식2) {
true면 실행문 실행;
}
else {
조건식1이 false면 실행문 실행;
}
ex)
(int)(Math.ramdom() * 6) + 1; => 6개 중 1개의 정수를 랜덤으로
// 주사위 번호 뽑기
package sec01.exam04;
public class IfDiceExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = (int)(Math.random() * 6) + 1;
if (num == 1) {
System.out.println("1번이 나왔습니다.");
}
else if (num == 2) {
System.out.println("2번이 나왔습니다.");
}
//3, 4, 5 진행
else {
System.out.println("6번이 나왔습니다.");
}
}
}
switch(변수) {
case 값1:
변수가 값 1일 경우 실행문 실행;
break;
case 값2:
변수가 값 2일 경우 실행문 실행;
break;
default:
변수가 값 1, 2 아닐 경우 실행문 실행;
}
package sec01.exam07;
public class SwitchCharExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
char grade = 'B'; // char 타입
switch (grade) {
case 'A':
case 'a':
System.out.println("우수 회원 입니다.");
break;
case 'B':
case 'b':
System.out.println("일반 회원입니다.");
break;
default:
System.out.println("손님 입니다.");
}
}
}
// 실행 결과: 일반 회원입니다.
package sec01.exam08;
public class SwitchStringExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
String position = "과장";
switch(position) {
case "부장":
System.out.println("700만원");
break;
case "과장":
System.out.println("500만원");
break;
default:
System.out.println("300만원");
}
}
}
// 실행 결과: 500만원
// 구구단 출력하기
package sec02.exam05;
public class ForMultiplicationTableExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 2; i <= 9; i++) {
System.out.println("** " + i + "단 **");
for (int j = 1; j <= 9; j++ ) {
System.out.println(i + "X" + j + "=" + i*j);
}
System.out.println();
}
}
}
/*
** 2단 **
2X1=2
2X2=4
2X3=6
2X4=8
2X5=10
2X6=12
2X7=14
2X8=16
2X9=18
~3, 4, 5, 6, 7, 8단 출력~
** 9단 **
9X1=9
9X2=18
9X3=27
9X4=36
9X5=45
9X6=54
9X7=63
9X8=72
9X9=81
*/
// 1부터 10까지 출력
package sec02.exam06;
public class WhilePrintFrom1To10Example {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 1;
while (i <= 10) {
System.out.println(i);
i++;
}
}
}
/* 실행 결과:
1
2
3
4
5
6
7
8
9
10
*/
do-while문: 블록 내부의 실행문을 우선 실행하고 실행 결과에 따라서 반복 실행을 계속할지 결정함
break문: 반복문에서 실행 중지할 때 사용 (대개 if문과 같이 사용됨)
ex) 주사위 번호를 랜덤으로 뽑고 6이 나오면 while문 종료
package sec02.exam08;
public class BreakExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
while(true) {
int num = (int)(Math.random() * 6) + 1;
System.out.println(num);
if(num == 6) {
break;
}
}
System.out.println("프로그램 종료");
}
}
/*
1
6
프로그램 종료
*/
반복문이 중첩되어 있을 경우 가장 가까운 반복문만 종료함
// 바깥쪽 반복문까지 종료
package sec02.exam09;
public class BreakOutterExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Outter: for (char upper = 'A'; upper <= 'Z'; upper++) {
for (char lower = 'a'; lower <= 'z'; lower++) {
System.out.println(upper + "-" + lower);
if (lower == 'g') {
break Outter;
}
}
}
System.out.println("프로그램 실행 종료");
}
}
/*
A-a
A-b
A-c
A-d
A-e
A-f
A-g
프로그램 실행 종료
*/
package sec02.exam10;
public class ContinueExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 1; i <= 10; i++) {
if (i % 2 != 0) {
continue;
}
System.out.println(i);
}
}
}
/* 실행 결과:
2
4
6
8
10
*/
- 메소드 영역
JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
클래스들을 클래스 로드로 읽어 분류 후 저장 함
- 힙 영역
객체와 배열이 생성되는 영역
생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조함
JVM이 의미없는(참조하는 변수나 필드가 없는) 객체를 쓰레기로 취급하고 Garbage Collector를 실행시켜 자동으로 제거함
- JVM 스택 영역
메소드를 호출할 때마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임을 (pop)하는 동작 수행
로컬 변수 스택: 변수가 push & pop 됨, 변수가 초기화 될 때 변수가 생성됨, 변수는 선언된 블록 안에서만 존재하고 블록을 벗어나면 스택에서 제거 됨 (for문 안의 int i = 0 생각하기)
기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만 참조 타입 변수는 스택 영역에 힙 영역의 객체 주소를 가짐 (참고로 자바는 배열을 객체 취급)
x == y ----> true
, x != y ----> false
x == null
, x != y
을 해보면 됨 int[] intArray = null;
intArray[0] = 10; // NullPointerException
// intArray가 참조하는 배열 객체가 없기 때문에 오류 발생
String str = null;
System.out.println("총 문자수: " + str.length()); // NullPointerException
// str 변수가 참조하는 String 객페가 없기 때문에 오류 발생
String name = new String("추다율");
-> 문자열 리터럴로 생성하느냐, new연산자로 생성하느냐에 따라 비교 연산자의 결과는 달라질 수 있음(변수에 저장된 객체의 번지가 동일한지를 검사하기 때문)
=> 생성 과정에 상관없이 내부 문자열을 비교하고 싶을 경우에는 equals() 메소드를 사용
boolean result = str1.equals(str2);
index란 배열 이름 옆 대괄호에 기입됨. 0부터 시작
<배열의 특징>
1. 같은 타입의 데이터만 저장할 수 있다.
2. 한번 생성된 배열은 길이를 늘리거나 줄일 수 없다.
// 데이터 타입[] 변수;
int[] score;
double[] x;
String[] y;
// 데이터 타입 변수[];
int score1 [];
double x2[];
String y3[];
배열은 참조 변수에 속함(힙 영역에 생성되고 스택 영역의 배열 변수는 힙 영역의 배열 객체 참조), 참조할 배열 객체가 없다면 null 값으로 초기화 가능(그대로 사용하지 않도록 주의)
int[] score = {1, 2, 3};
{ } 중괄호는 안의 값들을 항목으로 가지는 배열 객체를 힙에 생성하고 배열 번지를 리턴함
-> 배열 변수는 리턴된 번지를 저장함 (참조)
String[] names = {"신용권", "홍길동", "김자바"};
// 신용권은 names[0], 홍길동은 names[1], 김자바는 names[2]
// 홍길동 -> 홍삼원으로 수정시
names[1] = "홍삼원";
package sec02.exam01;
public class ArrayCreateByValueListExample1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] scores = {83, 90, 87};
System.out.println("scores[0]: " + scores[0]);
System.out.println("scores[1]: " + scores[1]);
System.out.println("scores[2]: " + scores[2]);
int sum = 0;
for(int i = 0; i < 3 ; i++) {
sum += scores[i];
}
System.out.println("총합: " + sum);
double avg = (double) sum / 3;
System.out.println("평균: " + avg);
}
}
/*
scores[0]: 83
scores[1]: 90
scores[2]: 87
총합: 260
평균: 86.66666666666667
*/
값 목록 생성에서 주의할 점
1. 배열 변수를 선언한 후에는 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않음(컴파일 에러)
=> new 연산자 이용 (메소드의 매개값이 배열일 경우도)
타입[] 변수;
변수 = {값0, 값1, 값2}; // 컴파일 에러!!
// new 연산자 이용
변수 = new 타입[] {값0, 값1, 값2};
// ex
String[] names = null;
names = new String[] {"신용권", "홍길동"};
ex)
package sec02.exam02;
public class ArrayCreatByValueListExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int scores[];
scores = new int[] {83, 90, 87};
int sum1 = 0;
for (int i = 0; i < 3; i++) {
sum1 += scores[i];
}
System.out.println("총합: " + sum1);
int sum2 = add(new int[] {83, 90, 87});
System.out.println("총합: " + sum2);
System.out.println();
}
public static int add(int[] scores) { // 총합을 계산해서 리턴하는 메소드
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += scores[i];
}
return sum;
}
}
타입[] 변수 = new 타입[길이];
// 배열 변수가 이미 선언 되었을 때
타입[] 변수 = null;
변수 = new 타입[길이];
// ex
int[] intArray = new int[5]; // 기본값 0으로 자동 초기화됨
int[] scores = new int[30];
String[] names = new String[30]; // 기본값 null로 자동 초기화
// 특정 인덱스에 값을 저장
int[] scores
글 전체 이미지 출처: 구글 검색 이미지