변수
변수
프로그램이 실행되는 동안에 언제든지 저장된 값이 변경될 수 잇는 공간
상수
한 번 정해지면 값을 변경할 필요x 데이터
변수 <--> 상수
문자형
int | double | string |
정수 | 실수 | 문자형 |
package Tutorial2;
public class Main {
public static void main(String[] args) {
// 변수 형태 의미
// int는 정수
int intType = 100;
// double 실수
double doubleytype = 150.5;
// 문자형 string
String stringType = "나동빈";
// println은 괄호에 들어간 내용을 출력하고 한칸 줄바꿈을 해라를 의미
System.out.println(intType);
System.out.println(doubleytype);
System.out.println(stringType);
}
}
final
한번 선언이 되면 절대로 바꿀 수 없는 것을 의미
package Tutorial2;
public class Main {
// final은 한번 선언이 되면 절대로 바꿀 수 없는 것을 의미
final static double PI = 3.14;
public static void main(String[] args) {
int r = 30;
System.out.println(r * r * PI); // 2826
}
}
오버 플로
package Tutorial2;
public class Main {
final static int TNT_MAX = 2147483647;
public static void main(String[] args) {
int a = TNT_MAX;
System.out.println(a + 1); // -2147483648
}
}
오버 플로 발생한다.
왜? int는 -21억 ~ +21억으로 구성됨
위 코드를 참조하면 2147483647는 최댓값(즉, +21억), -2147483647 최솟값(즉, -21억)
가장 큰 값에서 1을 더해버리면 가장 작은 값으로 돌아가는 순환구조적 오류가 발생한다.
(위 코드에서는 가장 큰 값에서 a + 1을 하니 가장 작은 값이 됨)
package Tutorial2;
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("a + b= " + (a + b));
System.out.println("a - b= " + (a - b));
System.out.println("a * b= " + (a * b));
System.out.println("a / b= " + (a / b));
}
}
- 자바는 변수 초기화를 하지 않으면 사용 x
- 정수를 나타내는 타입만 해도 short, int, long으로 다양
- 정수 변수 안에 실수를 넣으면 정수 부분만 변수에 저장
- 실수 값을 반올림할 때는 변수에 0.5를 더한 뒤에 정수형으로 형변환
- 반올림한 값 = (int)(실수 + 0.5)
package Tutorial2;
public class Main {
public static void main(String[] args) {
// int a = 0.5 -> 오류 발생 (해결 방법: (int)를 작성해 형변환 시켜준다)
double b = 0.5;
int a = (int) (b + 0.5);
System.out.println(a); // b + 0.5 먼저 계산한 다음 (int) 형변환
}
}
자료형
Variables Data Types
- Integer
- Character
- Float
- Double
double형을 이용해 평균을 구하는 프로그램
package Tutorial3;
public class Main {
public static void main(String[] args) {
double a = 10.3;
double b = 9.6;
double c = 10.1;
System.out.println((a+b+c)/3);
}
}
아스키코드 기반의 char형을 사용해 a부터 z까지 출력하는 프로그램
package Tutorial3;
public class Main {
public static void main(String[] args) {
for(char i = 'a'; i <= 'z'; i++) {
System.out.println(i + "");
}
}
}
10진수를 8진수 혹은 16진수로 바꾸어 출력
package Tutorial3;
public class Main {
public static void main(String[] args) {
int a = 200;
System.out.println("10진수: " + a);
// a라는 값이 %o에 위치해 들어가게 되는데
// %o가 의미하는 것은 10진수를 8진수로 변환
// \n 줄바꿈
System.out.format("8진수: %o\n", a); // Corrected variable usage
System.out.format("16진수: %x", a); // Corrected variable usage
}
}
String의 substring함수를 활용
package Tutorial3;
public class Main {
public static void main(String[] args) {
String name = "John Doe";
System.out.println(name);
System.out.println(name.substring(0, 1));
}
}
- 기본적으로 정수를 나타내는 자료형이 많은 이유는 각 자료형이 차지하는 메모리 공간의 크기가 다르기 때문
- double형이라고 하더락도 과도하게 큰 수를 저장하고자하면 잘못된 계산 결과가 나온다.
- 소수점 표기 형식을 지수 형식으로 출력하고 싶으면 %e를 이용하면 된다.
- 자바에서 String은 내부적으로 char의 배열로 되어있다. 자바에서 String의 최대 크기는 어떻게 될까? 약 4기가만큼 담을 수 있다.
- 자바의 String은 클래스 기반의 비원시적인 자료형이다.
연산자
초를 입력 받아 몇분 몇초인지 계산하는 프로그램 작성
package Tutorial4;
public class Main {
final static int SECOND = 1000;
public static void main(String[] args) {
int minute = SECOND / 60;
int second = SECOND % 60;
System.out.println(minute + "분 " + second + "초");
}
}
++와 --연산의 개념 이해하고 프로그램 작성
package Tutorial4;
public class Main {
public static void main(String[] args) {
int a = 10;
System.out.println("현재의 a는 " + a +"입니다.");
a++;
System.out.println("현재의 a는 " + ++a +"입니다.");
System.out.println("현재의 a는 " + a++ +"입니다."); // 출력이 되고 나서 +1됨
System.out.println("현재의 a는 " + a + "입니다.");
}
}
%연산자의 사용법을 숙지하고 프로그램 작성
package Tutorial4;
public class Main {
final static int SECOND = 1000;
public static void main(String[] args) {
System.out.println(1 % 3);
System.out.println(2 % 3);
System.out.println(3 % 3);
System.out.println(4 % 3);
System.out.println(5 % 3);
}
}
삼항조건 연산자
package Tutorial4;
public class Main {
public static void main(String[] args) {
int x = 50;
int y = 60;
System.out.println("최댓값" + max(x, y) + "입니다.");
}
// 반환형, 함수 이름, 매개 변수
static int max (int a, int b) {
int result = (a>b) ? a: b;
return result;
}
}
pow()를 이용한 거듭제곱 연산 프로그램 작성
package Tutorial4;
public class Main {
public static void main(String[] args) {
double a = Math.pow(3.0, 20.0);
System.out.println("3의 20제곱은" + (int) a + "입니다.");
}
}
- i++와 ++i는 단순히 값을 증가시키려는 목적이라면 그 기능이 동일하다.
- 100 < x <200은 잘못된 표현, (100<x) &&(x<200)로 표현하는 것이 올바른 연산식 표현
- i++는 i+=1과 동일한 표
조건문 & 반복문
if문을 이용해 문자열이 특정 문자열을 포함하는지 확인하는 프로그램 작성
package Tutoiral5;
public class Main {
public static void main(String[] args) {
String a = "I Love You";
// contain함수는 특정 문자 포함 여부 검사
if(a.contains("Love")) {
// 포함하는 경우 실행되는 부분
System.out.println("Me too");
} else {
System.out.println("i hate you");
}
}
}
문자열과 정수형을 각각 조건문을 이용해 활용해보고 차이점 공부
package Tutorial6;
public class Main {
public static void main(String[] args) {
String a = "Man";
int b = 0;
// 자바는 String을 비교할 때 equal()을 이용한다.
// 그 이유는 String은 다른 자료형과 다른 문자형이기에
if(a.equals("Man")) {
System.out.println("남자입니다.");
} else {
System.out.println("남자가 아닙니다.");
}
// 대소문자를 무시하고 같은지 문자 자체로 비교하는 것
if(a.equalsIgnoreCase("man") && b == 0) {
System.out.println("참입니다.");
}
}
}
while을 이용해 1부터 1000까지 합
while: ~동안
package Tutorial6;
public class Main {
public static void main(String[] args) {
int i = 1, sum = 0;
while(i <= 1000)
{
sum+=i++;
}
System.out.println("1부터 1000까지의 합은"+sum+"입니다.");
}
}
for문을 이용해 삼각형 프로그램 작성
package Tutorial6;
public class Main {
final static int N = 30;
public static void main(String[] args) {
// for문: 초기화 부분, 조건 부분, 연산 부분
for (int i = N; i > 0; i--) { // i는 30부터 1까지 감소
for (int j = i; j > 0; j--) { // j는 i부터 1까지 감소
System.out.print("*"); // 별 출력 (줄바꿈 X)
}
System.out.println(); // 줄 바꿈
}
}
}
- 하나의 비교 연산자는 true 혹은 false를 반환한다.
- 모든 조건문, 반복문에서는 왠만하면 무조건 괄호를 적용하기
- for문 혹은 while문은 얼마든지 중첩 가능
- for(;;)는 while(true)와 똑같이 무한루프라는 의미로 작동
- break;를통해 반복문 즉시 빠져나옴
기본 입출력
입출력은 사용자의 상호작용을 의미
자바에서는 대표적으로 Scanner 클래스 이용
Scanner sc = new Scanner(System.in);으로 클래스 객체를 생성한 뒤 sc.nextInt()와 같은 방법으로 int형을 입력받음
입력받은 자료는 내부적으로 어떠한 처리를 한 뒤에 다시 사용자에게 그 값을 반환
프로그램이 입출력을 잘 지원한다는 것은 사용자 인터페이스가 뛰어나다는 것을 의미
클래스는 내부적으로 함수를 가질 수 있다.
특정한 정수를 입력 받아 그래도 출력
package Tutorial7;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력하세요: ");
int i = sc.nextInt();
System.out.println("입력한 정수: " + i);
sc.close(); // Scanner 닫기
}
}
파일에 차례로 입력된 모든 정수에 100을 곱해 출력하는 프로그램 작성
package Tutorial7;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
File file = new File("input.txt");
try {
Scanner sc = new Scanner(file);
while (sc.hasNextInt()) {
System.out.println(sc.nextInt() * 100);
}
sc.close();
} catch (FileNotFoundException e) {
System.out.println("파일을 읽어오는 도중에 오류가 발생했습니다.");
}
}
}
주석은 최대한 많이 작성하자
Scanner로 문자열을 입력 받고 싶을 때에는 next()함수와 nextLine()을 적절히 사용하자
사용자 정의 함수
사용자 정의 함수는 정해진 특정한 기능을 수행하는 모듈을 의미. 함수를 적절히 활용하면 하난의 문제를 잘게 분해 가능
만일 사용자 정의 함수가 없다면 오직 메인 함수에서 모든 알고리즘을 처리해야하는데 이는 작업의 효율성을 저하시킬 수 있음. 또한 함수는 각각의 모듈로서 쉽게 수정되고 보완가능
3개의 수 최대 공약수 프로그램 작성
package Tutorial8;
public class Main {
// 반환형, 함수명, 매개변수
public static int function(int a, int b, int c ) {
int min;
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) {
System.out.println("400 300 750)의 최대 공약수: " + function(400, 300, 750));
}
}
약수 중 k번째로 작은 수를 찾는 프로그램 작성
package Tutorial9;
public class Main {
public static int function(int number, int k) {
for(int i = 1; i <= number; i++) {
if(number % i == 0) {
k--;
if(k == 0) {
return i;
}
}
}
return -1;
}
public static void main(String[] args) {
int result = function(3050, 10);
if(result == -1) {
System.out.println("3050의 10번재 약수는 없습니다. ");
} else {
System.out.println("3050의 10번째 약수는 " + result +"입니다.");
}
}
}
문자열에서 마지막 단어를 반환하는 함수 작성
package Tutorial9;
public class Main {
public static char function(String input) {
// 가장 마지막 문자에 해당하는 단어 하나를 반환한다.
// charAt 은 특정한 단어를 0부터 시작해서 -1를 빼줌
return input.charAt(input.length() -1);
}
public static void main(String[] args) {
System.out.println("Hello World의 마지막 단어는 " +function("Hello World"));
}
}
max()를 이용하여 최대값을 저장하는 프로그램 작성
package Tutorial9;
public class Main {
public static int max(int a, int b) {
return (a > b) ? a : b;
}
public static int function(int a, int b, int c) {
int result = max(a, b); // Fixed the typo
result = max(result, c);
return result;
}
public static void main(String[] args) {
System.out.println("(345,567, 789)중에서 가장 큰 값은? " + function(345,567, 789)); }
}
반복 함수와 재귀 함수
단순히 while혹은for문을 이용해 특정한 처리를 반복하는 방식으로 해결하는 함수
재귀 함수는 자신의 함수 내부에서 자기 자신을 스스로 호출함으로써 재귀적으로 문제를 해결하느 ㄴ함수
재귀함수는 경우에 따라서 아주 간결하고 직관적인 코드로 문제를 해결해주지만 심각한 비효율성을 낳을 수 있어서 유의하기!
팩토리얼을 반복 함수로 구현
package Tutorial10;
public class Main {
// 5!
public static int factorial(int number) {
int sum = 1;
for(int i = 2; i <= number; i++) {
sum *= i;
}
return sum; // 결과 반환
}
public static void main(String[] args) {
System.out.print("5팩토리얼은 " + factorial(5));
}
}
팩토리얼을 재 함수로 구현
package Tutorial10;
public class Main {
// 5!
public static int factorial(int number) {
if(number == 1)
return 1;
else
return number * factorial(number -1);
}
public static void main(String[] args) {
System.out.print("5팩토리얼은 " + factorial(5));
}
}
피보나치 수열이란?
두개의 수를 계속 더하는 것!
피보나치 수열을 반복 함수로 구현
package Tutorial11;
public class Main {
public static int fibonacci(int number) {
int one = 1;
int two = 1;
// -1이 나오면 피보나치 수열은 문제가 있는 값이다.
int result = -1;
if(number == 1) {
return one;
} else if(number == 2) {
return two;
} else {
for(int i = 2; i < number; i++) {
result = one + two;
one = two;
two = result;
}
}
return result;
}
public static void main(String[] args) {
System.out.println("피보나치 수열의 10번째 원소는" + fibonacci(10) +"입니다.");
}
}
피보나치 수열을 재귀 함수로 구현
package Tutorial11;
public class Main {
public static int fibonacci(int number) {
if(number == 1) {
return 1;
} else if(number ==2) {
return 1;
} else {
return fibonacci(number -1 ) + fibonacci(number -2);
}
}
public static void main(String[] args) {
System.out.println("피보나치 수열의 10번째 원소는" + fibonacci(10) +"입니다.");
}
}
재귀함수는 숫자가 커지만 많은 시간 소비
배열
데이터를 많이 사용하는 것
new는 어떠한 인스턴스(변수)를 만들때 약속된 하나의 언어
하나의 문법이다라고 생각하기!
두번째 대괄호 안에는 크기가 들어간다.
package Tutorial12;
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 scanner = new Scanner(System.in);
System.out.println("생성할 배열의 크기를 입력하세요: ");
int number = scanner.nextInt();
int[] array = new int[number];
for(int i = 0; i < number; i++) {
System.out.println("배열에 입력할 정수를 하나씩 입력하세요.");
array[i] = scanner.nextInt();
}
int result = -1;
for(int i = 0; i < number; i++) {
result = max(result, array[i]);
}
System.out.println("배열에서 가장 큰 값은: " + result);
}
}
package Tutorial12;
public class Main {
public static void main(String[] args) {
int[] array = new int[100];
for(int i = 0; i < 100; i++) {
array[i] = (int)(Math.random() * 100 + 1);
}
int sum = 0;
for(int i = 0; i < 100; i++) {
sum += array[i];
}
System.out.println("100개의 랜덤 정수의 평균 값은?" + sum/100);
}
}
다차원 배열
package Tutorial13;
public class Main {
public static void main(String[] args) {
int N = 50;
int[][] array = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
array[i][j] = (int) (Math.random() * 10);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
}