Ⅰ. 2차원 배열
1. 이차열 배열 선언
▷ 값 입력 첫 번째 방법
int[][] pointArr = new int[4][3];
-- 4행 3열인 배열을 만든다.
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
[2][0] [2][1] [2][2]
[3][0] [3][1] [3][2]
-- 행과 열에 알아보기 쉽게 숫자를 붙인 것이지 값을 입력한 게 아니다. 초기치(== 0)으로 저장되어 있다.
pointArr[0][0] = 10;
pointArr[0][1] = 20;
pointArr[0][2] = 30;
pointArr[1][0] = 40;
pointArr[1][1] = 50;
pointArr[1][2] = 60;
pointArr[2][0] = 70;
pointArr[2][1] = 80;
pointArr[2][2] = 90;
pointArr[3][0] = 100;
pointArr[3][1] = 110;
pointArr[3][2] = 120;
-- 배열에 값을 입력한다.
System.out.println("pointArr.length => " + pointArr.length);
System.out.println("pointArr[0].length => " + pointArr[0].length);
System.out.println("pointArr[1].length => " + pointArr[1].length);
-- 이차원배열명.length : 행의 길이가 나온다.
-- 이차원배열명[행의 index].length : 그 행에 존재하는 열의 길이가 나온다.
▷결과
pointArr.length => 4
pointArr[0].length => 3
pointArr[1].length => 3
for(int i=0; i<pointArr.length; i++) {
for(int j=0; j<pointArr[i].length; j++) {
String str = (j<pointArr[i].length-1)?",":" ";
System.out.print(pointArr[i][j]+str);
}
System.out.println("");
}
▷결과
10,20,30
40,50,60
70,80,90
100,110,120
▷ 열의 길이가 같지 않을 때, 따로 지정해 주는 방법
int[][] jumsuArr = new int[4][];
jumsuArr[0] = new int[3];
jumsuArr[1] = new int[2];
jumsuArr[2] = new int[3];
jumsuArr[3] = new int[3];
jumsuArr[0][0] = 10;
jumsuArr[0][1] = 20;
jumsuArr[0][2] = 30;
jumsuArr[1][0] = 40;
jumsuArr[1][1] = 50;
jumsuArr[2][0] = 70;
jumsuArr[2][1] = 80;
jumsuArr[2][2] = 90;
jumsuArr[3][0] = 100;
jumsuArr[3][1] = 110;
jumsuArr[3][2] = 120;
for(int i=0; i<jumsuArr.length; i++) {
for(int j=0; j<jumsuArr[i].length; j++) {
String str = (j<jumsuArr[i].length-1)?",":" ";
System.out.print(jumsuArr[i][j]+str);
}
System.out.println("");
}
▷결과
10,20,30
40,50
70,80,90
100,110,120
▷ 값 입력 두 번째 방법
-- 첫 번째 방법보다 더 간단하게 할 수 있다.
int[][] valArr = {{10,20,30},
{40,50},
{70,80,90},
{100,110,120} };
for(int i=0; i<valArr.length; i++) { // 4행
for(int j=0; j<valArr[i].length; j++) {
String str = (j<valArr[i].length-1)?",":" ";
System.out.print(valArr[i][j]+str);
}
System.out.println("");
}
▷결과
10,20,30
40,50
70,80,90
100,110,120
Ⅱ. String 클래스 메소드
-- char 문자열.charAt(int index) : index 위치에 있는 문자(char)를 반환
String str = "안녕하세요? 만나서 반갑습니다. Good Day 되세요 ^^";
char ch = str.charAt(2);
System.out.println(ch);
-- int index는 0부터 시작한다. ex > 안: 0, 녕:1, 하:2
▷결과
하
System.out.println("== 1. char 문자열.charAt(int index) == ");
for(int i=0; i<str.length(); i++) {
System.out.println(str.charAt(i));
}
-- 글자 하나하나를 읽어와서 출력해 준다.
▷결과
안
녕
하
세
요
?
-- 뒤에 "만나서 반갑습니다. Good Day 되세요 ^^" 마찬가지로 출력된다. (길어서 생략)
-- char[] 문자열.toCharArray() : 문자열을 문자형(char)배열 타입으로 변환
char[] charArr = str.toCharArray();
for(int i=0; i<charArr.length; i++) {
System.out.println(charArr[i]);
}
▷결과
위와 동일
-- String 문자열.substring(int beginIndex, int end Index) : 문자열 beginIndex 위치에서부터 endIndex 위치 앞까지만 문자열을 반환
System.out.println(str.substring(7, 13));
▷결과
만나서 반갑
-- String 문자열.substring(int beginIndex) : 문자열 beginIndex 위치에서부터 끝까지 문자열을 반환
System.out.println(str.substring(7));
▷결과
만나서 반갑습니다. Good Day 되세요 ^^
String[] 문자열.split("구분자") : 문자열을 구분자로 잘라서 문자열 배열 타입으로 반환
String food = "돌솥비빔밥,샌드위치,라면,김치오므라이스,돈까스";
String[] foodArr = food.split(",");
for(int i=0; i<foodArr.length; i++) {
System.out.println(foodArr[i]);
}
▷결과
돌솥비빔밥
샌드위치
라면
김치오므라이스
돈까스
String food2 = "돌솥비빔밥 샌드위치 라면 김치오므라이스 돈까스";
String[] foodArr2 = food2.split("\t");
for(int i=0; i<foodArr2.length; i++) {
System.out.println(foodArr2[i]);
}
▷결과
위와 동일
System.out.println("____________________________________________\n");
String food3 = "골뱅이.치킨.피자.햄버거.오렌지";
String[] foodArr3 = food3.split(".");
for(int i=0; i<foodArr3.length; i++) {
System.out.println(foodArr3[i]);
}
▷결과
결과 나오지 않음
-- 구분자를 인식 못 할 경우가 있기 때문에 구분자 앞에 \\ 써야 확실하게 인식한다.
-- 구분자가 여러 개일 경우
String food4 = "골뱅이,치킨.피자 햄버거,오렌지 콜라";
String[] foodArr4 = food4.split("\\,|\\.|\\t|\\ ");
for(int i=0; i<foodArr4.length; i++) {
System.out.println(foodArr4[i]);
}
▷결과
골뱅이
치킨
피자
햄버거
오렌지
콜라
-- String.join(구분자, 문자열배열명) : 문자열배열을 구분자로 합쳐서 한 개의 문자열로 반환
String[] nameArr = {"한석규","두석규","세석규","네석규","오석규"};
String names = String.join("-", nameArr);
System.out.println(names);
▷결과
한석규-두석규-세석규-네석규-오석규
-- 문자열.replaceAll(변경대상문자열, 새로이 변경될 문자열) : 문자열에서 변경대상문자열을 모두 새로이 변경될 문자열로 변환
names = names.replaceAll("석규", "SeokGyu");
System.out.println(names);
▷결과
한SeokGyu-두SeokGyu-세SeokGyu-네SeokGyu-오SeokGyu
-- 문자열.replaceFirst(변경대상문자열, 새로이 변경될 문자열) : 문자열에서 변경대상문자열 중 첫 번째만 새로이 변경될 문자열로 변환해 준다
names = names.replaceFirst("SeokGyu", "석규");
System.out.println(names);
▷결과
한석규-두SeokGyu-세SeokGyu-네SeokGyu-오SeokGyu
fileNameArr 에서 ".txt"로 끝나는 문자만 출력해 보자.
-- boolean 문자열.endsWith(찾고자하는 문자열)
-- return type은 boolean
String[] fileNameArr = {"안녕.hwp", "GoodMorning.txt", "행복.txt", "안녕하세요.xls"};
for(int i=0; i<fileNameArr.length; i++) {
if(fileNameArr[i].endsWith(".txt")) {
System.out.println(fileNameArr[i]);
}
}
▷결과
GoodMorning.txt
행복.txt
fileNameArr 에서 "안녕"으로 시작하는 문자열만 출력해 보자.
for(int i=0; i<fileNameArr.length; i++) {
if(fileNameArr[i].startsWith("안녕")) {
System.out.println(fileNameArr[i]);
}
}
▷결과
안녕.hwp
안녕하세요.xls
-- String 문자열.toUpperCase() : 어떠한 문자열의 영문 소문자를 전부 대문자로 변환
String str1 = "My Name is Tom";
System.out.println(str1.toUpperCase());
▷결과
MY NAME IS TOM
-- String 문자열.toLowerCase() : 어떠한 문자열의 영문 대문자를 전부 소문자로 변환
String str2 = "My Name is Tom";
System.out.println(str2.toLowerCase());
▷결과
my name is tom
-- Boolean 문자열.equals(\"비교대상문자열\")
String str3 = "MY NAME IS TOM";
String str4 = "my name is tom";
System.out.println(str3.equals(str4));
▷결과
false
-- Boolean 문자열.equalsIgnoreCase(\"비교대상문자열\")
String str3 = "MY NAME IS TOM";
String str4 = "my name is tom";
System.out.println(str1.equalsIgnoreCase(str2));
▷결과
true
-- printf
int a = 123;
float f1 = 4.567F;
String str5 = "좋은 하루 되세요~";
System.out.printf("정수 a 는 %d 이고, 실수 f1 는 %f 이고, 문자열 str5 는 %s 입니다.",a,f1,str5);
-- %d 는 정수, %f 는 실수, %s 는 문자열을 출력한다.
-- %f(실수)는 double도 가능하다.
▷결과
정수 a 는 123 이고, 실수 f1 는 4.567000 이고, 문자열 str5 는 좋은 하루 되세요~ 입니다.
텍스트 추가
Lotto 만들기
-- 사용자 입력 번호 6개와 랜덤 로또 당첨 번호 6개를 비교하여 당첨 개수에 따라 등수가 달라지는 프로그램이다.
import java.util.Random;
import java.util.Scanner;
public class MainLotto {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] userNumArr = new String[6];
for(int i=0; i<userNumArr.length; i++) {
System.out.print("▷로또번호 입력"+(i+1)+" => ");
userNumArr[i] = sc.nextLine();
}
//////////////// 로또 당첨 번호 뽑기 시작 /////////////////////
int[] ballArr = new int[45];
int[] tempArr = new int[5]; // 기존에 뽑았던 방번호를 기억시켜두는 공간
for(int i=0; i<ballArr.length; i++) {
ballArr[i] = i+1; // 배열의 방마다 데이터 입력하기
// 데이터값은 1~45
}
for(int i=0; i<tempArr.length; i++) {
tempArr[i] = -1;
}
String result = ""; // 랜덤하게 뽑은 공의 데이터 값(1~45)을 보여주기 위한 용도
Random rnd = new Random();
outer:
for(int i=0; i<6; i++) {
int idx = rnd.nextInt(44-0+1)+0; // 방번호
for(int j=0; j<tempArr.length; j++) {
if(tempArr[j] == idx) { // 이미 9를 뽑았는데 9를 또 뽑으면 어떻게 할지
i--; // 위에서 시도할 횟수를 다시 한번 주어야 한다.
// 해주지 않으면 6번 뽑아야 하는데 중복 될수록 횟수가 1씩 줄어든다.
continue outer; // 새로 random하게 뽑을 수 있도록 위의 for문부터 다시 할 수 있도록 continue; 해야 한다.
}
} // end of for(j<tempArr.length)
if(i<5)
tempArr[i] = idx; // 뽑은 공의 방번호(indxe 번호)를 기억시켜둔다.
String str = (i<5)?", ":"\n";
result += ballArr[idx]+str;
} // end of for(int<6) ----------------------
System.out.println("로또 1등 당첨번호 : "+result);
////////////////로또 당첨 번호 뽑기 종료 /////////////////////
int cnt=0;
String[] resultArr = result.split(", ");
for(int i=0; i<userNumArr.length; i++) {
for(int j=0; j<resultArr.length; j++) {
if(userNumArr[i].equals(resultArr[j])) {
cnt++;
}
} // end of for(내부)--------------
} // end of for(외부)--------
switch (cnt) {
case 0:
System.out.println("당첨 해당 사항 없습니다.");
break;
case 1:
System.out.println("6등");
break;
case 2:
System.out.println("5등");
break;
case 3:
System.out.println("4등");
break;
case 4:
System.out.println("3등");
break;
case 5:
System.out.println("2등");
break;
default:
System.out.println("1등!");
}
sc.close();
}
Ⅲ. Calendar
-- Date 클래스 보다 조금더 향상시켜서 나온 것이 Calendar 클래스이다.
-- 간단한 날짜표현에는 Date 클래스를 사용하는 것이 더 나을 수 있으며, 두 개 날짜사이의 날짜연산을 할 경우에는 메소드기능이 더 많이 추가된
Calendar 클래스를 사용하는 것이 나을 수 있다.
Calendar currentDate = Calendar.getInstance();
-- 현재 날짜와 시간을 얻어온다.
int year = currentDate.get(Calendar.YEAR);
-- 현재 년도를 얻어온다.
int month = currentDate.get(Calendar.MONTH);
String strMonth = month<10?"0"+month:String.valueOf(month);
-- 현재 월을 얻어온다.
-- 주의해야할 것은 get(Calendar.MONTH)로 얻어오는 값의 범위가 1~12가 아닌, 0~11 이라는 것이다.
-- get(Calendar.MONTH)로 얻어오는 값이 0이면 1월을 의미하고 11이면 12월을 의미한다.
-- 그러므로 현재월을 표현하려면 ( currentDate.get(Calendar.MONTH) + 1 ) 으로 해야한다.
int month2 = currentDate.get(Calendar.MONTH)+1;
String strMonth2 = month2<10?"0"+month2:String.valueOf(month2);
-- 괄호없이 currentDate.get(Calendar.MONTH) + 1로 하면 이상한 값이 나오므로 괄호 유무를 주의해야 한다.
-- String.valueOf()는 int를 String으로 변환해 준다.
-- "0"+month2은 문자열+정수이므로 자동적으로 String으로 변환된다.
int day = currentDate.get(Calendar.DATE);
String strDay = day<10?"0"+day:String.valueOf(day);
System.out.println("이 달의 몇 일: " + currentDate.get(Calendar.DATE));
System.out.println("이 달의 몇 일: " + currentDate.get(Calendar.DAY_OF_MONTH));
System.out.println("이 달의 몇 일: " + strDay);
System.out.println("이 해의 몇 일: " + currentDate.get(Calendar.DAY_OF_YEAR));
-- Calendar.DATE 와 Calendar.DAY_OF_MONTH 는 같다.
▷ 결과
이 달의 몇 일: 30
이 달의 몇 일: 30
이 달의 몇 일: 30
이 해의 몇 일: 242
System.out.println("요일(1~7, 1:일요일): " + currentDate.get(Calendar.DAY_OF_WEEK));
System.out.println("이 달의 몇 째 요일: " + currentDate.get(Calendar.DAY_OF_WEEK_IN_MONTH));
▷ 결과
요일(1~7, 1:일요일): 6
이 달의 몇 째 요일: 5
String dayname = "";
switch (currentDate.get(Calendar.DAY_OF_WEEK)) {
case 1:
dayname = "일";
break;
case 2:
dayname = "월";
break;
case 3:
dayname = "화";
break;
case 4:
dayname = "수";
break;
case 5:
dayname = "목";
break;
case 6:
dayname = "금";
break;
case 7:
dayname = "토";
break;
}
System.out.println("오늘은 " + dayname + "요일 입니다.");
-- 1:일요일, 2:월요일, 3:화요일, 4:수요일, 5:목요일, 6:금요일, 7:토요일
▷ 결과
오늘은 금요일 입니다.
System.out.println("오전_오후(0:오전, 1:오후): " + currentDate.get(Calendar.AM_PM));
▷ 결과
오전_오후(0:오전, 1:오후): 1
System.out.println("시간(0~11): " + currentDate.get(Calendar.HOUR));
System.out.println("시간(0~23): " + currentDate.get(Calendar.HOUR_OF_DAY));
System.out.println("분(0~59): " + currentDate.get(Calendar.MINUTE));
System.out.println("초(0~59): " + currentDate.get(Calendar.SECOND));
System.out.println("1000분의 1초(0~999): " + currentDate.get(Calendar.MILLISECOND));
▷ 결과
시간(0~11): 0
시간(0~23): 12
분(0~59): 43
초(0~59): 9
1000분의 1초(0~999): 933
System.out.println("TimeZone(-12~+12): " + (currentDate.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
▷ 결과
TimeZone(-12~+12): 9
현재 시각을 나타내 보자.
▷ 첫 번째 방법
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("현재시각 => " + dateFormat.format(currentDate.getTime()));
▷ 결과
현재시각 => 2019-08-30 12:43:09
▷ 두 번째 방법
-- Date 클래스를 사용하여 현재시각 나타내기
SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("현재시각 1 => " + sdformat.format(now));
▷결과
현재시각 1 => 2019-08-30 14:13:07
▷ 세 번째 방법
String currentTime = String.format("%tF %tT %tA",now,now,now);
System.out.println("현재시각 2 => "+currentTime);
▷결과
현재시각 2 => 2019-08-30 14:13:07 금요일
내일 시각을 나타내 보자.
currentDate.add(Calendar.DATE, 1);
System.out.println("내일시각 => " + dateFormat.format(currentDate.getTime()));
▷ 결과
내일시각 => 2019-08-31 12:43:09
참고 ▷▷
날짜 타입 format |
설명 |
날짜 타입 format |
설명 |
%tF |
날짜를 yyyy-mm-dd 형식으로 포맷해주는 것 |
%td |
일수를 1~31 로 출력 |
%tT |
날짜의 시각을 HH:MM:SS 형식으로 포맷해주는 것 |
%te |
%td와 동일함 |
%tp |
오전, 오후를 출력 |
%tk |
시간을 0~23 으로 출력 |
%tA |
요일명 출력 |
%tl |
시간을 1~12 으로 출력 |
%tY |
4자리 년도만 출력 |
%tM |
분을 00~59 으로 출력 |
%tB |
월의 이름(January, February ...)출력 |
%tS |
초를 00~59 으로 출력 |
%tm |
월의 01,02,03 ~~ 10,11,12 로 출력 |
%tZ |
타임존을 출력(한국은 KST) |
Ⅳ. OOP(Object Oriented Programming)
1. OOP의 4가지 특징
1) 상속성(Inheritance) : 클래스의 재사용과 소스 코드의 중복제거를 목적으로 하는 기술
2) 추상화(Abstraction) : 프로그램이 필요로 하는 실제 데이터들을 모델링하는 기술
3) 캡슐화(EnCapsulation) : 객체지향의 가장 중요한 데이터 보호 기술
4) 다형성(Polymorphism) : 상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술
-- 일반적인 의미의 추상화란 어떤 물체(object)에서 주된 특징을 부각시켜 표현하고, 나머지 부분은 과감하게 생략하는것을 말한다.
-- 어떤 하나의 물체를 대표하는 속성(명사, 멤버변수)과 기능(동사, 메소드)을 추출해내는 것을 객체지향 프로그래밍(OOP)에서
"추상화" 라고 한다.
-- 예를 들어, 구인구직 프로그래밍을 만든다고 하자. 구직자 클래스의 속성을 정할 때 발 사이즈나 혈액형은 구직자에 포함된 속성이지만 구직을 할 때에는 필요하지 않는 속성이다. 따라서 구직 프로그래밍을 만드는 데에 필요한 속성과 기능을 추출하는 과정이 필요하다.
'수업내용' 카테고리의 다른 글
[Day11][Java] 캡슐화 / 다형성 (0) | 2019.09.03 |
---|---|
[Day10][Java] 상속 / 구인구직 관리 프로그램 (0) | 2019.09.02 |
[Day8][Java] 가위바위보 게임 / 숫자 맞히는 게임 / 레이블 / 배열 / 확장된 for문 / Random / 로또 당첨번호 / 버블 정렬 (0) | 2019.09.01 |
[Day7][Java] while문 / do~while문 / Math.random / equals / 가위바위보 프로그램 (0) | 2019.09.01 |
[Day6][Java] For 문제풀이 / 별 찍기 (0) | 2019.09.01 |