20211226 - JAVA 1~3회차 강의 복습
어디에서나 사용할 수 있게 패스 설정
내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 주석
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 |
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>5) break;
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>5) continue;
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>5) continue;
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>5000) break;
}
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==0) continue;
if(i%3==0) continue;
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==0) break;
}
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!=0) continue;
System.out.println("100 이하 5의 배수이자 7의 배수: " + i);
cnt += 1;
}
}
System.out.println("총 개수: " + cnt);
}
}
|
cs |