Post

Section 01 Java 프로그래밍

강의

https://www.udemy.com/course/best-java-programming/

41 sections • 452 lectures • 38h 8m total length

section 01 자바 설치하기

macos

https://yubinshin.s3.ap-northeast-2.amazonaws.com/2023-10-06-java/java_01.png

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 LocationValueName
5004  
50085a
501210b
5016  
5020  
5024100c
5028  
5032  
5036  
5040  

Name 은 우리가 프로그램에서 메모리 위치를 참조할 때 쓰는 겁니다. 5008 을 찾고싶을때 a 를 쓰는거죠.

변수 이름 짓기

  1. 문자열, 숫자, $, _ 사용가능
  2. 숫자로 시작 금지
  3. 이름의 길이는 제한이 없어용
  4. 카멜케이스

자바 기본 변수형의 이해

데이터 유형범위크기예제 값
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
char0에서 65,535까지 (유니코드 문자)16 비트 (2 바이트)‘A’
booleantrue 또는 false1 비트 또는 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

  1. Jshell 은 히스토리를 지원해서 좋다 상하 키
  2. Ctrl + A (줄 시작으로 이동)
  3. Ctrl + E (줄 마지막으로 이동)
  4. Ctrl + R (실행했던 명령어를 검색)
  5. 세션마다 달라짐
  6. $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

  1. Jshell 은 히스토리를 지원해서 좋다 상하 키
  2. Ctrl + A (줄 시작으로 이동)
  3. Ctrl + E (줄 마지막으로 이동)
  4. Ctrl + R (실행했던 명령어를 검색)
  5. 세션마다 달라짐
  6. $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 ;
}

정리

아래는 메서드를 호출한다는 뜻

  1. calling method
  2. invoking method
  3. 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만 있어도 됨

This post is licensed under CC BY 4.0 by the author.