Section 01 Java 프로그래밍
강의
https://www.udemy.com/course/best-java-programming/
41 sections • 452 lectures • 38h 8m total length
section 01 자바 설치하기
macos
window 11 wsl2
1
2
3
4
5
6
7
sudo apt install -y default-jdk
sudo apt update
java --version
jshell
https://linuxgenie.net/how-to-install-java-on-ubuntu-22-04/
형식문자열
%d 지정자는 정수 값의 서식을 지정하고 인쇄하는 데 사용됩니다. 문자열의 경우 %s. 부동 소수점 값의 경우 %f.
자바 변수
변수 : 데이터를 위한 메모리를 확보하는 키워드
Declaration(선언) Assignment(할당) 값을 변수에 복사한다는 뜻입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
jshell> int a = 1
a ==> 1
jshell> int b = 2
b ==> 2
jshell> int c = 3
c ==> 3
jshell> System.out.println(a+b+c)
6
jshell> System.out.printf("%d + %d + %d = %d", a,b,c,(a+b+c)).println()
1 + 2 + 3 = 6
변수가 메모리에 어떻게 저장되는가
1
2
3
int a = 10;
int b = 20
컴퓨터 메모리는 박스의 집합 같은 것입니다. 메모리 위치의 숫자는 여러분 컴퓨터 메모리의 사이즈에 따라 결정됩니다.
일단 모든 변수는 컴퓨터 메인 메모리에 저장된다고 해봅시다.
Memory Location | Value | Name |
---|---|---|
5004 | ||
5008 | 5 | a |
5012 | 10 | b |
5016 | ||
5020 | ||
5024 | 100 | c |
5028 | ||
5032 | ||
5036 | ||
5040 |
Name 은 우리가 프로그램에서 메모리 위치를 참조할 때 쓰는 겁니다. 5008 을 찾고싶을때 a 를 쓰는거죠.
변수 이름 짓기
- 문자열, 숫자, $, _ 사용가능
- 숫자로 시작 금지
- 이름의 길이는 제한이 없어용
- 카멜케이스
자바 기본 변수형의 이해
데이터 유형 | 범위 | 크기 | 예제 값 |
---|---|---|---|
byte | -128에서 127까지 | 8 비트 (1 바이트) | 42 |
short | -32,768에서 32,767까지 | 16 비트 (2 바이트) | 12345 |
int | -2,147,483,648에서 2,147,483,647까지 ( 20억정도) | 32 비트 (4 바이트) | 123456789 |
long | -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807까지 | 64 비트 (8 바이트) | 9876543210L |
float | 대략적인 정밀도 | 32 비트 (4 바이트) | 3.14f |
double | 높은 정밀도 | 64 비트 (8 바이트) | 3.14159265359 |
char | 0에서 65,535까지 (유니코드 문자) | 16 비트 (2 바이트) | ‘A’ |
boolean | true 또는 false | 1 비트 또는 1 바이트 (구현에 따라 다름) | true |
정수형
예를 들어, 축구 한 경기에 골이 몇번 나왔냐를 기록하고 싶으면 byte 로 충분할 겁니다.
한 국가의 GDP 를 계산한다고 칩니다. 수 조원이 넘을지도 몰라요. 이럴때는 long 타입을 씁니다.
부동소수점형
1
2
3
4
5
float f1 = 0.5f; o
float f2 = 0.5; x
double dbl = 0.5f; o
double f1 = 0.5; o
문자형
1
2
3
4
char ch = 'A'; o
char ch = 'AB'; x
char ch = "A"; x
불자료형
true, false 는 모두 불리언 리터럴입니다.
1
2
3
4
5
boolean isPrime = true; o
boolean isPrime = false; o
boolean isPrime = True; x
boolean isPrime = False; x
자바 변수 타입 선정 예시
(선생님도 변수 숫자 넘 많아서 지루하고 읽기도 어렵다고 하심ㅋㅋㅋㅋ)
축구 골 : byte | short 세계 인구수 : long 평균값 : float , double // 선생님은 double 을 선호함 홀짝(isEven) : boolean 소수인가?(isPrime) : boolean
정밀한 재무 계산 같은 걸 하고 싶으면 BigDecimal 을 쓰면 됨
문자열 결합 연산자
- 연산자를 사용했을때 피연산자 중 하나라도 문자열타입이면 결과는 문자열
하지만 너무 문자열결합연산을 남발하지 말자. 큰 비용이 드는 작업이다.
자바 대입 연산자
assignment : 우항의 값을 복사해 좌항의 값으로 대입하는 것
Jshell
- Jshell 은 히스토리를 지원해서 좋다 상하 키
- Ctrl + A (줄 시작으로 이동)
- Ctrl + E (줄 마지막으로 이동)
- Ctrl + R (실행했던 명령어를 검색)
- 세션마다 달라짐
- $2 우리가 표현식을 입력하면 평가한걸 $변수 로 만들어준다.
Java 조건문과 If 문
for(initialization(초기값); condition(조건); update){ statement; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a = 2, b = 1, c = 1, d = 1;
if(a+b > c+d){
System.out.println("hi");
}
int triangle = 180;
int angle1 = 10, angle2 = 10, angle3 = 160;
if(angle1+angle2+angle3 == 180){
System.out.println("triangle");
}
int number = 1;
if(number % 2 == 0){
System.out.println(number + "is an Even Number");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class Main {
public static void main(String[] args) {
sevenTable();
oneToTen();
tenToOne();
squaresOf10Numbers();
squaresOfEvenNumbers();
squaresOfOddNumbers();
}
public static void sevenTable(){
for(int i = 1; i < 10; i++){
System.out.printf("%d * %d = %d", 7, i, 7*i).println();
}
}
public static void oneToTen(){
for(int i = 1; i <= 10; i++){
System.out.println(i);
}
}
public static void tenToOne(){
for(int i = 10; i >= 1; i--){
System.out.println(i);
}
}
public static void squaresOf10Numbers(){
for(int i = 1; i <= 10; i++){
System.out.println(i * i);
}
}
public static void squaresOfEvenNumbers(){
for(int i = 2; i <= 10; i+=2){
System.out.println(i * i);
}
}
// 정답
public static void squaresOfEvenNumbers(){
for(int i = 1; i <= 10; i++){
System.out.println(i * 2 * i * 2);
}
}
public static void squaresOfOddNumbers(){
for(int i = 1; i <= 10; i+=2){
System.out.println(i * i);
}
}
// 정답
public static void squaresOfOddNumbers(){
for(int i = 1; i <= 20; i+=2){
System.out.println(i * i);
}
}
}
오답노트
** 은 Python, R 만 쓴다.
반복문 퍼즐
for 반복문에서 초기값, 조건, 업데이트 어느 부분이든 비워둘 수 있다.
for 반복문 안에 ; 이 2개 들어가면 된다.
for 반복문 뒤에 {} 없이 ; 붙여도 된다.
그럼 아무 일도 하지 않는 빈 문을 실행하는 거다.
// 여기는 이해될 떄 까지 여러번 보자.
1
2
3
4
5
int i;
int j;
for( i = 1, j =2; i <= 1; i++, j--);
// 초기값, 업데이트 부분은 여러개의 문이 올 수 있다.
// 중요한 점, 조건부분은 하나의 문만 올 수 있다.
1
2
3
4
5
for(;;);
// 무한 반복문
// 어떤 답도 돌아오지 않는다.
// 조건이 비었으니 항상 참이고, 항상 실행되고 있음.
// 종료 법은 ctrl + c 뿐
용어정리
리터럴 literal 표현식 expression 문 statement // 문들은 가끔 표현식일때도 있는거~ 변수 variable // 값이 바뀔 수 있는거
축구 골 : byte | short 세계 인구수 : long 평균값 : float , double // 선생님은 double 을 선호함 홀짝(isEven) : boolean 소수인가?(isPrime) : boolean
정밀한 재무 계산 같은 걸 하고 싶으면 BigDecimal 을 쓰면 됨
문자열 결합 연산자
- 연산자를 사용했을때 피연산자 중 하나라도 문자열타입이면 결과는 문자열
하지만 너무 문자열결합연산을 남발하지 말자. 큰 비용이 드는 작업이다.
자바 대입 연산자
assignment : 우항의 값을 복사해 좌항의 값으로 대입하는 것
Jshell
- Jshell 은 히스토리를 지원해서 좋다 상하 키
- Ctrl + A (줄 시작으로 이동)
- Ctrl + E (줄 마지막으로 이동)
- Ctrl + R (실행했던 명령어를 검색)
- 세션마다 달라짐
- $2 우리가 표현식을 입력하면 평가한걸 $변수 로 만들어준다.
Java 조건문과 If 문
for(initialization(초기값); condition(조건); update){ statement; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a = 2, b = 1, c = 1, d = 1;
if(a+b > c+d){
System.out.println("hi");
}
int triangle = 180;
int angle1 = 10, angle2 = 10, angle3 = 160;
if(angle1+angle2+angle3 == 180){
System.out.println("triangle");
}
int number = 1;
if(number % 2 == 0){
System.out.println(number + "is an Even Number");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class Main {
public static void main(String[] args) {
sevenTable();
oneToTen();
tenToOne();
squaresOf10Numbers();
squaresOfEvenNumbers();
squaresOfOddNumbers();
}
public static void sevenTable(){
for(int i = 1; i < 10; i++){
System.out.printf("%d * %d = %d", 7, i, 7*i).println();
}
}
public static void oneToTen(){
for(int i = 1; i <= 10; i++){
System.out.println(i);
}
}
public static void tenToOne(){
for(int i = 10; i >= 1; i--){
System.out.println(i);
}
}
public static void squaresOf10Numbers(){
for(int i = 1; i <= 10; i++){
System.out.println(i * i);
}
}
public static void squaresOfEvenNumbers(){
for(int i = 2; i <= 10; i+=2){
System.out.println(i * i);
}
}
// 정답
public static void squaresOfEvenNumbers(){
for(int i = 1; i <= 10; i++){
System.out.println(i * 2 * i * 2);
}
}
public static void squaresOfOddNumbers(){
for(int i = 1; i <= 10; i+=2){
System.out.println(i * i);
}
}
// 정답
public static void squaresOfOddNumbers(){
for(int i = 1; i <= 20; i+=2){
System.out.println(i * i);
}
}
}
오답노트
** 은 Python, R 만 쓴다.
반복문 퍼즐
for 반복문에서 초기값, 조건, 업데이트 어느 부분이든 비워둘 수 있다.
for 반복문 안에 ; 이 2개 들어가면 된다.
for 반복문 뒤에 {} 없이 ; 붙여도 된다.
그럼 아무 일도 하지 않는 빈 문을 실행하는 거다.
// 여기는 이해될 떄 까지 여러번 보자.
1
2
3
4
5
int i;
int j;
for( i = 1, j =2; i <= 1; i++, j--);
// 초기값, 업데이트 부분은 여러개의 문이 올 수 있다.
// 중요한 점, 조건부분은 하나의 문만 올 수 있다.
1
2
3
4
5
for(;;);
// 무한 반복문
// 어떤 답도 돌아오지 않는다.
// 조건이 비었으니 항상 참이고, 항상 실행되고 있음.
// 종료 법은 ctrl + c 뿐
용어정리
리터럴 literal 표현식 expression 문 statement // 문들은 가끔 표현식일때도 있는거~ 변수 variable // 값이 바뀔 수 있는거
Jshell
ㄱㅇㅇ
1
2
3
4
5
6
7
8
9
10
11
12
13
claire@Claireui-iMac ~ % jshell
| Welcome to JShell -- Version 21
| For an introduction type: /help intro
jshell> /help intro
jshell> exit
| Error:
| cannot find symbol
| symbol: variable exit
| exit
| ^--^
jshell> /exit
| Goodbye
literal : 변하지 않는 값
operators : 연산자
expressions : 식
error : 프로그래밍의 불평
precedence : 우선순위
1
2
3
4
5
jshell> 5/2 // integer 나누기 integer라서 2인 것
$1 ==> 2
jshell> 5.0/2.0 // floating point literal
$2 ==> 2.5
Java에서 모듈로 연산자(modulo operator)는 백분율 기호(%)로 표시됩니다. 이 연산자는 나눗셈 연산의 나머지를 반환합니다.
1
2
3
4
5
jshell> System.out.println(5\*5); // method_path(parameter)
25
jshell> System.out.println("5*2=10" );// 문자열이니까 double quote로 감싸기
5*2=10
System.out.println(5*5); => Statement 라고 부릅니다. 컴퓨터에게 지시(instruct)하는 역할입니다. 5*5 => expression 이라고 부릅니다. 괄호 안에 expression 을 통과(passing) 시킵니다. 괄호안에 넣는 것을 parameter 라고 부릅니다. System.out.println() => predefined medthod 입니다. System 은 자바의 클래스이고, out 이라는 변수와 println 이라는 메서드를 가지고 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
System.out.println("Hello World");
System.out.println("5 * 3");
System.out.println(5 * 3);
jshell> int dan = 5
dan ==> 5
jshell> for(int i = 1; i <= 9; i++){
...> System.out.println(dan + " * " + i + " = " + (dan * i));
...> }
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
System.out.println(60*60*24);
Math.random() Math.min(23,4) Math.max(23,4)
1
2
3
4
5
6
7
System.out.printf("5 * 2 = %d", 5*2).println();
System.out.printf("%d %d %d", 5 ,7 ,5*7).println();
System.out.printf("%d * %d = %d", 5 ,7 ,5*7).println();
System.out.printf("%d + %d + %d = %d", 5 ,6 ,7, 5+6+7).println();
System.out.printf("%d + %d + %d = %d", 5 ,6 ,7, 5+6+7).println();
System.out.printf("Print %s", "Testing").println();
System.out.printf("Print %f %f %f", 0.5, 5.5, 6.5).println();
println() // 은 항상 새줄 문자를 출력해줍니다
메서드
메서드를 만들땐 반환타입과 메서드이름이 있어야한다. 메서드의 인자(arguments) 를 넣을 땐 (Type argumentName) 을 적어야 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
void sayHelloWorldTwice(){
System.out.println("Hello World");
System.out.println("Hello World");
};
jshell> sayHelloWorldTwice();
Hello World
Hello World
void sayHelloWorldTrice(){
System.out.println("Hello World");
System.out.println("Hello World");
System.out.println("Hello World");
};
void sayHelloWorldTrice(){
System.out.println("Hello World");
System.out.println("Hello World");
System.out.println("Hello World");
};
/methods // jshell 에 만들어둔 메서드 모두 출력
/save backup.txt // backup.txt 에 실행했던 것들을 저장해 줌
/edit methodName // jshell 로 메서드 수정하기
/list methodName // 메서드 내용을 jshell 콘솔로 보여줌
void sayHelloWorld(int argu){
for (int i = 1; i <=argu; i ++){
System.out.println("Hello World");
}
};
void printNumbers(int n){
for (int i = 1; i <=n; i ++){
System.out.println(i);
}
};
void printSquaresOfNumbers(int n){
for (int i = 1; i <=n; i ++){
System.out.println(i*i);
}
};
void printMultificationTable(){
for (int i = 2; i < 10; i++){
for (int j = 1; j < 10; j++){
System.out.printf("%d * %d = %d", i , j, i*j).println();
}
}
};
void printMultificationTable(int table){
for (int i = table; i < table +1; i++){
for (int j = 1; j < 10; j++){
System.out.printf("%d * %d = %d", i , j, i*j).println();
}
}
};
메서드 오버로딩
매개변수의 갯수가 다른 메서드 둘에 같은 이름을 부여한 것.
오버로드 메서드는 default 값을 사용할 수 있어서 편리함.
반환형태가 다르면 오버로딩 불가
1
2
3
4
5
6
7
8
9
10
11
void printMultificationTable(){
for (int i = 1; i < 10; i++){
System.out.printf("%d * %d = %d", 5 , i, 5*i).println();
}
};
void printMultificationTable(int table){
for (int i = 1; i < 10; i++){
System.out.printf("%d * %d = %d", table , i, table * i).println();
}
};
메서드 리턴값
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void methodReturnVoid() {
}
int methodReturnInt() {
return 42;
}
String methodReturnString() {
return "Hello, World!";
}
boolean methodReturnBoolean() {
return true;
}
연습문제
1
2
3
4
5
6
7
int sumThree(int first, int second, int third) {
return first + second + third;
}
int calculateAngle(int first, int second) {
return 180 - first - second ;
}
정리
아래는 메서드를 호출한다는 뜻
- calling method
- invoking method
- execution of a method
클래스
1
2
3
4
5
6
7
8
9
10
11
12
class Planet {
void revolve(){
System.out.println("Revolve");
}
}
Planet mars = new Planet();
Planet earth = new Planet();
Planet venus = new Planet();
mars.revolve();
earth.revolve();
1
2
3
4
5
6
7
8
9
10
11
12
class Country {
void comingSoon(){
System.out.println("Coming Soon");
}
}
Country korea = new Country();
Country japan = new Country();
Country india = new Country();
Country usa = new Country();
korea.comingSoon();
클래스를 컴파일 하고 실행 해보기
클래스명과 파일이름이 일치하는 것이 중요합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ claire@Claireui-iMac src % javac Planet.java
$ claire@Claireui-iMac src % ls
App.java Planet.class Planet.java
$ claire@Claireui-iMac src % javac Country.java
$ claire@Claireui-iMac src % ls
App.java Country.class Country.java Planet.class Planet.java
$ claire@Claireui-iMac src % java Planet
Error: Main method not found in class Planet, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
클래스에 메인 메서드가 없당. 공용 정적 보이드 main 메서드가 있어야 실행할수있어~ 라는 뜻 파일을 수정하고 javac Planet.java
, java Planet
을 실행하면 드디어 실행된다.
javac 컴파일해서 바이트 코드로 만들고 java JVM 으로 명령을 실행한다.
1
2
3
4
5
6
7
8
9
10
11
public class Planet {
void revolve(){
System.out.println("Revolve");
}
public static void main(String[] args){
Planet earth = new Planet();
earth.revolve();
}
}
1
2
$ claire@Claireui-iMac src % java Planet
Revolve
Jshell 코드를 만들고 입력하자마자 컴파일함. 실제로 문을 실행하면 출력물을 볼 수 있고 거기서 바로 메서드도 돌려볼 수 있음. javac 는 Planet.java 가 있는 폴더에서 사용해야함. javac, java 를 사용해야하고 main 메서드가 무조건 있어야 함.
jdk, jre, jvm
JVM
바이트코드를 운영체제가 이해하는 명령으로 바꿔줌. Planet.java 는 자바 파일 javac 를 이용해 바이트코드로 컴파일 Planet.class 는 바이트 코드 java Planet 을 입력해 jvm 을 사용함으로써 바이트코드를 운영체제가 이해하는 명령(기계어)으로 변환해 줌.
JRE
자바 실행(런타임) 환경
JRE = JVM + 자바 관련 라이브러리 + 컴포넌트들
자바 관련 라이브러리 = System 등 기본적으로 필요한 클래스나 메서스들이 내장되어 있음
JDK
자바 실행(런타임) 환경
JDK = JRE + 컴파일러들 + 디버거들
네, 맞습니다. 운영체제에 따라 컴파일러와 디버거가 다르게 포함될 수 있습니다. JDK (Java Development Kit)는 Java 개발 및 실행 환경을 제공하는 패키지이며, 특정 운영체제에 대한 JDK 버전이 존재합니다. 각 JDK 버전은 해당 운영체제와 호환되도록 컴파일러와 디버거를 포함하고 있습니다.
애플리케이션 개발자면 jdk 가 있어야 하고, 애플리케이션 사용자면 jre만 있어도 됨