JAVA

20211226 - JAVA 1~3회차 강의 복습

쿠쿠(KOOKOO) 2021. 12. 27. 01:20

어디에서나 사용할 수 있게 패스 설정
내PC > 속성 > 고급 시스템 설정 > 환경 변수 > 시스템 변수 > Path 편집
C:\~\bin 경로 새로만들기로 등록

자바는 대소문자를 구별한다.

 

1
2
3
4
5
6
7
8
class Hello
{
    public static void main(String[] args)
    {
        System.out.println("Hello World");
        //ln 개행한다는 의미(출력하고 줄바꿈)
    }
}
cs
1
2
3
4
5
6
7
class Good
{
    public static void main(String[] args)
    {
        System.out.println("Good");
    }
}
cs

위 기본 구조 외우기

 

기본 구조 class Hello {} //Hello는 클래스 이름, 대문자로 시작하는게 암묵적 룰

main 메소드는 반드시 필요
메소드 앞에 반환하는 형을 명시해야 한다.
public static void main: 반환하지 않음을 의미
String 문자열 클래스

메모장 저장 시 ANSI로 저장해야 윈도우에서 안 깨진다.

dir 목록보기 명령 <DIR>이 붙지 않은 건 그냥 파일
. 현재 디렉토리
.. 상위 디렉토리
//점 한개, 두개는 무조건 나옴 

cd. 현재 디렉토리로 위치를 바꾸는 명령
cd.. 상위
cd \ 한번에 최상위 드라이브로 가기
cd c:\1215\Day1 한번에 원하는 곳으로 갈 수 있는 절대경로
javac Hello.java 컴파일러로 이 파일을 연다. > class파일이 생김

cd 1215 cd Day1

 

중요한 부분: 데이터타입(자료형), 가독성

읽기 좋은 코드가 좋은 코드(들여쓰기, 띄어쓰기)

 

명령어 println > print : 개행하지 않는다.

.java 파일 내용이 바뀌면 cmd에서 컴파일도 새로 해줘야 반영된다.

 

cmd 위, 아래 화살표로 이전 명령어를 기억한다

 

1
2
3
4
5
6
7
8
9
10
class JavaAdd
{
    public static void main(String[] args)
    {
        System.out.println(2+3); //5로 출력
        System.out.println("2+3"); //2+3 그대로 출력
        System.out.println(2+3+"Hello"); //5Hello
       System.out.println("Hello"+2+3); //Hello23
    }
}
cs

2+3+"Hello" > 왼쪽->오른쪽 순으로 연산

2+3까지 연산하고 자료형이 달라서 연산 불가 > 그대로 출력

"Hello"+2+3 > 가장 왼쪽부터 계속 연산 불가하여 그대로 출력 > Hello23

 

For 반복문을 배우기 위해 변수를 먼저 알아야 한다.

 

int 정수(소수점이 없는 숫자)를 저장하는 자료형

= 대입연산자

1
2
3
4
5
6
7
8
9
10
class Variable
{
    public static void main(String[] args)
    {
        int num = 10//선언
        System.out.println(num); //10
        num = 100;
        System.out.println(num); //100
    }
}
cs
1
int i = 10, j = 20;
cs

동일한 중괄호 안에서 동일한 이름의 변수를 선언할 수 없다.

자료형이 동일할 경우 한 줄에서 한번에 선언 가능

 

1
2
3
4
5
6
7
8
9
10
11
class HiRep
{
    public static void main(String[] args)
    {
        int i = 0;
        for(i=0;i<3;i=i+1)
        {
            System.out.println(i + "Hi");
        }
    }
}
cs

대입연산자는 연산자 우선 순위가 가장 낮다.

 

1부터 100까지 더하기

1. 더할 수를 구하기 > 변수 i

2. 구한 수를 더하기 > 변수 sum

1
2
3
4
5
6
7
8
9
10
11
12
class Add100
{
    public static void main(String[] args)
    {
        int i = 0, sum = 0;
        for(i=1;i<=100;i=i+1)
        {
            sum = sum + i;
            System.out.println("i=" + i + " sum=" + sum);
        }
    }
}
cs

 

 

1. 1부터 100까지의 합

1
2
3
4
5
6
7
8
9
10
11
12
class Add100
{
    public static void main(String[] args)
    {
        int i = 0, sum = 0;
        for(i=1;i<=100;i=i+1)
        {
            sum = sum + i;
            System.out.println("i=" + i + " sum=" + sum);
        }
    }
}
cs

2. 1부터 100까지의 짝수의 합

1
2
3
4
5
6
7
8
9
10
11
12
class AddEven100
{
    public static void main(String[] args)
    {
        int i = 0, sum = 0;
        for(i=2;i<=100;i=i+2)
        {
            sum = sum + i;
            System.out.println(sum);    
        }
    }
}
cs

3. 1부터 100까지의 4의 배수의 갯수

1
2
3
4
5
6
7
8
9
10
11
12
class Multi4
{
    public static void main(String[] args)
    {
        int i = 0, cnt = 0;
        for(i=4;i<=100;i=i+4)
        {
            cnt = cnt+1;
            System.out.println(sum+"개");
        }
    }
}
cs

4. 7의 배수의 합이 최초로 1000을 넘는 수가 몇번째 항인지

5. 5!

1
2
3
4
5
6
7
8
9
10
11
12
class Fac
{
    public static void main(String[] args)
    {
        int i = 0, fac = 1;
        for(i=1;i<=5;i=i+1)
        {
            fac = fac * i;
            System.out.println(i+"! "+fac);
        }
    }
}
cs

 

테스트 손코딩 할때 헷갈린 부분:

for(i=0;i<=100;i=i+1)이라고 했을 때 +증가하고 시작하는 게 아니라

i=0 먼저 적용되고 다음 회차부터 +증가되는 것,

sum 덧셈 cnt 횟수 의미 신경써서 문제 분석하기

 

JAVA 주석

1
//, /*여러줄*/
cs

 

 

 

12/15 문제. 7의 배수의 합이 최초로 1000을 넘는 수가 몇번째 항인지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Add7
{
    public static void main(String[] args)
    {
        int i=7, sum=0, cnt=0;
 
        for(i=7;sum<=1000;i=i+7)
        {
            sum = sum + i;
           cnt=cnt+1;
            System.out.println("count=" + cnt + " i=" + i + " sum=" + sum);
        }
    }
}
cs

 

 

 

 

 

while 반복문

~하는 동안에

for은 초기값;조건;증감이 있지만, while은 조건만 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
class Test1 //Test1 클래스
{
    public static void main(String[] args)
    {
        int i =0;
        while(i<3//조건이 참이면 출력
        {
            System.out.println(i + "hi");
            i = i + 1//이런 조건이 없으면 i = 0이므로 무한반복
        }
    }
cs

 

 

 

 

 

while 반복문 실습 문제

1. 1부터 100까지의 합

1
2
3
4
5
6
7
8
9
10
11
12
13
class Add
{
    public static void main(String[] args)
    {
        int i =1, sum = 0;
        while(i<=100
        {
            sum = sum + i;
            System.out.println(sum);
            i = i + 1;
        }
    }
}
cs

 

2. 1부터 100까지의 짝수의 합3. 1부터 100까지의 4의 배수의 갯수

1
2
3
4
5
6
7
8
9
10
11
12
13
class Add2
{
    public static void main(String[] args)
    {
        int i =2, sum = 0;
        while(i<=100
        {
            sum = sum + i;
            System.out.println(sum);
            i = i + 2;
        }
    }
}
cs


4. 7의 배수의 합이 최초로 1000을 넘는 수와 그 수가 몇번째 항인지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class WAdd7
{
    public static void main(String[] args)
    {
        int i =7, sum = 0, cnt = 1;
        while(sum<=1000)
        {
            sum = sum + i;
            System.out.println("cnt="+cnt+"sum="+sum+"i="+i);
            i = i + 7;
            cnt = cnt + 1;
        }
    }
}
cs


5. 5!

1
2
3
4
5
6
7
8
9
10
11
12
13
class Five
{
    public static void main(String[] args)
    {
        int i =1, sum = 1;
        while(i<=5)
        {
            sum = sum * i;
            System.out.println("cnt="+i+"sum="+sum);
            i = i + 1;
        }
    }
}
cs

증감과 출력 순서 주의하기!

위->아래 순차적으로 실행된다.

 

 

 

 

 

자료형 boolean -> true, false 두가지 값을 가지고 있다.

== 동일한가, != 서로 다른가

1
2
3
4
5
6
7
8
9
10
11
12
13
class Boo
{
    public static void main(String[] args)
    {
        boolean result;
        result = 5 > 3;
        System.out.println(result); //true 출력
        System.out.println(true); //true 출력
        System.out.println(5<3); //false 출력
        System.out.println(5==3); //false 출력
        System.out.println(5!=3); //true 출력
    }
}
cs

 

 

 

 

final int MAX = 5; // final을 붙이면 변수를 상수로 만들어준다, symbolic constant라고 한다.

MAX = 10; // 컴파일에러 발생

프로그래밍 시 암묵적인 룰: 변수 이름이 전체 대문자면 상수를 의미

 

 

 

 

 

복합대입연산자

i +=2; //i = i + 2;

i -= 2; //i = i - 2;

i *= 2; //i = i * 2;

i /= 2; //i = i / 2;

i %= 2; //i = i % 2; 나머지 연산자(정수에만 있는 개념)

 

 

 

 

 

증감연산자

i++; //i+1

i--; //i-1

단독 사용 시 위치는 앞뒤 상관없다(변수 본인의 값은 위치 상관없이 바뀐다)

대입연산자와 함께 사용 할 경우 상관있다.

result1 = ++num1; //증가한 값이 대입된다.
result2 = num2++; //증가하기 전의 값이 대입된다.

1
2
3
4
5
6
7
8
9
class Sens
{
    public static void main(String[] args)
    {
        int num1 = 10;
        System.out.println(num1++); //10
        System.out.println(num1); //11
    }
}
cs

System.out.println(num1++);

변수 값 변경을 따로 선언(num1 = num1++;)하지 않아도 출력한 값이 변수에 저장된다.

예를 들어 System.out.println(num1=num1+2); 으로 출력만 해도 num1 값이 변경되어 있다.

 

 

 

 

 

for/while 반복문과 중괄호

중괄호를 지워도 컴파일은 되지만 단 한문장만 for/while에 소속된 문장으로 인식된다.

1
2
3
4
5
6
7
8
9
10
class For1
{
    public static void main(String[] args)
    {
        int i = 0;
        for(i=0;i<3;i++)
            System.out.println("hi"); //세번 출력
            System.out.println("good"); //한번 출력
    }
}
cs
1
2
3
4
5
6
7
8
9
10
class While1
{
    public static void main(String[] args)
    {
        int i = 0;
        while(i<3)
            System.out.println("hi"); //무한대 출력
            i++;
    }
}
cs

 

 

 

 

for/while 반복문과 세미콜론

for/while문의 조건은 true여부를 판단하는 것

int i = 0;

for(;i<3;i++) //for문 내에서 선언문을 지워도 컴파일 가능

for(;j<3;) //증감문 지워도 컴파일 가능, 무한 반복하게 됨, while문과 동일해진다.

for(;;) //컴파일 가능, turu로 인식된다, 무한 반복하게 됨

for() //컴파일 불가능

 

while(turu) //무한루프

while(false) //한번도 진행되지 않는다

while() //컴파일 불가능

 

 

 

 

 

 

do while 반복문

for 반복문과 while 반복문은 선체크 반복문, 조건을 만족해야 수행한다.

do while문은 후체크 반복문

1
2
3
4
5
6
7
8
9
10
class DoWhile
{
    public static void main(String[] args)
    {
        int i = 10;
        do{
            System.out.println("Hi");
        }while(i<3);
    }
}
cs

조건을 만족하든/안하든 무조건 한번은 실행된다.

}while(i<3); 세미콜론 붙여줘야 하는 점 주의!

1
2
3
4
5
6
7
8
9
10
11
class DoWhile
{
    public static void main(String[] args)
    {
        int i = 0;
        do{
            System.out.println("Hi");
            i++;
        }while(i<3);
    }
}
cs

 

 

 

 

 

do while 반복문 실습 문제

1. 1부터 100까지의 합

1
2
3
4
5
6
7
8
9
10
11
12
class DoWhile1
{
    public static void main(String[] args)
    {
        int i = 1, sum = 0;
        do{
            sum += i;
            System.out.println("sum="+sum+"i="+i);
            i++;
        }while(i<=100);
    }
}
cs


2. 1부터 100까지의 짝수의 합

1
2
3
4
5
6
7
8
9
10
11
12
class DoWhile2
{
    public static void main(String[] args)
    {
        int i = 2, sum = 0;
        do{
            sum += i;
            System.out.println("sum="+sum+"i="+i);
            i = i + 2;
        }while(i<=100);
    }
}
cs


3. 1부터 100까지의 4의 배수의 갯수

1
2
3
4
5
6
7
8
9
10
11
12
class DoWhile3
{
    public static void main(String[] args)
    {
        int i = 4, cnt = 0;
        do{
            cnt += 1;
            System.out.println("cnt="+cnt+"i="+i);
            i += 4;
        }while(i<=100);
    }
}
cs


4. 7의 배수의 합이 최초로 1000을 넘는 수와 그 수가 몇번째 항인지

1
2
3
4
5
6
7
8
9
10
11
12
13
class DoWhile4
{
    public static void main(String[] args)
    {
        int i = 7, cnt = 0, sum = 0;
        do{
           cnt += 1;
           sum += i;
            System.out.println("cnt="+cnt+"sum="+sum+"i="+i);
            i += 7;
        }while(sum<=1000);
    }
}
cs


5. 5!

1
2
3
4
5
6
7
8
9
10
11
12
class DoWhile5
{
    public static void main(String[] args)
    {
        int i = 1, fac = 1;
        do{
            fac *= i;
            System.out.println("fac="+fac+"i="+i);
            i++;
        }while(i<=5);
    }
}
cs

 

 

<손코딩 test 중요한 부분>

프로그램 짜다보면 무한루프를 돌려야 하는 상황이 많다

while(true)

 

Symbolic constant

final int MAX = 5;

 

 

 

 

 

if(조건){} -> 조건이 참이면 실행

else{} -> 조건이 거짓이면 실행

else는 단독으로 사용 불가하며 if가 바로 앞에 사용되어야 한다.

 

if - else if - else 순으로 사용 가능

if, else if -> 각 조건이 참이면 실행

else if 또한 단독으로 사용 불가하며 if가 바로 앞에 사용되어야 한다.

else: 위에 조건들이 '모두' 거짓이면 실행

 

 

 

 

 

 

java 사용자로부터 입력받기

import java.util.Scanner;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Scanner;
 
class SCTest
{
    public static void main(String[] args)
    {
    Scanner sc = new Scanner(System.in); //sc는 만든 변수이름, 사용자로부터 값을 입력받을 수 있다.
    int num1 = 0, num2 = 0;
    System.out.println("첫 번째 숫자 입력: ");
    num1 = sc.nextInt(); //Int 인트
    System.out.println("두 번째 숫자 입력: ");
    num2 = sc.nextInt();
    System.out.println("당신이 입력한 두 숫자는 " + num1 + "와(과) " + num2 + "입니다.");
    }
cs

 

예제: 임의의 두 수를 입력받아 큰 수를 출력하시오. 두 수가 서로 같으면 같다고 출력

 

세 경우 모두 if로만 짤 수도 있지만 else를 활용하여 짜면 실행횟수를 줄일 수 있어서 효율적

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
import java.util.Scanner;
 
class SCt1
{
    public static void main(String[] args)
    {
    Scanner sc = new Scanner(System.in);
    int num1 = 0, num2 = 0;
    System.out.println("첫 번째 숫자 입력: ");
    num1 = sc.nextInt(); 
    System.out.println("두 번째 숫자 입력: ");
    num2 = sc.nextInt();
    if(num1>num2)
    {
        System.out.println(num1 + "과(와) " + num2 + " 중 더 큰 수는 " + num1 + "입니다.");
    }
    else if(num1==num2)
    {
        System.out.println("입력한 수는 " + num1 + "과(와) " + num2 + "(으)로 동일합니다.");
    }
    else
    {
        System.out.println(num1 + "과(와) " + num2 + " 중 더 큰 수는 " + num2 + "입니다.");
    }
    }
}
cs
내 코드에서 아쉬운 부분: if, else if, else에서 속한 실행문이 한줄이므로 중괄호 생략 가능

 

 

 

 

 

for(int i=1;i<=100;i++)

  if(i%4==0) cnt++;

 

for(int i=4;i<=100;i+=4)

  cnt++;

 

후자가 더 효율적인 코드. if문이 가장 과부화를 유발한다. 

 

 

 

 

 

 

Swap 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
class Swap
{
    public static void main(String[] args)
    {
    int num1 = 10, num2 = 5;
    System.out.println(num1 + " " + num2); //10 5
    int num = 0;
    num = num1;
    num1 = num2;
    num2 = num;
    System.out.println(num1 + " " + num2); //5 10
    }
}
cs

내 코드에서 아쉬운 부분: temp 임시로 많이 쓰는 변수이름 템포러리! 변수이름도 의미있게 짓기

 

 

 

 

 

예제: 임의의 5개 숫자를 입력받아 오름차순으로 나열하기(점점 커지게)

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import java.util.Scanner;
 
class OrderA
{
    public static void main(String[] args)
    {
    Scanner sc = new Scanner(System.in);
    int num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0;
     System.out.println("첫 번째 숫자 입력: ");
        num1 = sc.nextInt(); 
     System.out.println("두 번째 숫자 입력: ");
        num2 = sc.nextInt(); 
     System.out.println("세 번째 숫자 입력: ");
        num3 = sc.nextInt(); 
     System.out.println("네 번째 숫자 입력: ");
        num4 = sc.nextInt(); 
     System.out.println("다섯 번째 숫자 입력: ");
        num5 = sc.nextInt(); 
    
    int temp = 0;
 
    if(num1>num2)
    {
        temp = num1;
        num1 = num2;
        num2 = temp;
    }
 
    if(num1>num3)
    {
        temp = num1;
        num1 = num3;
        num3 = temp;
    }
    if(num1>num4)
    {
        temp = num1;
        num1 = num4;
        num4 = temp;
    }
    if(num1>num5)
    {
        temp = num1;
        num1 = num5;
        num5 = temp;
    }
 
    System.out.print("오름차순 정렬: " + num1 + ", ");
 
    if(num2>num3)
    {
        temp = num2;
        num2 = num3;
        num3 = temp;
    }
    if(num2>num4)
    {
        temp = num2;
        num2 = num4;
        num4 = temp;
    }
    if(num2>num5)
    {
        temp = num2;
        num2 = num5;
        num5 = temp;
    }
 
    System.out.print(num2 + ", ");
 
    if(num3>num4)
    {
        temp = num3;
        num3 = num4;
        num4 = temp;
    }
    if(num3>num5)
    {
        temp = num3;
        num3 = num5;
        num5 = temp;
    }
 
    System.out.print(num3 + ", ");
 
    if(num4>num5)
    {
        temp = num4;
        num4 = num5;
        num5 = temp;
    }
 
    System.out.print(num4 + ", " + num5);
    }
}
cs

내 코드에서 아쉬운 부분: 하나하나 따로 출력할 필요 없이 마지막에 한꺼번에 출력해도 됐음!

 

규칙성을 가지고 있다 -> 반복문을 적용시킬 수 있다.

반복문을 적용시키기 위해서는 동일한 이름의 변수가 필요 -> 하나의 이름으로 묶을 수 있는게 없을까 -> 배열

 

 

continue와 break

반복문 안에서 흐름을 임의로 변경시킬 때 쓸 수 있다.

반복문 밖에서 사용할 수 없다. -> 컴파일 불가

 

1
2
3
4
5
6
7
8
9
10
11
12
13
class Break
{
    public static void main(String[] args)
    {
    int i = 0;
    for(i=0;i<10;i++)
    {
        if(i>5break;
        System.out.println("Hello");
    }
    System.out.println("i=" + i); //6일때 빠져나왔으니 6출력
    }
}
cs

 

continue을 만나는 순간 반복문의 가장 위로 간다

1
2
3
4
5
6
7
8
9
10
11
12
13
class Conti
{
    public static void main(String[] args)
    {
    int i = 0;
    for(i=0;i<10;i++)
    {
        if(i>5continue;
        System.out.println("Hello");
    }
    System.out.println("i=" + i); //10일때 빠져나왔으니 10출력
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
class Conti
{
    public static void main(String[] args)
    {
    int i = 0;
    while(i<10)
    {
        if(i>5continue;
        System.out.println("Hello");
        i++//밑에있으면 무한 반복이 되고, continue위에 있어야 빠져나올 수 있다.
    }
    }
}
cs

 

 

 

 

 

continue와 break 예제

예제1. for(i=1;true;i++)으로 설정하고 1+2+3+... 순차적으로 더했을 때 최초로 5000을 넘는 수를 break를 통해 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
class Break1
{
    public static void main(String[] args)
    {
    int i = 0, sum = 0;
    for(i=1;true;i++)
    {
        sum+=i;
        if(sum>5000break;
    }
    System.out.println("i=" + i + " sum=" + sum);
    }
}
cs

예제2. 1부터 20까지 출력을 하는데 2의 배수와 3의 배수는 출력하지 않기 continue 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
class Conti1
{
    public static void main(String[] args)
    {
    int i = 0;
    for(i=1;i<=20;i++)
    {
        if(i%2==0continue;
        if(i%3==0continue;
        System.out.println(i);
    }
    }
}
cs

예제3. 5의 배수이자 7의 배수인 가장 작은 수 break

1
2
3
4
5
6
7
8
9
10
11
12
13
class Break2
{
    public static void main(String[] args)
    {
    int i = 0;
    for(i=1;;i++)
    {
        if(i%5==0)
            if(i%7==0break;
    }
    System.out.println(i);
    }
}
cs

예제4. 100 이하의 자연수 중에 5의 배수이자 7의 배수인 정수를 전부 출력하고, 그 수를 세어보는 프로그램 continue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Conti2
{
    public static void main(String[] args)
    {
    int i = 0, temp = 0, cnt = 0;
    for(i=35;i<=100;i++)
    {
        if(i%5==0)
        {
            if(i%7!=0continue;
            System.out.println("100 이하 5의 배수이자 7의 배수: " + i);
            cnt += 1;
        }
    }
    System.out.println("총 개수: " + cnt);
    }
}
cs