※ 본문 들어가기 전 Hashcode란?
Hashcode는 객체를 식별하는 Integer 값입니다. 객체가 갖고 있는 데이터를 어떤 알고리즘에 적용하여 계산된 정수 값을 hashcode라고 할 수 있습니다.
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 | package day01; import java.util.Scanner; // 자바의 소스코드는 클래스가 기본 구성 단위이다 // 자바에서 클래스를 제외한 나머지 요소는 모두 첫글자를 소문자로 시작한다 // (변수, 함수, 접근제한자, 패키지, 프로젝트...) // 단, 클래스의 static final 멤버는 모든 글자를 대문자로 작성하며 _로 단어를 구분한다 // 변수 및 함수의 이름은 소문자, _ 로 시작할 수 있다. (숫자는 첫번째 글자가 될 수 없다) /* * dao.selectAll() : 객체의 메서드를 호출 * DAO.getInstance() : 클래스의 정적 메서드를 호출 */ public class Ex01 { public static void main(String[] args) { // 자료형 (data type) /* * 1. primitive type (단순 자료형, 원시 자료형) 소문자로 시작하며 총 8개의 기초적인 자료형이 있다 복잡한 데이터가 * 아니므로, 변수에 데이터를 직접 저장한다 * * ☆ boolean 1바이트 논리값 true, false byte 1바이트 정수(8비트) -128 ~ +127 short 2바이트 * 정수(16비트) -32768 ~ +32767 char 2바이트 정수(글자) 0 ~ 65535 ☆ int 4바이트 정수(32비트) 약-21억 * ~ 약+21억 long 8바이트 정수(64비트) -922조 ~ +922조 float 4바이트 실수 ☆ double 8바이트 실수 * * * 2. Reference Type (참조 자료형) * * - Array Type : 배열 - Class Type : 클래스, 인터페이스 등... * */ // 단일 데이터를 메모리에 저장하고 싶다 -> 크기에 맞는 변수 // 같은 자료형의 데이터를 여러개 묶어서 저장하고 싶다 -> 배열 // 서로 다른 자료형의 데이터를 묶어서 저장하려면 새로운 자료형을 정의해야 한다 // 구조체 in C언어 변수만 묶어서 자료형을 만든다 // 클래스 in Java(C++) 변수와 함수를 묶어서 자료형을 만든다 Scanner sc = new Scanner(System.in); System.out.print("itbank라고 입력하세요 : "); String str1 = sc.nextLine(); String str2 = "itbank"; String str3 = new String("itbank"); String str4 = "itbank"; System.out.println(str1 == str2); System.out.println(str1 == str3); System.out.println(str2 == str3); System.out.println(str2 == str4); sc.close(); } } | 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 25 26 | package day01; public class Ex02 { public static void main(String[] args) { // 자료형 변환 double pi = 3.14; int num = (int) pi; // Type mismatch: cannot convert from double to int // 대입 연산 시, 좌변과 우변의 자료형은 같아야 한다 // 일시적으로 우변의 값을 원하는 자료형으로 변환환 이후 대입한다 (casting) int num2 = 1234; double db = num2; // num2는 정수이지만, 변수에 옮겨담으면서 암묵적으로 형변환이 발생한다 // 암묵적 형변환, promotion System.out.println("pi : " + pi); System.out.println("num : " + num); System.out.println("num2 : " + num2); System.out.println("db : " + db); } } | 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 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 | package day01; import java.util.Random; public class Ex03 { public static void main(String[] args) { // 연산자 (operator) : 데이터를 연산하기 위해 사용하는 기호 혹은 단어 /* * 단항 연산자 : 하나의 변수 혹은 값에 대하여 연산을 처리한다 (i++) * 이항 연산자 : 두개의 값을 이용하여 연산을 수행한다 (num1 + num2) * 삼항 연산자 : 세개의 값을 이용하여 연산을 수행 (login ? "로그인" : "로그아웃") * * * 산술 연산 : +, -, /, % * 증감 연산 : ++, -- * 대입 연산 : = * 복합 대입 연산 : +=, -=, *=, /=, %= * 비교 연산 : >, <, >=, <=, ==, != * 논리 연산 : &&, ||, ! * 비트 연산 : <<, >>, |, & * 최우선 연산자 : ., [], instanceof(), () * * * */ // 산술 연산, 각 항의 자료형에 따라 결과의 자료형이 달라질 수 있다 // 정수와 정수는 정수가 나온다. 실수와 정수는 실수가 나온다. 실수와 실수는 실수가 나온다. double d1 = 100 / 3; // 정수로 계산하여 몫을 구한다 double d2 = (double)100 / 3; // 실수로 계산하여 정확한 값을 구한다 double d3 = 100 / (double) 3; double d4 = 100 / 3.0; System.out.println(d1); System.out.println(d2); System.out.println(d3); System.out.println(d4); // 어떤 수를 0으로 나누면 안된다 // int test = 3 / 0; 예외 처리문을 반드시 써줘야한다 // 나머지 연산의 활용 (%) // 1) 홀수 , 짝수 (약수, 배수)를 구분할 때 사용할 수 있다 (알고리즘 문제 풀때) // 2) 어떤 수를 10의 제곱수로 나누면 0의 개수 만큼 뒷자리를 분리할 수 있다. int idNum = 930516; int date = idNum % 10; // 0의 개수만큼(2개) 뒷자리를 분리한다 idNum /= 100; int month = idNum % 100; int year = idNum / 100; System.out.printf("%d년 %d월 %d일\n", year, month, date); // 3) 난수의 범위를 제한한다 Random random = new Random(); int r = random.nextInt(); System.out.println("r : " + r); r = r % 10 + 1; // 범위 제한 System.out.println("r : " + r); r = r > 0 ? r : -r; // 부호 보정 System.out.println("r : " + r); int r2 = random.nextInt(45) + 1; System.out.println("r2 : " + r2); } } | 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 25 | package day01; public class Ex04 { public static void main(String[] args) { // 논리 연산에 의한 연산 미수행 int n1 = -1, n2 = 0, n3 = 1, n4 = 2; System.out.printf("%d, %d, %d, %d\n", n1, n2, n3, n4); boolean flag1 = n1++ + ++n2 < 0 && n3-- * ++n4 == 0; // and 조건은 앞이 false면 뒤에 조건을 보지도 않고 false를 내보낸다 // n1은 후위 연산자라 -1 + n2는 1 false && 만약 앞이 true였다면 n3은 후위 연산 1 n4는 3 1 * 3 == 0이 아니니 false로 계산 할 수 있겠지만 // 결과적으로 flag1 은 false n1 = 0 n2 = 1 그러나 n3, n4 는 and의 false 조건으로 연산을 수행하지 않는다 n3 = 1 n4 = 2 System.out.println(flag1); System.out.printf("%d, %d, %d, %d\n", n1, n2, n3, n4); // 두 조건 중 첫번째 조건만으로 전체결과가 확정된다면 // 두번째 조건은 연산을 수행하지 않는다 } } | 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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package day01; import java.util.Random; public class Ex05 { private static int min(int n1, int n2, int n3) { if(n1 > n2) n1 = n2; if(n1 > n3) n1 = n3; return n1; } public static void main(String[] args) { // 제어문 (control statement) // 프로그램의 진행 흐름을 제어하는 구문 (진행이 일률적이지 않다) Random random = new Random(); int n1 = random.nextInt(10) + 1; int n2 = random.nextInt(10) + 1; int n3 = random.nextInt(10) + 1; int min; System.out.printf("%d, %d, %d\n", n1, n2, n3); // 아래에 코드를 작성하여 3개의 정수중 가장 작은 수를 화면에 출력하세요 min = min(n1, n2, n3); System.out.println("min : " + min); } } | 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 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 | package day01; import java.util.Random; import java.util.Scanner; public class Ex06 { public static void main(String[] args) { // updown game 만들기 // 0) 코드 실행에 필요한 요인을 찾아서 변수로 선언한다 // 반복 횟수를 체크할 변수도 같이 선언한다 (초기값은 0) // 필요하다면, 초기값을 지정한다 // 1) 컴퓨터가 랜덤값을 하나 뽑게 하고, 사용자에게 반복하여 정수를 입력받는다. // 2) 입력받은 정수가 컴퓨터가 뽑은 값과 일치하는지 판별한다 // 반복을 수행할 때마다, 시도한 횟수를 1씩 증가시킨다 // 2-1) 일치하면 반복문을 중단한다 // 2-2) 정답보다 크면 down을 출력한다 // 2-3) 정답보다 작으면 up을 출력한다 // 3) 반복이 중단되면 정답을 출력하고 마무리 이후 종료한다 Random random = new Random(); int com, user, count = 0; Scanner sc = new Scanner(System.in); com = random.nextInt(100) + 1; while(true) { System.out.print("정답을 맞춰보세요 (1 ~ 100) : "); user = sc.nextInt(); count++; if(user == com) break; else if (user > com) System.out.println("down!!"); else System.out.println("up!!"); } System.out.printf("정답입니다!! %d회 만에 정답을 맞췄습니다!!\n",count); sc.close(); } } | 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 25 26 27 28 29 30 31 32 | package day01; public class Quiz1 { public static void main(String[] args) { // 첫날에 은행에 돈을 10원 준비하여 입금한다 // 둘째날에는 이전날의 두배인 20원을 준비하여 입금한다 // 셋째날에는 이전날의 두배인 40원을 준비하여 입금한다 // 이런 식으로 30일 동안 은행에 돈을 입금하면 // 30일 이후 은행 계좌에 입금된 금액의 총액은 얼마인가? // (단, 은행계좌에는 처음에 돈이 없었던 것으로 가정한다) long final_Money = 0; long save_Money = 10; for(int i = 1; i <= 30; i++) { final_Money += save_Money; save_Money *= 2; } //System.out.println("계좌 총액 : " + final_Money); System.out.printf("계좌 총액 : %,d원\n", final_Money); } } | 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 25 26 27 28 29 30 31 32 33 | package day01; import java.util.Scanner; public class Quiz2 { public static void main(String[] args) { // 버스 한 정거장 이동하는데 약 3분의 시간이 소요된다고 가정한다 // 사용자에게 이동한 정거장 수를 입력받아서 걸린 시간을 출력하세요 // 단, 시간이 60분을 초과하면 시간과 분을 나누어서 출력하세요 Scanner sc = new Scanner(System.in); System.out.print("몇 정거장을 거쳐가나요? : "); int station = sc.nextInt(); int minute = 3; // 버스 이동 시간 int result_minute = 0; // 결과 시간, 분 int result_time = 0; result_minute = minute * station; // 총 경과 분 계산 귀찮으니 변수 재활용 if(result_minute / 60 != 0 && result_minute % 60 != 0) { // 시간과 나머지 분 계산 &&는 60분을 나타내기 위함 result_time = result_minute / 60; result_minute %= 60; System.out.printf("총 걸린 시간 : %d시간 %d분\n",result_time,result_minute); } else System.out.printf("총 걸린 시간 : %d분\n",result_minute); sc.close(); } } | cs |