※우선 이 글은 자바가 설치되어 있다는 가정하에 이클립스를 기반으로 작성합니다.
처음 해보는 블로그 포스팅이었다 보니까 아직 꾸미는 것이나 작동하는 면에서 많이 미숙한 점이 많은 것 같습니다. 그래도 이 글을 보시는 분들과 저의 성장과정이라고 생각하고 좋게 봐주셨으면 좋겠습니다.
오늘 공부 순서는
1. 객체지향이란?
2. 사용자 정의 메소드(함수)
3. 반복 메소드(함수)
4. 재귀 메소드(함수)
5. 배열
6. 다차원 배열(2차원)
이렇게 구성되어 있습니다. 그럼 시작하겠습니다.
객체지향이란?
-객체지향 : 객체는 실세계에 존재하거나 생각할 수 있는 것을 뜻하면 이에 대한 데이터만이 아니라 그 데이터의 조작 방법에 대한 정보를 포함하고 있어 이를 다루는 수법을 객체지향이라고 한다.
-객체지향 프로그래밍 : 객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
이렇게 정의되어 있습니다. 지금 우리가 공부하는 '자바'라는 언어도 객체지향 언어입니다.
사용자 정의 메소드(함수)
: 정해진 특정한 기능을 수행하는 모듈입니다.
ex) int max(int a, int b) -> 반환 타입 함수 이름(매개변수)으로 구성되고 사용자가 쉽게 정의할 수 있습니다.
어떻게 구동이 되는지 3개의 수를 입력받고 그 수들의 최대공약수를 찾는 프로그램으로 보여드리겠습니다.
코드로 보겠습니다.
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
|
import java.util.Scanner;
public class Main {
//반환명, 함수명,매개변수
public static int function(int a, int b, int c) {
int min; //최대공약수를 구하려면 3가지 수에서 가장 작은수를 찾아야한다.
if(a > b) {
if(b > c) {
min = c;
}
else {
min = b;
}
}
else {
if(a > c) {
min = c;
}
else {
min = a;
}
}
for(int i = min; i > 0; i--) {
if(a % i ==0 && b % i == 0 && c % i ==0) {
return i;
}
}
return -1; //최대공약수가 없는 경우
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("최대공약수를 구하려는 숫자 3개를 입력하세요. :");
int a = s.nextInt();
int b = s.nextInt();
int c = s.nextInt();
System.out.println("(" + a + ", " + b + ", " + c + ")의 최대공약수 : "+ function(a, b, c));
}
}
|
cs |
+ ) 조건문 if를 더 간단히 쓸 수 있지만 보기 쉽게 작성했습니다. 여기서 min을 찾아야 하는 이유는 최대공약수는 기본적으로 주어진 값과 같을 수는 있지만 클 수는 없기 때문입니다.
다음 보실 코드는 입력받은 수의 약수 중 n번째로 작은 약수를 찾는 프로그램입니다.
코드로 보겠습니다.
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
|
import java.util.Scanner;
public class Main {
public static int function(int number, int n) {
for(int i = 1; i <= number; i++) {
if(number % i == 0) {
n--;
if(n == 0) {
return i;
} //약수를 찾을 때마다 n을 감소시키면 10번째 약수를 찾을 때면 n이 0이되어 리턴된다.
}
}
return -1; //약수를 찾지 못한 경우
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("약수를 찾을 수와 몇번째로 작은 약수를 구할 것인지 입력하시오. :");
int number = s.nextInt();
int n = s.nextInt(); //매개변수의 변수이름과 메인문의 변수이름은 같지않아도 된다.
int result = function(number, n);
if(result == -1) {
System.out.println("입력받은 수 " + number + "의 " + n + "번째 약수는 없습니다.");
}
else {
System.out.println("입력받은 수 " + number + "의 " + n + "번째 약수는 " + result + "입니다.");
}
}
}
|
cs |
이번에 보실 코드는 문자열과 숫자 n을 입력받았을 때 그 문자열의 뒤에서 n번째 단어를 출력하는 프로그램입니다.
코드로 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.Scanner;
public class Main {
public static char function(String sentence, int num) {
return sentence.charAt(sentence.length() - (num));
} // sentence.length()는 입력받은 sentence의 길이를 나타낸다.
// charAt()는 주어진 인자를 0부터 각각 하나로 관리할 수 있다.
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("문자열과 뒤에서 몇번째 단어를 구할것인지 입력하세요. :");
String a = s.nextLine();
int n = s.nextInt();
System.out.println("입력 값의 마지막 단어는 " + function(a, n));
}
}
|
cs |
이번 코드는 메소드이름을 max()로 정의해서 값을 2개, 3개 입력하였을 때의 각각의 최댓값을 구하는 프로그램입니다.
메소드 오버로딩도 사용합니다. 메소드 오버로딩은 저도 후에 천천히 설명할 예정이니 코드로 봐주시면 됩니다.
코드로 보겠습니다.
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
|
import java.util.Scanner;
public class Main{
public static int max(int a, int b) { //인자가 2개인경우
if(a > b) {
return a;
}
else {
return b;
}
} //3항연산자로 표기하면 if문을 삭제하고 return (a > b) ? a : b; 로 작성합니다.
public static int max(int a, int b, int c) {
int result = max(a, b); //첫번째 메소드 호출
result = max(result, c); //첫번째 메소드 호출
return result;
}
//여기서 보면 선언한 2개의 메소드의 이름이 같은데 이는 메소드 중복정의 즉, 메소드 오버로딩이라고 한다. 후에 설명하겠습니다.
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("최대값을 구할 수 2개 또는 3개를 입력하시오. :");
int num1 = s.nextInt();
int num2 = s.nextInt();
int num3 = s.nextInt();
//메소드의 이름이 max로 같지만 매개변수의 수가 다르므로 각각 다른 메소드를 호출한다.
System.out.println("입력한 두 숫자중 더 큰 수는 " + max(num1, num2) + "입니다.");
//처음 선언한 max메소드 호출
System.out.println("입력한 세 숫자중 더 큰 수는 " + max(num1, num2, num3) + "입니다.");
} //두번째로 선언한 max메소드 호출
}
|
cs |
출력 값에서 이상함을 느끼실 수 있는데, 출력이 이렇게 되는 이유는 처음 선언한 max() 메소드의 경우 2개의 인자 값을 받지만, 두 번째의 max() 메소드의 경우 3개의 인자 값을 받으므로 출력 값이 다릅니다.
반복 메소드(함수)
: while 혹은 for문을 이용하여 특정한 처리를 반복하는 함수입니다.
이번에는 for문을 사용한 코드 2개를 보여드릴 겁니다. 그전에 문제에서 사용하는 팩토리얼, 피보나치수열에 대해서 설명해 드리겠습니다.
팩토리얼 : 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 말하며 n!로 나타낸다.
피보나치수열 : 처음 두 항을 1과 1로 한 후, 그다음 항부터는 바로 앞의 두 개의 항을 더해 만드는 수열을 말한다.
-> 1 1 2 3 5 8 13 21 34 55...
먼저 n까지의 팩토리얼을 구하는 코드를 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.Scanner;
public class Main {
public static int factorial(int num) {
int sum = 1; //sum을 0으로 하면 sum에 i값을 곱해줄 떄 계속 0이 나온다.
for(int i = 2; i <= num; i++) {
sum *= i;
}
return sum;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("몇까지의 팩토리얼을 구할까요? :");
int n = s.nextInt();
System.out.println(n + "!은 " + factorial(n) + "입니다.");
}
}
|
cs |
이번에는 반복문을 이용한 피보나치수열의 n번째 항을 구하는 코드를 보겠습니다.
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
|
import java.util.Scanner;
public class Main {
public static int fibonacci(int num) {
int num1 = 1;
int num2 = 1;
int result = -1; //문제 발생 시 출력값
if(num == 1) {
return num1; //첫번째 항은 1
}
else if(num == 2) {
return num2; //두번째 항은 1
}
else {
for(int i =2; i < num ; i++) {
result = num1 + num2; //(n-2)와 (n-1)의 합은 n
num1 = num2; //(n+1)을 구할때는 전 피보나치 수열 값의 (n-1)이 (n-2)가 된다.
num2 = result; //(n+1)을 구할때는 전 피보나치 수열 값의 n이 (n-1)이 된다.
}
}
return result;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("피보나치 수열의 몇번째 항을 구할까요? :");
int n = s.nextInt();
System.out.println(n + "번째 피보나치 수열의 항은 " + fibonacci(n) + "입니다.");
}
}
|
cs |
재귀 메소드(함수)
: 자신의 함수 내부에서 자기 자신을 호출하여 재귀적으로 문제를 해결하는 함수
위에서 반복 메소드로 풀어본 팩토리얼, 피보나치수열 문제를 재귀 메소드로 풀어보겠습니다.
재귀 함수를 이용한 팩토리얼부터 코드로 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import java.util.Scanner;
public class Main {
public static int factorial(int num) {
if(num == 1) { //1!은 1
return 1;
}
else {
return num * factorial(num -1);
} //이렇게 작성하면 factorial(num -1)을 답을 도출할때 까지 factorial(10) = 10 * factorial(9) 이러한 형식으로 자신의 매소드를 반복한다.
} //반복하고 가장 작은 값인 위에서 선언한 1! = 1에 도달하면 거슬러 올라가 답을 도출한다.
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("몇까지의 팩토리얼을 구할까요? :");
int n = s.nextInt();
System.out.println(n + "!은 " + factorial(n) + "입니다.");
}
}
|
cs |
재귀 함수를 이용한 피보나치수열을 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.util.*;
public class Main {
public static int fibonacci(int num) {
if(num == 1 || num == 2) {
return 1;
}
else {
return fibonacci(num - 2) + fibonacci(num - 1);
} //앞에서 설명했듯이 num = (num - 2) + (num - 1)이므로 자신의 메소드를 반복한다.
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("피보나치 수열의 몇번째 항을 구할까요? :");
int n = s.nextInt();
System.out.println(n + "번째 피보나치 수열의 항은 " + fibonacci(n) + "입니다.");
}
}
|
cs |
+ ) 여기서 주의할 점은 피보나치수열을 재귀 함수로 풀었을 때 구하려는 수의 값이 커지면 커질수록 중복되는 수가 많아져 연산속도가 느려진다.
배열
: 동일한 특성을 가지며 일정한 규칙에 따라 여러 요소가 나열되어 있는 데이터들의 집합.
ex) int형 배열 선언 법 : int [] 배열 이름 = new int [배열 크기];
※배열의 순서 즉 index는 0부터 시작한다. 마지막은 n-1
문제를 통해 알아보겠습니다.
배열의 크기를 입력받고 각 위치마다 순서대로 인덱스 값을 입력받고 그중 가장 큰 인덱스 값을 출력(인덱스 값>0)
코드로 보겠습니다.
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;
public class Main {
public static int max(int a, int b) {
return (a > b) ? a : b;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("배열의 크기를 입력하세요 : ");
int num = s.nextInt();
int[] array = new int[num];
for(int i = 0; i < num; i++) {
System.out.print("배열에 입력할 양의 정수를 차례대로 입력하세요 : ");
array[i] = s.nextInt();
}
int result = -1;
for(int i = 0; i < num; i++) {
result = max(result, array[i]);
}
System.out.println("배열의 index중 가장 큰 값은 " + result + "입니다.");
}
}
|
cs |
max 메소드안에 3항 연산자를 사용했고 result라는 변수를 선언하여 비교하여 더 큰 값을 result에 저장하여 반복하여 다음 array [i] 값과 비교하여 더 큰 값을 찾아 출력하는 코드입니다.
이번에는 배열의 크기를 입력받고 그 크기만큼 랜덤한 수를 입력받고 그 수들의 합과 평균을 구하는 프로그램을 만들어보겠습니다. (랜덤 한 수의 범위는 0 <n <101 사이의 양의 정수입니다.)
코드로 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("몇 개의 랜덤한 정수의 평균을 구할까요? : ");
int n = s.nextInt();
int[] array = new int[n];
int sum = 0;
for(int i = 0; i < n; i++) {
array[i] = (int)(Math.random() * 100 + 1); //Math.random()은 랜덤한 수를 받아온다.
sum += array[i]; //랜덤한 값들의 합
} //Math.random()에 100 + 1을 한 이유는 0보다 크고 1보다 작은 랜덤한 소수점을 가져오기 때문에 조건에 맞는 1~100의 수를 구하려면 100을 곱한후 1을 더한다.
System.out.println(n + "개의 랜덤한 정수의 합은 " + sum);
System.out.println(n + "개의 랜덤한 정수의 평균은 " + sum / n);
}
}
|
cs |
다차원 배열(2차원)
: 여러 개의 차원을 가지는 배열, 배열이 배열의 원소로 들어가는 구조
[0][0] | [0][1] | [0][2] | [0][3] | [0][4] | [0][5] |
[1][0] | [1][1] | [1][2] | [1][3] | [1][4] | [1][5] |
[2][0] | [2][1] | [2][2] | [2][3] | [2][4] | [2][5] |
이와 같이 구성된다.
10 x 10의 정수 랜덤 데이터를 생성하는 프로그램을 만들어 보겠습니다.(0 <랜덤 정수 <10)
코드로 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class TenTenArray {
public static void main(String[] args) {
int n = 10;
int[][] array = new int[n][n]; //행의 크기가 10, 열의 크기가 10인 2차원 배열
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.print((int)(Math.random() * 10));
}
System.out.println();
}
}
}
|
cs |
이로써 오늘 이론이 끝났습니다. 저도 Math.random과 2차원 배열은 익숙지 않았지만 2차원 배열은 rpg게임에서 좌표로도 사용이 된다고 하더라고요. 그런 이야기들을 보니 제가 나중에 개발자가 될 수 있을까 어떤 개발자가 될까에 대한 고민이 깊어집니다. 또 은근히 수학적 지식을 필요로 하는 것 같아요. 슬슬 영어와 수학 공부도 조금씩 시작해야 하나 봅니다. 기회가 된다면 영어와 수학도 포스팅을...
이번에도 예제입니다. 풀이는 다음 포스팅에서 확인할 수 있어요.
예제 1. 2개의 값을 입력받고 2개의 값의 최소공배수를 찾는 프로그램
예제 2. 정수 n의 약수들의 합을 구하는 프로그램
예제 3. 문자열을 입력받고 문자열의 n번째 단어를 출력하는 프로그램 (사용자 정의 메소드 사용)
예제 4. 1항부터 n항까지의 피보나치수열의 합을 구하시오.
예제 5. 행의 길이와 열의 길이를 입력받아 행 X 열의 정수 랜덤 데이터(0<=n<10)를 생성한다.
'자바 공부' 카테고리의 다른 글
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 3일차 예제 풀이 (0) | 2021.01.15 |
---|---|
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 3일차 (클래스(class), 상속(inheritance), 추상(abstract), Final) (0) | 2021.01.15 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 2일차 예제 풀이 (0) | 2021.01.15 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 1일차 예제 풀이 (0) | 2021.01.13 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 1일차 (변수, 연산자, 조건문, 반복문) (0) | 2021.01.13 |